映射 headers 用于使用 Spray 的所有响应

Map headers for all responses using Spray

我正在使用喷剂为 api 服务。我正在尝试创建一个指令以将 headers 列表添加到所有响应中,包括拒绝和失败。我尝试了以下方法,但两者都只对成功响应有效:

val impl1: Directive0 = respondWithSingletonHeaders(myHeaderList)
val impl2: Directive0 = mapRequestContext { ctx =>
    ctx.withHttpResponseHeadersMapped { headers =>
      myHeaderList ::: headers
    }
  }

是否有适用于所有响应的等效结构?我想我可以定义自定义错误处理程序,但是,如果我错了,请纠正我,它们应该通过调用 ctx.complete(...) 来工作,因为它有副作用,我想我将不得不重写每个失败案例。我还没有找到可以简单地映射 HttpResponses 以添加 headers.

的地方

异常将作为异常在路由中冒泡,直到它到达异常处理程序。而且您不能将 headers 添加到异常中。但是你可以 re-use 你的异常处理程序中的指令。您可以通过在 runRoute 级别创建隐式 ExceptionHandler 来避免重复,使用指令为一般情况(所有异常)添加 headers 并将实际 exception-to-response 映射委托给内部模式匹配:

implicit def exceptionHandler: ExceptionHandler = ExceptionHandler {
  case exception => impl1 {
    exception match {
      case e: IllegalArgumentException => ctx =>
        ctx.complete(BadRequest)
      ...
      case e: Exception => ctx =>
        ctx.complete(InternalServerError)
    }
  }
}