Работа с 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.

При использовании AbstractResponseHandler ошибки автоматически формируются при HTTP-статусе >= 300.

Внимание

При обработке ответа с помощью пользовательского ResponseHandler необходимо освобождать ресурсы и соединение, связанные с ответом.

Это можно сделать одним из способов:

  1. Закрыть поток вручную через response.getEntity.getContent.close().

  2. Передать response.getEntity.getContent в методы, которые самостоятельно закрывают InputStream.

  3. Вызвать 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)
}

Отправка HTTP-запроса через интерфейс#

В системе предусмотрен интерфейс для ручной отправки HTTP-запросов. Он используется для проверки доступности внешних сервисов, тестирования собственных REST-endpoint’ов Global ERP, проверки параметров запроса и анализа ответа без написания кода и без использования внешних инструментов, например curl или SoapUI.

Отображение формы: Btk_SendHttpRequest#Header.

Открыть форму можно двумя способами:

  • Настройки системы > Интеграция > Отправка http-запросов;

  • Интеграция и репликация > Сервис > Инструменты > Отправка http-запросов.

В форме указываются основные параметры запроса:

  • Url — адрес, на который отправляется HTTP-запрос;

  • Метод — HTTP-метод запроса. Доступны методы GET и POST.

В верхней панели формы доступны операции:

  • Отправить запрос — выполняет отправку запроса с указанными параметрами;

  • Обновить — обновляет данные формы;

  • Выход — закрывает форму.

Вкладки#

Авторизация

Вкладка используется для выбора способа передачи данных авторизации.

Доступные варианты:

  • Без авторизации — запрос отправляется без данных авторизации;

  • По логину и паролю — в запрос передаются логин и пароль;

  • По токену — в запрос передается токен авторизации.

Тело

Вкладка используется для настройки тела запроса.

Доступные поля:

  • Тип содержимого — тип данных, передаваемых в теле запроса;

  • Кодировка — кодировка тела запроса;

  • Пользовательская кодировка — дополнительное поле для указания собственной кодировки, если выбран пользовательский вариант.

В поле Тип содержимого доступны варианты:

  • application/json;

  • application/xml;

  • text/plain;

  • from headers.

При выборе from headers тип содержимого определяется по заголовкам запроса.

Для GET-запросов тело обычно не заполняется. Для POST-запросов на вкладке Тело можно указать передаваемые данные и параметры их обработки.

Заголовки

Вкладка используется для настройки HTTP-заголовков запроса.

Заголовки указываются в виде пар:

  • Заголовок — наименование HTTP-заголовка;

  • Значение — значение HTTP-заголовка.

Заголовки применяются, если внешнему сервису необходимо передать дополнительные параметры запроса, например тип содержимого, токен, ключ доступа или другие служебные данные.

Таймауты

Вкладка используется для настройки ограничений времени ожидания при выполнении запроса.

Доступные параметры:

  • Время ожидания получения соединения в секундах — максимальное время ожидания получения соединения;

  • Время ожидания установки соединения в секундах — максимальное время ожидания установки соединения с сервером;

  • Время ожидания ответа от сервера в секундах — максимальное время ожидания ответа от сервера после отправки запроса.

Если указанные значения превышены, выполнение запроса завершается ошибкой ожидания.

Пример отправки запроса через интерфейс#

Например, через форму можно отправить тестовый запрос к внешнему сайту, внешнему сервису или собственному REST-endpoint’у Global ERP. Это позволяет проверить запрос без использования внешних инструментов, например curl или SoapUI.

Порядок выполнения:

  1. Откройте сервис Отправка http-запросов.

  2. В поле Url укажите адрес, на который нужно отправить запрос.

  3. В поле Метод выберите HTTP-метод запроса: GET или POST.

  4. При необходимости заполните параметры на вкладках:

    • Авторизация — если запрос требует логин, пароль или токен;

    • Тело — если нужно передать данные в теле запроса;

    • Заголовки — если нужно передать дополнительные HTTP-заголовки;

    • Таймауты — если нужно изменить время ожидания соединения или ответа.

  5. Нажмите кнопку Отправить запрос.

После отправки система выполняет запрос и отображает окно с результатом. В этом окне можно посмотреть, был ли запрос выполнен успешно, а также увидеть ответ, полученный от сервера. Если при выполнении запроса возникла ошибка, в окне результата отображается информация об ошибке.

Проверка входящих запросов через endpoint логирования#

В системе предусмотрен специальный REST endpoint логирования входящих HTTP-запросов. На этот endpoint могут поступать GET- и POST-запросы от внешних систем.

Информация о полученных запросах отображается в журнале входящих HTTP-запросов.

Путь: Настройка системы > Аудит > Журнал входящих http-запросов.

Журнал используется для проверки факта получения запроса системой и анализа данных, зарегистрированных при обращении к endpoint логирования. При необходимости запрос на endpoint логирования можно отправить вручную через сервис Отправка http-запросов, чтобы проверить доступность сервера Global ERP и работу endpoint без внешних инструментов, например curl или SoapUI.