我正在使用喷雾服务api。我正在尝试创建一个指令,为所有响应添加标题列表,包括拒绝和失败。我尝试了以下方法,但两者仅适用于成功的回复:
val impl1: Directive0 = respondWithSingletonHeaders(myHeaderList)
val impl2: Directive0 = mapRequestContext { ctx =>
ctx.withHttpResponseHeadersMapped { headers =>
myHeaderList ::: headers
}
}
是否有适用于所有回复的等效构造?我想我可以定义自定义错误处理程序,但是,如果我错了,请纠正我,他们应该通过调用ctx.complete(...)来工作,因为它有副作用,我想我必须覆盖每个失败案例。我还没有找到一个可以简单地映射HttpResponses来添加标题的地方。
答案 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)
}
}
}