mapResponse

mapResponse

§Signature

§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 Transforming the Response for similar directives.

§Example: Override status

  1. def overwriteResultStatus(response: HttpResponse): HttpResponse =
  2. response.copy(status = StatusCodes.BadGateway)
  3. val route = mapResponse(overwriteResultStatus)(complete("abc"))
  4.  
  5. // tests:
  6. Get("/abcdef?ghi=12") ~> route ~> check {
  7. status shouldEqual StatusCodes.BadGateway
  8. }

§Example: Default to empty JSON response on errors

  1. trait ApiRoutes {
  2. protected def system: ActorSystem
  3.  
  4. private val log = Logging(system, "ApiRoutes")
  5.  
  6. private val NullJsonEntity = HttpEntity(ContentTypes.`application/json`, "{}")
  7.  
  8. private def nonSuccessToEmptyJsonEntity(response: HttpResponse): HttpResponse =
  9. response.status match {
  10. case code if code.isSuccess => response
  11. case code =>
  12. log.warning("Dropping response entity since response status code was: {}", code)
  13. response.copy(entity = NullJsonEntity)
  14. }
  15.  
  16. /** Wrapper for all of our JSON API routes */
  17. def apiRoute(innerRoutes: => Route): Route =
  18. mapResponse(nonSuccessToEmptyJsonEntity)(innerRoutes)
  19. }
  20. val route: Route =
  21. apiRoute {
  22. get {
  23. complete(InternalServerError)
  24. }
  25. }
  26.  
  27. // tests:
  28. Get("/") ~> route ~> check {
  29. responseAs[String] shouldEqual "{}"
  30. }