Dispatch 0.9的基本使用方法

9
我想向一个URL进行POST请求,设置查询参数和头部,并在正文中传递原始字符串。然后,我想执行请求并获取输出字符串,以便将其转换为JSON。我还希望异常处理能够响应不同类型的错误(并处理重定向)。
但是,Dispatch 0.9文档不完整,与已记录版本API不兼容且非常古怪,因此我无法提供完整的解决方案。我被彻底卡住了,因此需要很多帮助。
这是我所能想到的,但设置查询参数很奇怪:
val solr = host("localhost", 8983)
val req  = solr / "update" / "json" 
    setQueryParameters( Map( "commit" -> "true")) 
    setHeader( "Content-type", "application/json")
    setBody( a)

但是设置查询参数却给我带来了一个棘手的错误:
<console>:14: error: type mismatch;
 found   : scala.collection.immutable.Map[java.lang.String,java.lang.String]
 required: com.ning.http.client.FluentStringsMap
       val req  = solr / "update" / "json"  setQueryParameters( Map( "commit" -> "true"))

请帮助完整设置请求:HTTPS,重定向,查询参数,头部和POST方法。

还需要帮助(同步执行,我想要这样)执行请求以获取主体(和头部),并根据响应代码(200、301、302、400、500)进行分支处理。

2个回答

15

你的理解并不算错。以下内容应该能够满足你的请求:

import dispatch._

val params = Map("commit" -> "true")
val headers = Map("Content-type" -> "application/json")

val solr = host("localhost", 8983)

val req = solr / "update" / "json" << a <<? params <:< headers
或者,不那么运算符式地说:
val req = url("http://localhost:8983/update/json").POST
  .setBody(a)
  .addQueryParameter("commit", "true")
  .addHeader("Content-type", "application/json")

如果您想使用HTTPS,请在其中某个地方添加.secure

可以通过以下方式获取一个Promise(本质上代表延迟请求操作的结果):

val result = Http(req OK as.String).either

然后像这样使用它,例如:

result() match {
  case Right(content)         => println("Content: " + content)
  case Left(StatusCode(404))  => println("Not found")
  case Left(StatusCode(code)) => println("Some other code: " + code.toString)
}

虽然我同意0.9版文档在某些地方比较缺乏,但它确实提供了一个非常有用的解释,介绍如何使用promise处理异步请求操作。


楼主的补充: 这一部分为我完成了这个答案。它以简单且阻塞的方式获取响应。

val response = Http(req)()
val body response.getResponseBody

它应该在某个地方有ScalaDoc文档。我从源代码构建了它,并将书签保存到本地目录,这很有帮助,但这样做也很糟糕。 - Daniel C. Sobral
如果我想一次添加多个查询参数,最好是像 Map("a" -> "b") 这样表达的方式,该怎么办? - Jesvin Jose
@aitchnyu:<<? Map(...) 版本适用于此。如果您尝试完全无操作符(即使使用0.9也会很不方便),则必须自己迭代这些对。 - Travis Brown
如何在for表达式中组合响应的模式匹配?for表达式异步处理结果,但在承诺上调用apply会阻塞线程,或者我漏掉了什么。 - Valentin V

0

在我使用Dispatch 0.9.1的简单用例中,我使用POST方法进行设置,如下所示:

val SERVICES_URL = "http://myhost/mycontext"

val postFields: Map[String, String] = ...
val request = url(SERVICES_URL) << postFields OK as.String
val post = Http(request)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接