Политика ServiceCallout

Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X.
информация

Что

Политика вызова службы позволяет вам вызывать другую службу из потока прокси-сервера API. Вы можете выполнять вызовы либо к внешней службе (например, к внешней конечной точке службы RESTful), либо к внутренним службам (например, к прокси-серверу API в той же организации и среде).

  • Во внешнем варианте использования вы вызываете сторонний API, внешний по отношению к вашему прокси. Ответ стороннего API анализируется и вставляется в ответное сообщение вашего API, обогащая и «объединяя» данные для конечных пользователей приложения. Вы также можете сделать запрос, используя политику вызова службы в потоке запросов, а затем передать информацию в ответе в TargetEndpoint прокси-сервера API.
  • В другом случае вы вызываете прокси-сервер, который находится в той же организации и среде, что и тот, из которого вы звоните. Например, это может оказаться полезным, если у вас есть прокси-сервер, предлагающий некоторую дискретную низкоуровневую функциональность, которую будут использовать один или несколько других прокси-серверов. Например, прокси-сервер, который предоставляет операции создания/чтения/обновления/удаления с внутренним хранилищем данных, может быть целевым прокси-сервером для нескольких других прокси-серверов, которые предоставляют данные клиентам.

Политика поддерживает запросы по протоколам HTTP и HTTPS.

Образцы

Локальный вызов внутреннего прокси

<LocalTargetConnection>
    <APIProxy>data-manager</APIProxy>
    <ProxyEndpoint>default</ProxyEndpoint>
</LocalTargetConnection>

В этом примере создается вызов к локальному прокси-серверу API (то есть в той же организации и среде) с именем data-manager и указывается конечная точка прокси-сервера с именем default .

URL как переменная

<HTTPTargetConnection>
    <URL>http://example.com/{request.myResourcePath}</URL>
</HTTPTargetConnection>

В этом примере используется переменная в URL-адресе для динамического заполнения URL-адреса цели. Протокольную часть URL-адреса http:// нельзя указать с помощью переменной. Кроме того, вы должны использовать отдельные переменные для доменной части URL-адреса и для остальной части URL-адреса.

Геокодирование Google/определить запрос

<ServiceCallout name="ServiceCallout-GeocodingRequest1">
    <DisplayName>Inline request message</DisplayName>
    <Request variable="authenticationRequest">
      <Set>
        <QueryParams>
          <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
          <QueryParam name="region">{request.queryparam.country}</QueryParam>
          <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
      </Set>
    </Request>
    <Response>GeocodingResponse</Response>
    <Timeout>30000</Timeout>
    <HTTPTargetConnection>
      <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>
http://maps.googleapis.com/maps/api/geocode/json

Вместо использования такой политики, как «Назначить сообщение», для создания объекта запроса, вы можете определить его непосредственно в политике вызова службы. В этом примере политика вызова службы устанавливает значения трех параметров запроса, передаваемых во внешнюю службу. Вы можете создать полное сообщение запроса в политике вызова службы, в которой указываются полезные данные, тип кодировки, например application/xml , заголовки, параметры формы и т. д.

Вот еще один пример, когда запрос формируется до достижения политики Service Callout.

<ServiceCallout name="ServiceCallout-GeocodingRequest2">
    <Request clearPayload="false" variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <Timeout>30000</Timeout>
    <HTTPTargetConnection>
      <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

Содержимое сообщения запроса извлекается из переменной GeocodingRequest (которая может быть заполнена, например, с помощью политики AssignMessage). Ответное сообщение присваивается переменной GeocodingResponse , где оно доступно для анализа с помощью политики извлечения переменных или пользовательского кода, написанного на JavaScript или Java. Политика ожидает ответа от API геокодирования Google в течение 30 секунд, прежде чем истечет время ожидания.

Полный пример прокси-сервера API, в котором используется этот пример вызова службы, а также политики «Назначить сообщение» и «Извлечь переменные», см. в разделе «Использование композиции политики» .

Вызов целевых серверов

<ServiceCallout async="false" continueOnError="false" enabled="true" name="service-callout">
    <DisplayName>service-callout</DisplayName>
    <Properties/>
    <Request clearPayload="true" variable="myRequest">
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </Request>
    <Response>myResponse</Response>
    <HTTPTargetConnection>
        <LoadBalancer>
            <Algorithm>RoundRobin</Algorithm>
            <Server name="httpbin"/>
            <Server name="yahoo"/>
        </LoadBalancer>
        <Path>/get</Path>
    </HTTPTargetConnection>
</ServiceCallout>

Эта политика использует атрибут LoadBalancer для вызова целевых серверов и балансировки нагрузки между ними. В этом примере нагрузка распределяется между двумя целевыми серверами с именами «httpbin» и «yahoo». Информацию о настройке целевых серверов для вашего прокси-сервера и настройке балансировки нагрузки см. в разделе Балансировка нагрузки между внутренними серверами .


