9

我想发布到一个 URL,设置查询参数和标题,并在正文中传递一个原始字符串。然后我想做请求并获取输出字符串,以便我可以将其转换为 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)进行分支。

4

2 回答 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")

.secure如果您想使用 HTTPS,请在某处放一个。

你可以像这样得到一个 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 处理异步请求操作提供了非常有用的解释。


OP的补充:这一点为我完成了这个答案。这以一种简单的阻塞方式获得响应。

val response = Http(req)()
val body response.getResponseBody
于 2012-09-09T21:23:12.407 回答
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)
于 2012-09-09T20:18:01.543 回答