我想从调度请求中获取正文和标题。怎么做?
val response = Http(request OK as.String)
for (r <- response) yield {
println(r.toString) //prints body
// println(r.getHeaders) // ???? how to print headers here ????
}
答案 0 :(得分:5)
我们需要API的失败请求的响应主体,因此我们提出了这个解决方案:
使用ApiHttpError
和code
(正文正文)定义您自己的body
课程:
case class ApiHttpError(code: Int, body: String)
extends Exception("Unexpected response status: %d".format(code))
定义OkWithBodyHandler
,类似于displatch
来源中使用的内容:
class OkWithBodyHandler[T](f: Response => T) extends AsyncCompletionHandler[T] {
def onCompleted(response: Response) = {
if (response.getStatusCode / 100 == 2) {
f(response)
} else {
throw ApiHttpError(response.getStatusCode, response.getResponseBody)
}
}
}
现在,在您调用可能抛出和异常的代码(调用API
)附近时,将implicit
覆盖添加到ToupleBuilder
(再次类似于源代码)并调用{ {1}}上的{1}}:
OkWithBody
从现在开始,抓取request
将为您提供class MyApiService {
implicit class MyRequestHandlerTupleBuilder(req: Req) {
def OKWithBody[T](f: Response => T) =
(req.toRequest, new OkWithBodyHandler(f))
}
def callApi(request: Req) = {
Http(request OKWithBody as.String).either
}
}
(使用either
,[Throwable, String]
为as.String)
Throwable
和ApiHttpError
。
希望它有所帮助。
答案 1 :(得分:3)
来自Dispatch docs:
import dispatch._, Defaults._ val svc = url("http://api.hostip.info/country.php") val country = Http(svc OK as.String)
以上定义并向2xx的给定主机发起请求 响应作为字符串处理。由于Dispatch是完全的 异步,country表示字符串的未来而不是 字符串本身。 (source)
在您的示例中,响应的类型是Future [String],因为&#39; OK as.String&#39;将2xx响应转换为字符串,将非2xx响应转换为失败的未来。如果您删除&#39; OK as.String&#39;,您将获得Future [com.ning.http.client.Response]。然后,您可以使用getResponseBody,getHeaders等来检查Request对象。