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

scala – Spray:在范围内引入RequestContext导致超时

发布时间:2020-12-16 09:49:29 所属栏目:安全 来源:网络整理
导读:嗨斯卡拉和喷人! 从RequestContext中提取HTTP“Accept”标头并在其上进行匹配,我遇到了一个小问题.在这样的正常路线上: get { respondWithMediaType(`text/plain`) { complete ( "Hello World!" ) }} 它就像一个魅力.但每当我将上下文带入范围时(如the doc
嗨斯卡拉和喷人!

从RequestContext中提取HTTP“Accept”标头并在其上进行匹配,我遇到了一个小问题.在这样的正常路线上:

get {
  respondWithMediaType(`text/plain`) {
    complete ( "Hello World!" )
  }
}

它就像一个魅力.但每当我将上下文带入范围时(如the documentation for directives中所示):

get { context => {
  respondWithMediaType(`text/plain`) {
    complete ( "Hello World!" )
  }
} }

结果将成为以下错误消息:

The server was not able to produce a timely response to your request.

我对Spray很新,但对我来说看起来很奇怪,将一个(否则是隐式的)对象带入范围会产生如此奇怪的副作用.你们中有谁知道发生了什么事吗?

解决方法

很少需要直接访问RequestContext.实际上,如果要编写自定义指令,则只需要它.通常可以使用预定义指令之一来处理常见任务和提取通常的数据位.

看来你想做的是手动内容类型协商.实际上,您不必手动执行此操作,因为喷涂会针对常见数据结构自动执行内容类型.你的例子可以缩短为

get {
  complete("Hello World!")
}

当使用字符串调用complete时,响应将始终为text / plain类型.如果客户端发送的请求带有不接受text / plain的Accept标头,则服务器已经拒绝了该请求.

如果要自定义可从Scala数据类型提供的各种内容类型,则需要提供自定义Marshaller.有关如何实现这一点,请参阅the documentation.

回答原始问题为什么要添加上下文=>使请求超时:这是因为预定义的指令已经是RequestContext =>类型;单元.所以,写作

respondWithMediaType(`text/plain`) {
  complete("Hello World!")
}

完全等同于(即自动扩展到)

ctx => respondWithMediaType(`text/plain`) {
  complete("Hello World!")
}.apply(ctx)

所以,如果你只添加ctx =>手动但不添加应用调用,传入的请求永远不会进入内部路由,因此永远不会完成.编译器不会捕获此类错误,因为路由的类型是RequestContext =>单位,因此变量with和没有apply调用的变量都是有效的.我们将来are going to improve this.

有关如何构建路由的详细信息,请参阅the documentation.

最后,如果您需要提取标题或其值,您可以使用predefined HeaderDirectives中的一个简化处理请求标题.

(编辑:李大同)

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

    推荐文章
      热点阅读