我有一项服务,可在将来返回Option [ProductDoc](请客气地问)
我该如何在喷涂工艺中做出反应,以使有效的产品与一种产品相对应,而一个未知但结构良好的产品则返回404?
我希望代码填补这里的空白:
get {
path("products" / PathElement) { productID:String =>
val productFuture = (productService ? ProductService.Get(productID)).mapTo[Option[ProductDoc]]
// THE CODE THAT GOES HERE SO THAT
// IF PRODUCT.ISDEFINED RETURN PRODUCT ELSE REJECT
}
}
我上班的唯一途径就是憎恶这个:
get {
path(PathElement) { productID:String =>
val productFuture = (productService ? ProductService.Get(productID)).mapTo[Option[ProductDoc]]
provide(productFuture).unwrapFuture.hflatMap {
case x => provide(x)
} { hResponse:shapeless.::[Option[ProductDoc], HNil] =>
hResponse.head match {
case Some(product) => complete(product)
case None => reject
}
}
}
}
当然,这不是正确的方法吗?这似乎是一个非常简单的模式,必须已经有人解决了!
最佳答案
Spray已经支持您的用例:默认情况下,选项值None
被编组为EmptyEntity
。这可能是您进行任何更改之前所看到的:200的文档为空。有一个指令可将空文档转换为404 rejectEmptyResponse
,您可以将其包裹在需要此行为的部分路线中。
您的路线将如下所示:
rejectEmptyResponse {
path("products" / PathElement) { productID:String =>
val productFuture = // same as before
complete(productFuture)
}
}
当然,您可以将
rejectEmptyResponse
放入路径中,具体取决于是否要包装更多的路径零件。更多信息:
https://github.com/spray/spray/blob/master/spray-routing/src/main/scala/spray/routing/directives/MiscDirectives.scala#L117
http://spray.io/documentation/spray-routing/key-concepts/rejections/#empty-rejections。
关于scala - 喷涂路线404响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15347088/