HTTP_CONNECTOR

HTTP_CONNECTOR отправляет запросы к указанному серверу и получает ответы. Ответ может быть отправлен на выходной порт или сохранён в указанном файле.

Порты HTTP_CONNECTOR:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0нетДля установки различных атрибутов шагаЛюбые
Output0Содержимое ответа, путь к файлу ответа, код состояния, атрибуты шага
1Подробности об ошибках

Атрибуты HTTP_CONNECTOR:

АтрибутОбязательныйОписаниеВозможные значения
urlнетURL-адрес сервера, к которому подключается коннектор. Поддерживаются протоколы HTTP и HTTPS.

https://catfact.ninja/fact

requestMethodнетМетод запроса.GET (по умолчанию) | POST | PUT | PATCH | DELETE | HEAD | OPTIONS | TRACE
additionalHttpHeadersнетДополнительные свойства запроса, который будет отправлен на сервер. Представляет собой последовательность пар ключ=значение, разделенных запятой.content-type=application/json
requestContentнетCодержимое запроса, определенное непосредственно в графе.
$out[0].requestContent = $in[0].xmlConfig;
inputFileURLнетURL-адрес загружаемого файла.
outputFileURLнетURL файла, в который записывается ответ на запрос.
appendOutputнетПо умолчанию любой новый ответ перезаписывает старый. Если вы переключите этот атрибут на true, новый ответ будет добавлен к старым. Применяется только к выходным файлам.
inputMappingнетСопоставление входных данных. Позволяет передавать значения атрибутов шага, сопоставляя их значения с данными из входного порта. Использование атрибута inputMapping устанавливает остальные входные атрибуты в их дефолтные значения, в связи с этим, при использовании входного маппинга стоит задавать через него сразу все значения атрибутов.
function transform() {     
$out[0].url = $in[1].url;
$out[0].requestMethod = $in[1].requestMethod;

return ALL;
}
outputMappingнетСопоставление выходных данных. Позволяет сопоставить данные ответа на запрос (например, содержимое тела ответа, код состояния и т. д.) с метаданными выходного порта.
function transform() { 
$out[0].content = $in[1].content;
$out[0].statusCode = $in[1].statusCode;
$out[0].rawHeaders = $in[1].rawHeaders;

return ALL;
}
errorMappingнетМаппинг ошибок. Позволяет сопоставить сообщения об ошибке с метаданными выходного порта.
function transform() { 
$out[1].errorMesage = $in[1].errorMesageж;

return ALL;
}
redirectErrorOutputнетПозволяет перенаправить сведения об ошибке на нулевой выходной порт.redirectErrorOutput="false" по умолчанию
timeoutнетКак долго шаг ждет ответа. Если он не получает ответ в течение указанного срока, выполнение шага завершается неудачей. По умолчанию HTTP_CONNECTOR имеет тайм-аут в одну минуту. Тайм-аут указывается в миллисекундах.timeout="60000"
retryCountнетКоличество раз, которое нужно повторить запрос в случае сбоя. Сбой означает то же самое, что и использование компонентом порта ошибки. Компонент считает сбой, если он не может обработать запрос/ответ. Если он обрабатывает запрос и получает ответ с кодом статуса ошибки (например, 500), это не является сбоем.retryCount="6"
retryDelayнетКак долго шаг должен ждать перед повторной попыткой запроса. Если retryCount не нулевой, шаг будет ждать дополнительное время перед повторной отправкой запроса. Значение атрибута — это список целых чисел, разделенных запятой. Задержка повтора указывается в секундах. Если количество повторных попыток превышает размер списка, то используется последняя задержка в списке.retryDelay="4,2,5"
dnsResolverнетДля явного указания адреса сервера. Установите порт ":0", чтобы использовать обычный порт для указанной схемы (например, 80 для http). Порты в самом URL всегда будут использоваться вместо порта в переопределенном адресе.dev.allbridge.ru=127.0.0.1:0,127.0.0.1:443; another.domain.ru=192.168.0.0:0

Маппинг входных данных

