mapRouteResultFuture • Akka HTTP (original) (raw)
Signature
def mapRouteResultFuture(f: Future[RouteResult] => Future[RouteResult]): Directive0
Description
Asynchronous version of mapRouteResult.
It’s similar to mapRouteResultWith, however it’s Future[RouteResult] => Future[RouteResult]
Function<CompletionStage<RouteResult>, CompletionStage<RouteResult>>
instead of RouteResult => Future[RouteResult]
Function<RouteResult, CompletionStage<RouteResult>>
which may be useful when combining multiple transformations and / or wanting to recover
from a failed route result.
See Result Transformation Directives for similar directives.
Example
Scala
source`val tryRecoverAddServer = mapRouteResultFuture { fr => fr recover { case ex: IllegalArgumentException => Complete(HttpResponse(StatusCodes.InternalServerError)) } map { case Complete(res) => Complete(res.addHeader(Server("MyServer 1.0"))) case rest => rest } }
val route = tryRecoverAddServer { complete("Hello world!") }
// tests: Get("/") ~> route ~> check { status shouldEqual StatusCodes.OK header[Server] shouldEqual Some(Server("MyServer 1.0")) }`
Java
source`import static akka.http.javadsl.server.Directives.mapRouteResultFuture;
final Route route = mapRouteResultFuture(cr -> cr.exceptionally(t -> { if (t instanceof IllegalArgumentException) { return RouteResults.complete( HttpResponse.create().withStatus(StatusCodes.INTERNAL_SERVER_ERROR)); } else { return null; } }).thenApply(rr -> { if (rr instanceof Complete) { final HttpResponse res = ((Complete) rr).getResponse(); return RouteResults.complete( res.addHeader(Server.create(ProductVersion.create("MyServer", "1.0")))); } else { return rr; } }), () -> complete("Hello world!"));
// tests: testRoute(route).run(HttpRequest.GET("/")) .assertStatusCode(StatusCodes.OK) .assertHeaderExists(Server.create(ProductVersion.create("MyServer", "1.0")));`
Found an error in this documentation? The source code for this page can be found here. Please feel free to edit and contribute a pull request.