使用Spray映射所有响应的标头

时间:2015-01-23 02:51:55

标签: scala spray

我正在使用喷雾服务api。我正在尝试创建一个指令,为所有响应添加标题列表,包括拒绝和失败。我尝试了以下方法,但两者仅适用于成功的回复:

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

是否有适用于所有回复的等效构造?我想我可以定义自定义错误处理程序,但是,如果我错了,请纠正我,他们应该通过调用ctx.complete(...)来工作,因为它有副作用,我想我必须覆盖每个失败案例。我还没有找到一个可以简单地映射HttpResponses来添加标题的地方。

1 个答案:

答案 0 :(得分:0)

异常会将路由作为异常冒泡,直到它到达异常处理程序。而且您无法将标头添加到例外中。但是您可以在异常处理程序中重用指令。您可以通过在runRoute级别创建隐式ExceptionHandler来避免重复,使用您的指令为一般情况添加标头(所有异常)并将实际的异常到响应映射委托给内部模式匹配:

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