mapResponse

mapResponse

シグネチャ

説明

`` mapResponse``ディレクティブは、内部ルートによって生成されたレスポンスを変換するための:ref:`Custom Directives`のビルディングブロックとして使用されます。 このディレクティブは完全なレスポンスを変換します。

同様のディレクティブは:ref:Response Transforming Directives`を、より特殊化したものは :ref:-mapResponseHeaders-` または mapResponseEntity を参照してください。

例: ステータスのオーバーライド

def overwriteResultStatus(response: HttpResponse): HttpResponse =
  response.copy(status = StatusCodes.BadGateway)
val route = mapResponse(overwriteResultStatus)(complete("abc"))

// tests:
Get("/abcdef?ghi=12") ~> route ~> check {
  status shouldEqual StatusCodes.BadGateway
}

例:エラー時に空のJSONレスポンスをデフォルトとする

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.copy(entity = 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 "{}"
}

Contents