Scala - 如何在 http 请求中不使用未来

Posted

技术标签:

【中文标题】Scala - 如何在 http 请求中不使用未来【英文标题】:Scala - how to not use a future in http request 【发布时间】:2015-01-13 12:05:16 【问题描述】:

我正在关注这个使用调度库的 HTTP 请求的简单示例。

Dispatch tutorial

我想在不使用期货的情况下提出请求。我想等待回复。我怎样才能做到这一点?

我已经尝试通过删除未来声明和oncomplete

谢谢

import dispatch._, Defaults._
import scala.util.Success, Failure

object DispatchTest 
    def main (args: Array[String]) 
        val svc = url("http://www.wikipedia.org/");
        val response : Future[String] = Http(svc OK as.String)

        response onComplete 
            case Success(content) => 
                println("Successful response" + content)
            
            case Failure(t) => 
                println("An error has occurred: " + t.getMessage)
            
        
    


import dispatch._, Defaults._
import scala.util.Success, Failure

object DispatchTest 
    def main (args: Array[String]) 
        val svc = url("http://www.wikipedia.org/");
        val response : String = Http(svc OK as.String)
    

【问题讨论】:

如果 Dispatch API 没有提供,您可以使用 Await.result(...)Await.ready(...) 等待完成 - 两者都在 scala.concurrent.Await 中找到。然而,这不是线程的最佳用途,因为您正在创建一个线程块来等待结果。 【参考方案1】:

这应该是你需要的:阻塞当前线程直到响应返回。

import dispatch._

object DispatchBlocking extends App 
  val q = url("http://www.scala-lang.org/")
  val r = Http(q OK as.String)()
  println(r)

【讨论】:

^ 是的。你需要 .apply() 未来。 谢谢@Michal Ostruszka。我在val r = Http(q OK as.String)() 上收到错误unspecified value parameter executor。还有空括号 () 是什么意思?谢谢 试试val r = Http(q OK as.String) ; println( r() )。括号是 Dispatch 的特色。这是Await.Result( myFuture,forever)的简写 您使用哪个调度版本?

以上是关于Scala - 如何在 http 请求中不使用未来的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 使用超时重试HTTP请求

使用 curry howard 能够静态地确保两种类型在 scala 中不相等

如何使用Scala / Akka Http处理多个HTTP头

使用 Netty 和 Scala 演员的异步 http 请求

使用 Nodejs 在未来的准确时间发送 HTTP 请求

如何使用 Scala 在具有请求正文的 REST API 上执行 GET 请求?