如何在调度请求中获取响应头和主体?

时间:2014-08-10 22:00:18

标签: scala http header request scala-dispatch

我想从调度请求中获取正文和标题。怎么做?

val response = Http(request OK as.String)
for (r <- response) yield {
  println(r.toString) //prints body
  // println(r.getHeaders) // ???? how to print headers here ???? 
}

2 个答案:

答案 0 :(得分:5)

我们需要API的失败请求的响应主体,因此我们提出了这个解决方案:

使用ApiHttpErrorcode(正文正文)定义您自己的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) ThrowableApiHttpError

希望它有所帮助。

答案 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对象。