Scala中的同步HTTP调用

时间:2014-08-18 09:48:43

标签: scala http

我需要执行单个同步HTTP POST调用:使用一些数据创建HTTP Post请求,连接到服务器,发送请求,接收响应以及关闭连接。释放用于执行此调用的所有资源非常重要。

现在我使用Apache Http Client在Java中完成它。如何使用Scala dispatch库?

2 个答案:

答案 0 :(得分:8)

这样的事情应该有用(虽然没有测试过)

import dispatch._, Defaults._
import scala.concurrent.Future
import scala.concurrent.duration._

def postSync(path: String, params: Map[String, Any] = Map.empty): Either[java.lang.Throwable, String] = {
  val r = url(path).POST << params
  val future = Http(r OK as.String).either
  Await.result(future, 10.seconds)
}

(我在这个例子中使用https://github.com/dispatch/reboot

您明确等待未来的结果,即String或例外。

并像

一样使用它
postSync("http://api.example.com/a/resource", Map("param1" -> "foo") match {
  case Right(res) => println(s"Success! Result was $res")
  case Left(e) => println(s"Woops, something went wrong: ${e.getMessage}")
}

答案 1 :(得分:0)

我们都知道Scala的重要功能是异步。所以有很多解决方案可以告诉人们如何进行HTTP CALL ASYNC。例如,dispatch是异步http库。但是在这里我们关心如何通过scala实现sync http调用。我用一个技巧来做到这一点。

这是我的解决方案:

val svc = url(#your_url)
val response = Http(svc OK dispatch.as.json4s.Json)
response onComplete {
    // do_what_you_want
}
while(!response.isCompleted) {
    Thread.sleep(1000)
}
// return_what_you_want

所以在这里我使用“isCompleted”来帮助我等到完成。因此,将异步转换为同步是一种技巧。