Как получить заголовки и тело ответа в запросе на отправку?

Я хочу получить как тело, так и заголовки из запроса на отправку. Как это сделать?

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

person Daniel Cukier    schedule 10.08.2014    source источник


Ответы (2)


Из документов Dispatch:

import dispatch._, Defaults._
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc OK as.String)

Приведенное выше определяет и инициирует запрос к данному хосту, где ответы 2xx обрабатываются как строка. Поскольку Dispatch полностью асинхронен, страна представляет будущее строки, а не саму строку. (источник)

В вашем примере тип ответа — Future[String], потому что «OK as.String» преобразует ответы 2xx в строки, а ответы, отличные от 2xx, — в ошибочные фьючерсы. Если вы удалите «OK as.String», вы получите Future[com.ning.http.client.Response]. Затем вы можете использовать getResponseBody, getHeaders и т. д. для проверки объекта Request.

person pkinsky    schedule 12.08.2014

Нам нужно было тело ответа на неудачные запросы к 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 (опять же аналогично исходному коду) и вызовите 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 с code и body.

Надеюсь, это помогло.

person Michael Vashchinsky    schedule 02.02.2015