О политике вызова сервисного обслуживания

Существует множество сценариев, в которых вы можете использовать политику вызова службы в своем прокси-сервере API. Например, вы можете настроить прокси-сервер API для вызовов внешней службы для доставки данных геолокации, отзывов клиентов, товаров из розничного каталога партнера и т. д.

Выноска обычно используется с двумя другими политиками: «Назначить сообщение» и «Извлечь переменные».

  • Запрос : Assign Message заполняет сообщение запроса, отправленное в удаленную службу.
  • Ответ : Extract Variables анализирует ответ и извлекает определенное содержимое.

Типичная структура политики вызова обслуживания включает в себя:

  1. Назначить политику сообщений : создает сообщение запроса, заполняет заголовки HTTP, параметры запроса, устанавливает команду HTTP и т. д.
  2. Политика вызова службы : ссылается на сообщение, созданное политикой назначения сообщения, определяет целевой URL-адрес для внешнего вызова и определяет имя объекта ответа, который возвращает целевая служба.

    Для повышения производительности вы также можете кэшировать ответы на вызовы службы, как описано в этой теме сообщества Apigee: https://community.apigee.com/questions/34110/how-can-i-store-the-results-of-the- servicecallout.html .
  3. Политика извлечения переменных : обычно определяет выражение JSONPath или XPath, которое анализирует сообщение, созданное вызовом службы. Затем политика устанавливает переменные, содержащие значения, полученные из ответа на вызов службы.

Полный пример прокси-сервера API, который использует политику вызова службы вместе с политиками назначения сообщения и извлечения переменных, см. в разделе «Использование композиции политики».

Пользовательская обработка ошибок

Ссылка на элемент

Ниже приведены элементы и атрибуты, которые вы можете настроить в этой политике:

<ServiceCallout async="false" continueOnError="false" enabled="true" name="Service-Callout-1">
    <DisplayName>Custom label used in UI</DisplayName>
    <Request clearPayload="true" variable="myRequest">
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
        <Remove>
            <ReasonPhrase/>
            <StatusCode/>
            <Path/>
            <Version/>
            <Verb/>
         </Remove>
         <Copy>
            <ReasonPhrase/>
            <StatusCode/>
            <Path/>
            <Version/>
            <Verb/>
        </Copy>
        <Add>
            <Headers/>
            <QueryParams/>
            <FormParams/>
        </Add>
        <Set>
            <Headers/>
            <QueryParams/>
            <FormParams/>
            <Payload/>
            <ReasonPhrase/>
            <StatusCode/>
            <Path/>
            <Version/>
            <Verb/>
        </Set>
    </Request>
    <Response>calloutResponse</Response>
    <Timeout>30000</Timeout>
    <HTTPTargetConnection>
        <URL>http://example.com</URL>
        <LoadBalancer/>
        <SSLInfo/>
        <Properties/>
    </HTTPTargetConnection>
    <LocalTargetConnection>
        <APIProxy/>
        <ProxyEndpoint/>
        <Path/>
    </LocalTargetConnection>
</ServiceCallout>

Атрибуты <ServiceCallout>

<ServiceCallout async="false" continueOnError="false" enabled="true" name="Service-Callout-1">

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

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

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

Элемент <Запрос>

Указывает переменную, содержащую сообщение запроса, которое отправляется с прокси-сервера API в другую службу. Переменная может быть создана предыдущей политикой в ​​потоке или ее можно создать встроенной в политику вызова службы.

<Request clearPayload="true" variable="myRequest">
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <Remove>
        <ReasonPhrase/>
        <StatusCode/>
        <Path/>
        <Version/>
        <Verb/>
    </Remove>
    <Copy>
        <ReasonPhrase/>
        <StatusCode/>
        <Path/>
        <Version/>
        <Verb/>
    </Copy>
    <Add>
        <Headers/>
        <QueryParams/>
        <FormParams/>
    </Add>
    <Set>
        <Headers/>
        <QueryParams/>
        <FormParams/>
        <Payload/>
        <ReasonPhrase/>
        <StatusCode/>
        <Path/>
        <Version/>
        <Verb/>
    </Set>
</Request>

Синтаксис тегов <Remove> , <Copy> , <Add> и <Set> такой же, как и для политики назначения сообщения .

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

В простейшем примере вы передаете переменную, содержащую сообщение запроса, которое было заполнено ранее в потоке прокси-сервера API:

<Request clearPayload="true" variable="myRequest"/>

Или вы можете заполнить сообщение запроса, отправленное внешней службе, в самой политике Service Callout:

<Request>
  <Set>
    <Headers>
      <Header name="Accept">application/json</Header>
    </Headers>
    <Verb>POST</Verb>
    <Payload contentType="application/json">{"message":"my test message"}</Payload>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</Request>
