喷涂路由404响应

dea*_*rne 16 scala akka spray

我有一个服务,它在Future中返回一个Option [ProductDoc](作为akka问)

我如何回应喷涂路线,以便有效的产品代表产品但是未知但形成良好的产品会返回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

    }
}
Run Code Online (Sandbox Code Playgroud)

我可以上班的唯一方法就是这种可憎的行为:

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
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

这肯定不是实现这一目标的正确方法吗?这似乎是一个非常简单的模式,必须已经被某人解决了!

jru*_*lph 17

Spray已经支持您的用例:默认情况下,选项值None被编组为a EmptyEntity.这可能是您在进行任何更改之前看到的内容:带有空文档的200.有一个指令可以将一个空文档转换为404,rejectEmptyResponse您可以将自己的行为部分包裹在路径中.

您的路线看起来就像这样:

  rejectEmptyResponse {
    path("products" / PathElement) { productID:String =>
      val productFuture = // same as before
      complete(productFuture)
    }
  }
Run Code Online (Sandbox Code Playgroud)

当然,您可以rejectEmptyResponse根据是否要用它包装更多的路径部分来放置路径.

更多信息: