spray 中的便捷方法(即将成为 akka-http)创建一个 Location header w/ host port & contextRoot ?
convenience method in spray (soon to be akka-http) to create a Location header w/ host port & contextRoot ?
当我在我的 Spray 应用程序中通过 POST 创建一个 object 时,我想 return 一个 201 状态,连同一个位置 header新创建资源的绝对 URI(包括我的应用程序的主机端口和 contextRoot)
这是我的应用程序中的示例代码片段...
post {
respondWithHeaders(Location( fullyQualifiedUri("/movies"))) {
entity(as[MovieImpl]) { (movieToInsert: MovieImpl) => {
addMovies(movieToInsert)
complete("OK")
}
}
}
}
请注意,我现在必须将方法 'fullyQualifiedUri' 写入 return
一个带有主机、端口等的 URI。如果 Spray 能帮我做到这一点就好了
自动地。
旁注:
我认为让 Location header 包含新的绝对 URI
创建的资源使我的 REST API 的客户更容易(尽管似乎对此有各种各样的意见。)
提前感谢您提供的任何指导。
-克里斯
要构建 URI,您需要新创建资源的 ID。然后您可以使用 requestInstance
指令获取传入的请求 URI 并从中构建新的资源 URI。您还需要将 return 代码设置为 Created
以满足您的要求:
post {
requestInstance { request =>
val movieId = ???
respondWithHeaders(Location( request.uri.withPath(request.uri.path / movieId))) {
entity(as[MovieImpl]) { (movieToInsert: MovieImpl) => {
addMovies(movieToInsert)
complete(StatusCodes.Created)
}
}
}
}
}
当我在我的 Spray 应用程序中通过 POST 创建一个 object 时,我想 return 一个 201 状态,连同一个位置 header新创建资源的绝对 URI(包括我的应用程序的主机端口和 contextRoot)
这是我的应用程序中的示例代码片段...
post {
respondWithHeaders(Location( fullyQualifiedUri("/movies"))) {
entity(as[MovieImpl]) { (movieToInsert: MovieImpl) => {
addMovies(movieToInsert)
complete("OK")
}
}
}
}
请注意,我现在必须将方法 'fullyQualifiedUri' 写入 return 一个带有主机、端口等的 URI。如果 Spray 能帮我做到这一点就好了 自动地。
旁注:
我认为让 Location header 包含新的绝对 URI 创建的资源使我的 REST API 的客户更容易(尽管似乎对此有各种各样的意见。)
提前感谢您提供的任何指导。 -克里斯
要构建 URI,您需要新创建资源的 ID。然后您可以使用 requestInstance
指令获取传入的请求 URI 并从中构建新的资源 URI。您还需要将 return 代码设置为 Created
以满足您的要求:
post {
requestInstance { request =>
val movieId = ???
respondWithHeaders(Location( request.uri.withPath(request.uri.path / movieId))) {
entity(as[MovieImpl]) { (movieToInsert: MovieImpl) => {
addMovies(movieToInsert)
complete(StatusCodes.Created)
}
}
}
}
}