mapResponse

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

§Example: Override status

  1. final Route route = mapResponse(
  2. response -> response.withStatus(StatusCodes.BAD_GATEWAY),
  3. () -> complete("abc")
  4. );
  5.  
  6. // tests:
  7. testRoute(route).run(HttpRequest.GET("/abcdef?ghi=12"))
  8. .assertStatusCode(StatusCodes.BAD_GATEWAY);

§Example: Default to empty JSON response on errors

  1. class ApiRoute {
  2.  
  3. private final ActorSystem system;
  4.  
  5. private final LoggingAdapter log;
  6.  
  7. private final HttpEntity nullJsonEntity =
  8. HttpEntities.create(ContentTypes.APPLICATION_JSON, "{}");
  9.  
  10. public ApiRoute(ActorSystem system) {
  11. this.system = system;
  12. this.log = Logging.getLogger(system, "ApiRoutes");
  13. }
  14.  
  15. private HttpResponse nonSuccessToEmptyJsonEntity(HttpResponse response) {
  16. if (response.status().isSuccess()) {
  17. return response;
  18. } else {
  19. log.warning(
  20. "Dropping response entity since response status code was: " + response.status());
  21. return response.withEntity((ResponseEntity) nullJsonEntity);
  22. }
  23. }
  24.  
  25. /** Wrapper for all of our JSON API routes */
  26. private Route apiRoute(Supplier<Route> innerRoutes) {
  27. return mapResponse(this::nonSuccessToEmptyJsonEntity, innerRoutes);
  28. }
  29. }
  30.  
  31. final ApiRoute api = new ApiRoute(system());
  32.  
  33. final Route route = api.apiRoute(() ->
  34. get(() -> complete(StatusCodes.INTERNAL_SERVER_ERROR))
  35. );
  36.  
  37. // tests:
  38. testRoute(route).run(HttpRequest.GET("/"))
  39. .assertEntity("{}");