我是一名 Java 工程师,最近在慢慢学习 Scala。我遇到了一些使用 Dispatch 发出简单 GET 请求的示例代码:
val request = url("http://somesite.com")
val result = Http( request OK as.String)
问题是……我不太明白这里发生了什么。首先,Http是一个类吗?或方法?其次,传递给它的参数是怎么回事?我想也许我们传递了三个参数,Scala 允许我们省略逗号。但是当我尝试添加逗号时,出现了编译错误,所以这是不对的。
我确信这对精通 Scala 的人来说是有意义的,但我还没有到那里,它让我感到困惑。我试过在网上寻找文档,但没有发现任何有用的东西。
最佳答案
这是一个(痛苦的)显式版本,删除了所有语法糖:
import dispatch.{ Defaults, Http, Req, as, implyRequestHandlerTuple, url }
import scala.concurrent.Future
val request: Req = url.apply("http://somesite.com")
val result: Future[String] =
Http.apply(
implyRequestHandlerTuple(request).OK[String](as.String)
)(Defaults.executor)
url
是一个带有 apply
的单例对象返回 Req
实例的方法案例类。 Http
也是一个单例对象,它还有一个apply
方法。 Http
的 apply
采用两个参数列表——第一个采用单个 Req
参数,第二个采用执行上下文(您可以将其视为 Scala 版本的 Java 版本 Executor
)。implyRequestHandlerTuple
是一种隐式方法。 Req
没有 OK
方法,但编译器知道 RequestHandlerTupleBuilder
class 这样做(并且它需要适当的参数——在这种情况下是一个从 Response
到某种类型的函数),所以在原始版本中它会自动应用这个方法来进行从 Req
的转换.最后,
as
是一个包含 String
的包单例对象。此对象扩展 Response => String
(这是 Function1[Response, String]
的更多语法糖。我们的 OK
方法正在寻找一个采用 Response
的函数,所以我们在那里很好。最后你得到了一个
Future[String]
.有很多other places阅读 future ,所以我不会在这里详细介绍,但简而言之,这个值可能不满意(即您仍在等待结果),或者对失败感到满意(在网络错误等情况下)。 ),或成功满足(在这种情况下,它将包含响应正文)。
关于Scala 调度示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28143903/