В атрибуте inputMapping можно указать, какие поля из входной записи следует сопоставить с атрибутами шага.

  • URL — адрес, по которому будет отправлен запрос.
  • requestMethod — метод, который будет использован при отправке запроса.
  • additionalHttpHeaders - дополнительные заголовки запроса.
  • requestContent — содержимое отправляемого запроса в виде строки.
  • inputFileUrl — адрес файла, котрый нужно отправить, относительно проекта.
  • outputFileURL - адрес файла в который записать ответ.
  • appendOutput - применяется, если указан outputFileURL. При appendOutput=true новый ответ будет дозаписан в выходной файл без очистки файла от предыдущего содержимого.

Пример заполнения преобразования для маппинга входных данных:

function transform() { 
$out[0].requestContent = $in[1].requestContent;

return ALL;
}

Маппинг выходных данных

С помощью атрибута outputMapping на первый выходной порт можно отправить такие данные:

  • Результат — предоставляет данные о результате запроса. К нему относятся:
    • content — содержимое HTTP-ответа (response body) в виде строки. Это поле будет иметь значение null, если ответ записывается в файл.
    • outputFilePath - путь к файлу, в который записан ответ. Будет null, если ответ не записывается в файл.
    • statusCode — код состояния HTTP ответа.
    • rawHeaders — заголовки (response headers) ответа.
    • errorMessage — сообщение об ошибке в случае, если вывод ошибки перенаправляется на стандартный порт вывода.

Пример заполнения преобразования для маппинга выходных данных:

function transform() { 
$out[0].content = $in[1].content;
$out[0].outputFilePath = $in[1].outputFilePath;
$out[0].statusCode = $in[1].statusCode;
$out[0].rawHeaders = $in[1].rawHeaders;
$out[0].errorMesage = $in[1].errorMesage;

return ALL;
}

Маппинг ошибок

С помощью атрибута errorMapping можно вывести сооющение об ошибке на выходной порт HTTP_CONNECTOR. Поведение очень похоже на отображение выходных данных, но данные при этом выводятся на первый выходной порт шага, вместо нулевого.

Для того, чтобы потенциальная ошибка была выведена на порт ошибки, нужно указать для атрибута redirectErrorOutput значение false. При redirectErrorOutput=true ошибка будет выведена на нулевой выходной порт, вместе с остальными выходными данными шага.

Если в ответ на запрос приходит ошибка, а errorMapping не заполнен и redirectErrorOutput=false, то граф не сможет её обработать и упадет.

Пример заполнения преобразования для маппинга ошибок:

function transform() { 
$out[1].errorMesage = $in[1].errorMesageж;

return ALL;
}

Пример 1. Скачать Web-страницу

Загрузите содержимое веб-страницы modernsolution.ru/onebridge с помощью HTTP_CONNECTOR. Сохраните результат в файл для дальнейшей обработки.

Решение

Используйте атрибуты url, requestMethod и outputFileURL.

Загруженная страница будет сохранена в файле result.html в каталоге ${DATAOUT_DIR}.

АтрибутЗначение
url

https://modernsolution.ru/onebridge/

requestMethodget
outputFileURL${DATAOUT_DIR}/result.html

Пример 2. Получение токенов доступа для Onebridge и запуск задания с помощью HTTP_CONNECTOR

Цель данного примера - показать схему авторизации с получением токенов через api для запуска в работу задания Onebridge.

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

Чтобы получить токены, нужно отправить запрос на аутентификацию с помощью того же HTTP_CONNECTOR:

  1. Переместите на рабочую область Дизайнера шаг HTTP_CONNECTOR из палитры компонентов.
  2. Заполните атрибуты шага с помощью редактора шага:

АтрибутЗначение
url

https://onebridge-dev.dev.allbridge.ru/api/auth/login

