gpt4 book ai didi

scala - Spray:将 RequestContext 引入范围会导致超时

转载 作者:行者123 更新时间:2023-12-02 17:49:59 26 4
gpt4 key购买 nike

嗨,scala 和喷雾人!

我在从 RequestContext 中提取 HTTP“Accept” header 并对其进行匹配时遇到了一个恼人的小问题。在像这样的正常路线上:

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。事实上,只有当您想编写自定义指令时才需要它。通常可以使用预定义指令之一来处理常见任务和提取常用数据位。

看来您想要做的是手动内容类型协商。事实上,您不必手动执行此操作,因为 Spray 会自动为常见数据结构执行内容类型。您的示例可以缩短为

get {
complete("Hello World!")
}

当使用字符串调用 complete 时,响应将始终为 text/plain 类型。如果客户端发送的请求带有不接受 text/plainAccept header ,则该请求将被服务器拒绝。

如果您想要自定义可从 Scala 数据类型提供的内容类型,您需要提供自定义编码器。请参阅the documentation关于如何实现这一目标。

回答您原来的问题为什么添加 context => 会导致请求超时:这是因为预定义指令的类型已经是 RequestContext => Unit。所以,写

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

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

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

因此,如果您仅手动添加 ctx =>,但不添加 apply 调用,则传入请求永远不会送入内部路由,因此永远不会完全的。编译器不会捕获此类错误,因为路由的类型是 RequestContext => Unit,因此带有 apply 调用的变体和不带有 apply 调用的变体都是有效的。我们are going to improve this future 。

参见the documentation有关如何构建路线的更多信息。

最后,如果您需要提取 header 或其值,您可以使用 predefined HeaderDirectives 之一这大大简化了请求 header 的处理。

关于scala - Spray:将 RequestContext 引入范围会导致超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20797713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com