加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 喷射路由404响应

发布时间:2020-12-16 09:32:29 所属栏目:安全 来源:网络整理
导读:我有一个服务,返回一个选项[ProductDoc]在未来(作为akka问) 如何在喷涂路线上进行响应,以便有效的产品与产品重新分配,但是未知但形成良好的产品会返回404? 我想让代码填补这里的差距: get { path("products" / PathElement) { productID:String = val p
我有一个服务,返回一个选项[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

    }
}

我可以上班的唯一办法就是这个可憎之物:

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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读