Jes*_*ose 9 scala scala-dispatch
我想POST到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)
Run Code Online (Sandbox Code Playgroud)
但设置查询参数给我一个严重的错误:
<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"))
Run Code Online (Sandbox Code Playgroud)
请帮助完全设置请求:HTTPS,重定向,查询参数,标题和POST方法.
还帮助(同步,我希望它这样)执行请求以获取正文(和标题)和分支取决于响应代码(200,301,302,400,500).
Tra*_*own 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
Run Code Online (Sandbox Code Playgroud)
或者,减少操作性:
val req = url("http://localhost:8983/update/json").POST
.setBody(a)
.addQueryParameter("commit", "true")
.addHeader("Content-type", "application/json")
Run Code Online (Sandbox Code Playgroud)
抛出.secure,如果你想使用HTTPS在那里的某个地方.
您可以获得一个promise(基本上代表延迟请求操作的结果),如下所示:
val result = Http(req OK as.String).either
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它,例如:
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)
}
Run Code Online (Sandbox Code Playgroud)
虽然我同意0.9文档在某些地方很稀疏,但它确实提供了一个非常有用的解释,说明如何使用promises处理异步请求操作.
OP的补充:这一点为我完成了这个答案.这会以简单的阻塞方式获得响应.
val response = Http(req)()
val body response.getResponseBody
Run Code Online (Sandbox Code Playgroud)