映射 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)
}
}
}
我正在使用喷剂为 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)
}
}
}