Работа с HTTP-запросами#
Для отправки HTTP-запроса и обработки полученного ответа предусмотрен класс Btk_HttpPkg.
Доступна настройка конфигурации запроса RequestConfig, создание запроса HttpRequest с необходимым методом, заполнение тела запроса, обработка полученного овтета HttpResult.
Конфигурация и отправка запроса, обработка ответа#
Построение запроса#
Пример Get-запроса:
Btk_HttpPkg().get("https://httpbin.org/status/200".ns)
.configAppend(_.setConnectTimeout(10000))
.configAppend(_.setMaxRedirects(3))
.headers(("key".ns, "value".ns))
.basicAuth("login".ns, "password".ns)
.build()
.process(response => {
print(response.getStatusLine.getStatusCode)
EntityUtils.consume(response.getEntity)
})
.get
get(),post()и прочие — создание запроса с нужным методом.configAppend()— задаёт свойства конфигурации запроса.headers()— для установки заголовков.basicAuth()илиbearerAuth()— для установки данных аутентификации.build()— переход к обработчикам результата.
Установка тела запроса. Отправка и получение JSON#
Для Post-запроса есть возможность установки тела запроса с нужным типом содержимого с помощью методов:
setEntity(entity: HttpEntity)setStringEntity(body: NString)setJSONEntity(body: NString)setXMLEntity(body: NString)
Пример запроса, передающего и получающего JSON-объект:
val svRequestBody = """{ "data": "Some Data Sample" }"""
val jvResponseBody = Btk_HttpPkg().post("https://httpbin.org/anything".ns)
.setJSONEntity(svRequestBody)
.build()
.getJObject()
.get
print(jvResponseBody)
Обработка результата#
Метод process#
С помощью лямбды HttpResponse -> T.
Реализовав интерфейс
org.apache.http.client.ResponseHandler.Реализовав интерфейс
org.apache.http.impl.client.AbstractResponseHandler(Автоматическое формирование ошибок при http статусе >= 300).
Внимание
При обработке ответа с помощью пользовательского ResponseHandler, необходимо освобождать ресурсы и соединение, связанные с ответом.
Ручным закрытием response.getEntity.getContent.close().
Передачей response.getEntity.getContent в методы которые сами закрывают InputStream.
Вызовом EntityUtils.consume(response.getEntity).
Готовые обработчики#
Также, помимо process(), к использованию доступны следующие методы для получения ответа:
execute()— выполнить запрос и вернутьTry[Unit].getText()— тело ответа в виде строки.Try[NString].getJObject()— ответ в видеTry[JObject].getJArray()— ответ в видеTry[JArray].forStream[T](f: InputStream => T)— обработатьInputStream, полученный из содержимого ответа.
Обработка ошибок#
Пример обработки ответа с ошибкой:
try app {
val jvResponseBody = Btk_HttpPkg().post("https://httpbin.org/json".ns)
.basicAuth("login".ns, "password".ns)
.setStringEntity("data")
.build()
.getJObject() match {
// HttpResponseException если были использованы готовые обработчики или основанный на `HttpResponseException`.
case Failure(ex: HttpResponseException) if ex.getStatusCode == 401 =>
throw AppException(s"Ошибка ответа на запрос. Код: ${ex.getStatusCode}. Причина: Неверный логин или пароль.")
case Failure(ex: HttpResponseException) if ex.getStatusCode == 405 =>
throw AppException(s"Ошибка ответа на запрос. Код: ${ex.getStatusCode}. Причина: Использование недопустимого метода.")
// Ошибки обработки, socket timeout и тп
case Failure(ex) => throw ex
case Success(jObj) => jObj
}
print(jvResponseBody)
}