requestMethodPOST
additionalHttpHeaderscontent-type=application/json
requestContent{"username": "${username}", "password":"${password}"}
outputMapping
function transform() {
$out[0].content = $in[1].content;
$out[0].outputFilePath = $in[1].outputFilePath;
$out[0].statusCode = $in[1].statusCode;
$out[0].rawHeaders = $in[1].rawHeaders;
$out[0].errorMessage = $in[1].errorMessage;

return ALL;
}
errorMapping
function transform() {
  $out[1].errorMessage = $in[1].errorMessage;

  return ALL;
}
redirectErrorOutputfalse
  1. Полученные токены нужно передать дальше в MAP через первый выходной порт. Для обработки ошибок заполните errorMapping и подключите ко второму выходному порту шаг TRASH.
  2. В MAP можно распарсить присланный в ответе на запрос json в две отдельных переменных следующим образом:
АтрибутЗначение
transform
function transform() {
  let { access_token, refresh_token } = JSON.parse($in[0].content);

  $out[0].access_token = access_token;
  $out[0].refresh_token = refresh_token;

  return ALL;
}
  1. Теперь нужно отправить авторизованный запрос на запуск задания, для этого используем новый HTTP_CONNECTOR, заполнив его атрибуты следующим образом:

АтрибутЗначение
url

https://onebridge-dev.dev.allbridge.ru/api/runs

requestMethodPOST
inputMapping
function transform() {
$out[0].additionalHttpHeaders = "content-type=application/json, authorization=Bearer " + $in[0].access_token;
$out[0].requestMethod = "post";
$out[0].requestContent = '{"job_file":"/ready-check/689_get_catfact.grf","params":[]}';

return ALL;
}
outputMapping
function transform() {
$out[0].content = $in[1].content;
$out[0].outputFilePath = $in[1].outputFilePath;
$out[0].statusCode = $in[1].statusCode;
$out[0].rawHeaders = $in[1].rawHeaders;
$out[0].errorMessage = $in[1].errorMessage;

return ALL;
}
errorMapping
function transform() {
  $out[1].errorMessage = $in[1].errorMessage;

  return ALL;
}
redirectErrorOutputfalse
  1. В случае успешного ответа на post-запрос для запуска задания должен прийти номер запущенного задания. Выведем его номер на первый выходной порт, например в файл с помощью FLAT_FILE_WRITER. Порт ошибок можно соединить с еще одним шагом TRASH.
  2. Для связи между шагами нужно описать метаданные и присвоить их соответствующим рёбрам.
    <Metadata id="meta0">
      <Record fieldDelimiter="," name="content" recordDelimiter="\n" type="delimited">
        <Field name="content" type="string"/>
        <Field name="outputFilePath" type="string"/>
        <Field name="statusCode" type="integer"/>
        <Field name="rawHeaders" type="string"/>
        <Field name="errorMessage" type="string"/>
      </Record>
    </Metadata>
    <Metadata id="meta1">
      <Record fieldDelimiter="," name="tokens" recordDelimiter="\n" type="delimited">
        <Field name="access_token" type="string"/>
        <Field name="refresh_token" type="string"/>
      </Record>
    </Metadata>
    <Metadata id="meta2">
      <Record fieldDelimiter="," name="error" recordDelimiter="\n" type="delimited">
        <Field name="errorMessage" type="string"/>
      </Record>
    </Metadata>
    <Metadata id="meta3">
      <Record fieldDelimiter="," name="tokens_and_input" recordDelimiter="\n" type="delimited">
        <Field name="access_token" type="string"/>
        <Field name="refresh_token" type="string"/>
        <Field name="url" type="string"/>
        <Field name="requestMethod" type="string"/>
        <Field name="additionalHttpHeaders" type="string"/>
        <Field name="requestContent" type="string"/>
      </Record>
    </Metadata>

Граф с распределенными метаданными будет выглядеть вот так:

Распределение метаданных на рёбрах графа

Распределение метаданных на рёбрах графа

После того как граф отработает, можно просмотреть содержимое ребер в датаинспекторе. В данном примере на последнем из ребер будет отображаться номер запущенного графа в поле "content".

Просмотр датаинспектора ребра отработавшего графа

Просмотр датаинспектора ребра отработавшего графа