По умолчанию Если вы опустите элемент Request или любой из его атрибутов, Edge присвоит следующие значения по умолчанию :

<RequestclearPayload="true"variable="servicecallout.request"/>

Давайте посмотрим, что означают эти значения по умолчанию. Во-первых, clearPayload=true означает, что новый объект запроса создается каждый раз при выполнении политики ServiceCallout. Это означает, что запрос и путь URI запроса никогда не используются повторно. Во-вторых, имя переменной по умолчанию, servicecallout.request , является зарезервированным именем, которое назначается запросу, если вы не указываете имя.

Важно знать об этом имени по умолчанию, если вы используете маскирование данных : если вы опустите имя переменной, вам необходимо добавить servicecallout.request в конфигурацию маски. Например, если вы хотите замаскировать заголовок авторизации, чтобы он не отображался в сеансах трассировки, вы должны добавить следующее в свою конфигурацию маскировки, чтобы зафиксировать имя по умолчанию:

servicecallout.request.header.Authorization .

Присутствие Необязательный.
Тип Н/Д

Атрибуты

Атрибут Описание По умолчанию Присутствие
переменная

Имя переменной, которая будет содержать сообщение запроса.

servicecallout.request Необязательный
очиститьПолезная нагрузка

Если true , переменная, содержащая сообщение запроса, очищается после отправки запроса в целевой объект HTTP, чтобы освободить память, используемую сообщением запроса.

Установите для параметраclearPayload значение false, только если сообщение запроса требуется после выполнения вызова службы.

истинный Необязательный

Элемент <Request>/<IgnoreUnresolvedVariables>

Если установлено значение true , политика игнорирует любые неразрешенные ошибки переменных в запросе.

<Request clearPayload="true" variable="myRequest">
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</Request> 
По умолчанию ЛОЖЬ
Присутствие Необязательный
Тип логическое значение

Элемент <Response>

Включите этот элемент, если логика прокси-сервера API требует ответа от удаленного вызова для дальнейшей обработки.

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

Если этот элемент опущен, прокси-сервер API не ждет ответа; Выполнение потока прокси-сервера API продолжается со всеми последующими шагами потока. Кроме того, чтобы констатировать очевидное, без элемента Response ответ от цели недоступен для обработки на последующих шагах, и поток прокси не может обнаружить сбой в удаленном вызове. Обычное использование отсутствия элемента Response при использовании ServiceCallout: для регистрации сообщений во внешней системе.

 <Response>calloutResponse</Response> 
По умолчанию NA
Присутствие Необязательный
Тип Нить

Элемент <Таймаут>

Время в миллисекундах, в течение которого политика вызова службы будет ожидать ответа от цели. Вы не можете установить это значение динамически во время выполнения. Если вызов службы достигает тайм-аута, возвращается HTTP 500, политика завершается сбоем, и прокси-сервер API переходит в состояние ошибки, как описано в разделе Обработка ошибок .

<Timeout>30000</Timeout>
По умолчанию 55000 миллисекунд (55 секунд) — настройка тайм-аута HTTP по умолчанию для Apigee Edge.
Присутствие Необязательный
Тип Целое число

Элемент <HTPTTargetConnection>

Предоставляет сведения о транспорте, такие как URL-адрес, TLS/SSL и свойства HTTP. См. справочник по конфигурации <TargetEndpoint> .

<HTTPTargetConnection>
    <URL>http://example.com</URL>
    <LoadBalancer/>
    <SSLInfo/>
    <Properties/>
</HTTPTargetConnection>
По умолчанию Н/Д
Присутствие Необходимый
Тип Н/Д

Элемент <HTTPTargetConnection>/<URL>

URL-адрес вызываемой службы:

<HTTPTargetConnection>
    <URL>http://example.com</URL>
</HTTPTargetConnection>

Вы можете динамически предоставить часть URL-адреса с помощью переменной. Однако протокольная часть URL-адреса, http:// ниже, не может быть указана с помощью переменной. В следующем примере вы используете переменную для указания значения параметра запроса:

<URL>http://example.com/forecastrss?w=${request.header.woeid}</URL>

Или задайте часть URL-пути с помощью переменной:

<URL>http://example.com/{request.resourcePath}?w=${request.header.woeid}</URL>

Если вы хотите использовать переменную для указания домена и порта URL-адреса, используйте одну переменную только для домена и порта, а вторую переменную для любой другой части URL-адреса:

<URL>http://{request.dom_port}/{request.resourcePath}</URL>
По умолчанию Н/Д
Присутствие Необходимый
Тип Нить

Элемент <HTPTTargetConnection>/<SSLInfo>

Конфигурация TLS/SSL для серверной службы. Справку по настройке TLS/SSL см . в разделах «Настройка TLS от Edge до серверной части (облако и частное облако)» и «Конфигурация TLS/SSL TargetEndpoint» в справочнике по настройке прокси-сервера API .