mapResponse • Akka HTTP (original) (raw)
Signature
def mapResponse(f: HttpResponse => HttpResponse): Directive0
Description
The mapResponse
directive is used as a building block for Custom Directives to transform a response that was generated by the inner route. This directive transforms complete responses.
See also mapResponseHeaders or mapResponseEntity for more specialized variants and Response Transforming Directives for similar directives.
Example: Override status
Scala
source`def overwriteResultStatus(response: HttpResponse): HttpResponse = response.withStatus(StatusCodes.BadGateway) val route = mapResponse(overwriteResultStatus)(complete("abc"))
// tests: Get("/abcdef?ghi=12") ~> route ~> check { status shouldEqual StatusCodes.BadGateway }`
Java
source`import static akka.http.javadsl.server.Directives.mapResponse;
final Route route = mapResponse( response -> response.withStatus(StatusCodes.BAD_GATEWAY), () -> complete("abc") );
// tests: testRoute(route).run(HttpRequest.GET("/abcdef?ghi=12")) .assertStatusCode(StatusCodes.BAD_GATEWAY);`
Example: Default to empty JSON response on errors
Scala
source`` trait ApiRoutes { protected def system: ActorSystem
private val log = Logging(system, "ApiRoutes")
private val NullJsonEntity = HttpEntity(ContentTypes.application/json
, "{}")
private def nonSuccessToEmptyJsonEntity(response: HttpResponse): HttpResponse = response.status match { case code if code.isSuccess => response case code => log.warning("Dropping response entity since response status code was: {}", code) response.withEntity(NullJsonEntity) }
/** Wrapper for all of our JSON API routes */ def apiRoute(innerRoutes: => Route): Route = mapResponse(nonSuccessToEmptyJsonEntity)(innerRoutes) } val route: Route = apiRoute { get { complete(InternalServerError) } }
// tests: Get("/") ~> route ~> check { responseAs[String] shouldEqual "{}" } ``
Java
source`class ApiRoute {
private final ActorSystem system;
private final LoggingAdapter log;
private final HttpEntity nullJsonEntity = HttpEntities.create(ContentTypes.APPLICATION_JSON, "{}");
public ApiRoute(ActorSystem system) { this.system = system; this.log = Logging.getLogger(system, "ApiRoutes"); }
private HttpResponse nonSuccessToEmptyJsonEntity(HttpResponse response) { if (response.status().isSuccess()) { return response; } else { log.warning( "Dropping response entity since response status code was: " + response.status()); return response.withEntity((ResponseEntity) nullJsonEntity); } }
/** Wrapper for all of our JSON API routes */ private Route apiRoute(Supplier innerRoutes) { return mapResponse(this::nonSuccessToEmptyJsonEntity, innerRoutes); } }
final ApiRoute api = new ApiRoute(system());
final Route route = api.apiRoute(() -> get(() -> complete(StatusCodes.INTERNAL_SERVER_ERROR)) );
// tests: testRoute(route).run(HttpRequest.GET("/")) .assertEntity("{}");`
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.