我需要执行单个同步HTTP POST调用:使用一些数据创建HTTP Post请求,连接到服务器,发送请求,接收响应以及关闭连接。释放用于执行此调用的所有资源非常重要。
现在我使用Apache Http Client在Java中完成它。如何使用Scala dispatch
库?
答案 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”来帮助我等到完成。因此,将异步转换为同步是一种技巧。