mapResponse
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<Route> 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("{}");