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)
      }
      }
    }
  }
}