Использование композиции политики

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

В этом разделе вы узнаете, как создать гибридный веб-приложение с помощью композиции политик . Состав политики — это шаблон прокси Apigee, который позволяет объединять результаты от нескольких серверных целей в один ответ с помощью политик.

Общий обзор структуры политики см. в разделе «Шаблон композиции политики» в книге рецептов API-прокси .

Загрузите и опробуйте пример кода

Об этом примере кулинарной книги

Этот пример кулинарной книги иллюстрирует шаблон API-прокси, называемый композицией политики . Этот шаблон предоставляет один из способов (есть и другие) объединения данных из нескольких внутренних источников. В более общем плане эта тема демонстрирует, как политики могут быть объединены и связаны друг с другом для получения желаемого результата. Общий обзор этого шаблона и других связанных с ним шаблонов см. в разделе Рецепты API прокси-сервера .

В обсуждаемом здесь примере используется композиция политик для объединения данных из этих двух отдельных общедоступных API:

  • API геокодирования Google : этот API преобразует адреса (например, «1600 Amphitheatre Parkway, Mountain View, CA») в географические координаты (например, широту 37,423021 и долготу -122,083739).
  • API Google Elevation API. Этот API предоставляет простой интерфейс для запроса данных о высоте над местоположениями на Земле. В этом примере координаты, возвращенные из API геокодирования, будут использоваться в качестве входных данных в этот API.

Разработчики приложений вызовут этот прокси-сервер API с двумя параметрами запроса: почтовым индексом и идентификатором страны:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

Ответом является объект JSON, который включает геокодированное местоположение (широту/долготу) для центра предоставленной области почтового индекса в сочетании с высотой в этом геокодированном местоположении.

{  
   "ElevationResponse":{  
      "status":"OK",
      "result":{  
         "location":{  
            "lat":"39.7500713",
            "lng":"-74.1357407"
         },
         "elevation":"0.5045232",
         "resolution":"76.3516159"
      }
   }
}

Прежде чем начать

Если вы хотите прочитать краткий обзор шаблона композиции политики, см. «Шаблон композиции политики» в книге шаблонов прокси-сервера API .

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

  • Что такое политики и как их привязать к прокси. Хорошее введение в политики см. в разделе Что такое политика? .
  • Структура потока прокси-сервера API, как описано в разделе «Настройка потоков» . Потоки позволяют указать последовательность выполнения политик прокси-сервером API. В этом примере создается несколько политик и добавляется в поток прокси-сервера API.
  • Как проект прокси-сервера API организован в вашей файловой системе, как описано в справочнике по настройке прокси-сервера API . В этом разделе кулинарной книги демонстрируется локальная разработка (на основе файловой системы) в отличие от облачной разработки, где вы можете использовать пользовательский интерфейс управления для разработки прокси-сервера API.
  • Использование проверки ключа API. Это простейшая форма безопасности приложений, которую можно настроить для API. Дополнительную информацию см. в разделе Ключи API . Вы также можете просмотреть руководство по обеспечению безопасности API путем запроса ключей API .
  • Практические знания XML. В этом примере мы создаем прокси-сервер API и его политики с помощью XML-файлов, находящихся в файловой системе.

Если вы загрузили пример кода, вы можете найти все файлы, обсуждаемые в этом разделе, в папке примеров mashup-policy-cookbook . В следующих разделах подробно обсуждается пример кода.

Плывем с потоком

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

В образце загрузки вы можете найти этот XML в файле doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml .

<ProxyEndpoint name="default">
  <Flows>
    <Flow name="default">
      <Request>
            <!-- Generate request message for the Google Geocoding API -->
            <Step><Name>GenerateGeocodingRequest</Name></Step>
            <!-- Call the Google Geocoding API -->
            <Step><Name>ExecuteGeocodingRequest</Name></Step>
            <!-- Parse the response and set variables -->
            <Step><Name>ParseGeocodingResponse</Name></Step>
            <!-- Generate request message for the Google Elevation API -->
            <Step><Name>AssignElevationParameters</Name></Step>
      </Request>
      <Response>
            <!-- Parse the response message from the Elevation API -->
            <Step><Name>ParseElevationResponse</Name></Step>
            <!-- Generate the final JSON-formatted response with JavaScript -->
            <Step><Name>GenerateResponse</Name></Step>
      </Response>
    </Flow>
  </Flows>

  <HTTPProxyConnection>
    <!-- Add a base path to the ProxyEndpoint for URI pattern matching-->
    <BasePath>/policy-mashup-cookbook</BasePath>
    <!-- Listen on both HTTP and HTTPS endpoints -->
    <VirtualHost>default</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <!-- Connect ProxyEndpoint to named TargetEndpoint under /targets -->
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Вот краткое изложение элементов потока.

  • <Request> — элемент <Request> состоит из нескольких элементов <Step>. Каждый шаг вызывает одну из политик, которые мы создадим в оставшейся части этой темы. Эти политики связаны с созданием сообщения запроса, его отправкой и анализом ответа. К концу этой темы вы поймете роль каждой из этих политик.
  • <Response> — элемент <Response> также включает <Steps>. Эти шаги также вызывают политики, которые отвечают за обработку окончательного ответа от целевой конечной точки (API Google Elevation).
  • <HttpProxyConnection> — этот элемент определяет сведения о том, как приложения будут подключаться к этому прокси-серверу API, включая <BasePath>, который определяет, как будет вызываться этот API.
  • <RouteRule> — этот элемент определяет, что происходит сразу после обработки сообщений входящего запроса. В этом случае вызывается TargetEndpoint. Подробнее об этом важном шаге мы поговорим позже в этой теме.

Создание политик

В следующих разделах обсуждается каждая из политик, составляющих этот пример композиции политики.

Создайте первую политику AssignMessage.

Первая политика AssignMessage , указанная ниже, создает сообщение запроса, которое будет отправлено в службу геокодирования Google.

Начнем с кода политики, а затем объясним его элементы более подробно. В образце загрузки вы можете найти этот XML в файле doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml .

<AssignMessage name="GenerateGeocodingRequest">
  <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
      <QueryParam name="region">{request.queryparam.country}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <!-- Set variables for use in the final response -->
  <AssignVariable>
    <Name>PostalCode</Name>
    <Ref>request.queryparam.postalcode</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

Вот краткое описание элементов этой политики. Подробнее об этой политике можно прочитать в разделе «Политика назначения сообщений» .

  • <AssignMessage name> — присваивает этой политике имя. Имя используется, когда на политику ссылаются в потоке.
  • <AssignTo> — создает именованную переменную с именем GeocodingRequest. Эта переменная инкапсулирует объект запроса, который будет отправлен на серверную часть политикой ServiceCallout.
  • <QueryParams> — устанавливает параметры запроса, необходимые для вызова внутреннего API. В этом случае API геокодирования необходимо знать местоположение, выраженное почтовым индексом, и идентификатор страны. Пользователь приложения предоставляет эту информацию, и мы просто извлекаем ее здесь. Параметр sensor требуется API и имеет либо истинное, либо ложное значение, и здесь мы просто жестко запрограммировали его как ложное.
  • <Verb> — в данном случае мы делаем простой GET-запрос к API.
  • <AssignVariable> — эти переменные хранят значения, которые мы передаем в API. В этом примере доступ к переменным будет осуществляться позже в ответе, возвращаемом клиенту.

Отправьте запрос с помощью ServiceCallout

Следующим шагом в последовательности создания политики является создание политики ServiceCallout . Политика ServiceCallout, указанная ниже, отправляет объект запроса, который мы создали в предыдущей политике AssignMessage, в службу геокодирования Google и сохраняет результат в переменной с именем GeocodingResponse.

Как и раньше, давайте сначала посмотрим на код. Далее следует подробное объяснение. Подробнее об этой политике можно прочитать в разделе «Политика вызова услуг» . В образце загрузки вы можете найти этот XML в файле doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml .

<ServiceCallout name="ExecuteGeocodingRequest">
  <Request variable="GeocodingRequest"/>
  <Response>GeocodingResponse</Response>
  <HTTPTargetConnection>
    <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
  </HTTPTargetConnection>
</ServiceCallout>

Вот краткое описание элементов этой политики.

  • <ServiceCallout> — как и в предыдущей политике, у этой политики есть имя.
  • <Переменная запроса> — это переменная, созданная в политике AssignMessage. Он инкапсулирует запрос, поступающий к серверному API.
  • <Response> — этот элемент называет переменную, в которой хранится ответ. Как вы увидите, эта переменная будет доступна позже для политики ExtractVariables.
  • <HTPTTargetConnection> — указывает целевой URL-адрес внутреннего API. В этом случае мы указываем, что API возвращает ответ JSON.

Теперь у нас есть две политики: одна определяет информацию запроса, необходимую для использования внутреннего API (API геокодирования Google), а вторая фактически отправляет запрос во внутренний API. Далее мы обработаем ответ.

Разберите ответ с помощью ExtractVariables

Политика ExtractVariables предоставляет простой механизм анализа содержимого ответного сообщения, полученного политикой ServiceCallout. ExtractVariables можно использовать для анализа JSON или XML, а также для извлечения содержимого из путей URI, заголовков HTTP, параметров запроса и параметров формы.

Ниже приведен листинг политики ExtractVariables. Подробнее об этой политике можно прочитать в разделе Политика извлечения переменных . В образце загрузки вы можете найти этот XML в файле doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml .

<ExtractVariables name="ParseGeocodingResponse">
  <Source>GeocodingResponse</Source>
  <VariablePrefix>geocoderesponse</VariablePrefix>
  <JSONPayload>
    <Variable name="latitude">
       <JSONPath>$.results[0].geometry.location.lat</JSONPath>
    </Variable>
    <Variable name="longitude">
       <JSONPath>$.results[0].geometry.location.lng</JSONPath>
    </Variable>
  </JSONPayload>
</ExtractVariables>

Ключевые элементы политики ExtractVariable:

  • <ExtractVariables name> — опять же, имя политики используется для ссылки на политику, когда она используется в потоке.
  • <Source> — указывает переменную ответа, которую мы создали в политике ServiceCallout. Это переменная, из которой эта политика извлекает данные.
  • <VariablePrefix> — префикс переменной указывает пространство имен для других переменных, созданных в этой политике. Префиксом может быть любое имя, за исключением зарезервированных имен, определенных предопределенными переменными Edge .
  • <JSONPayload> — этот элемент извлекает интересующие нас данные ответа и помещает их в именованные переменные. Фактически, API геокодирования возвращает гораздо больше информации, чем широту и долготу. Однако это единственные значения, которые нам нужны для этого образца. Полную визуализацию JSON, возвращаемого API геокодирования, можно увидеть в документации API . Значения Geometry.location.lat и Geometry.location.lng — это просто два из многих полей в возвращаемом объекте JSON.

Это может быть неочевидно, но важно видеть, что ExtractVariables создает две переменные, имена которых состоят из префикса переменной (геокодерепонс) и фактических имен переменных, указанных в политике. Эти переменные хранятся в прокси-сервере API и, как вы увидите, будут доступны другим политикам в потоке прокси-сервера. Переменные:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

Большая часть работы уже сделана. Мы создали совокупность трех политик, которые формируют запрос, вызывают внутренний API и анализируют возвращаемые данные JSON. На последних шагах мы передадим данные из этой части потока в другую политику AssignMessage, вызовем второй серверный API (API Google Elevation) и вернем смешанные данные разработчику приложения.

Создайте второй запрос с помощью AssignMessage.

Следующая политика AssignMessage использует переменные, возвращенные из первого бэкэнда (Google Geocoding), который мы сохранили, и подключает их к запросу, предназначенному для второго API (Google Elevation). Как отмечалось ранее, этими переменными являются geocoderesponse.latitude и geocoderesponse.longitude.

В загруженном образце этот XML-код можно найти в файле doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml .

<AssignMessage name="AssignElevationParameters">
<Remove>
    <QueryParams>
      <QueryParam name="country"/>
      <QueryParam name="postalcode"/>
    </QueryParams>
  </Remove>
  <Set>
    <QueryParams>
      <QueryParam name="locations">{geocoderesponse.latitude},{geocoderesponse.longitude}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

Если вы изучите API Google Elevation, вы увидите, что он принимает два параметра запроса. Первый называется locations , и его значением является широта и долгота (значения, разделенные запятыми). Другой параметр — sensor , который является обязательным и должен иметь значение true или false. Самое важное, что следует отметить на этом этапе, — это то, что сообщение запроса, которое мы здесь создаем, не требует ServiceCallout. На этом этапе нам не нужно вызывать второй API из ServiceCallout, поскольку мы можем вызвать внутренний API из TargetEndpoint прокси. Если подумать, у нас есть все данные, необходимые для вызова API Google Elevations. Сообщение запроса, созданное на этом этапе, не требует ServiceCallout, поскольку запрос, сгенерированный для основного конвейера запросов, будет просто перенаправлен ProxyEndpoint. к TargetEndpoint, следуя RouteRule, настроенному для этого прокси API. TargetEndpoint управляет соединением с удаленным API. (Напомним, что URL-адрес API повышения определен в HTTPConnection для TargetEndpoint. Документация по API повышения, если вы хотите узнать больше. QueryParams, которые мы сохранили ранее, country и postalcode , больше не нужны, поэтому мы удаляем их здесь. .

Короткая пауза: Назад в поток

На этом этапе вы можете задаться вопросом, почему мы не создаем еще одну политику ServiceCallout. Ведь мы создали еще одно сообщение. Как это сообщение отправляется в целевой API Google Elevation? Ответ находится в элементе <RouteRule> потока. <RouteRule> указывает, что делать с оставшимися сообщениями запроса после выполнения части <Request> потока. TargetEndpoint, указанный в этом <RouteRule>, указывает прокси-серверу API доставить сообщение в http://maps.googleapis.com/maps/api/elevation/xml .

Если вы загрузили образец прокси-сервера API, вы можете найти XML-файл TargetProxy в файле doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml .

<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <!-- This is where we define the target. For this sample we just use a simple URL. -->
    <URL>http://maps.googleapis.com/maps/api/elevation/xml</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

Теперь нам просто нужно обработать ответ от API Google Elevation, и все готово.

Преобразование ответа из XML в JSON

В этом примере ответ от Google Elevation API возвращается в формате XML. Для «дополнительной оценки» давайте добавим в нашу составную структуру еще одну политику для преобразования ответа из XML в JSON.

В этом примере для выполнения преобразования используется политика JavaScript с именем GenerateResponse с файлом ресурсов, содержащим код JavaScript. Ниже показано определение политики GenerateResponse:

<Javascript name="GenerateResponse" timeout="10000">
  <ResourceURL>jsc://GenerateResponse.js</ResourceURL>
</Javascript>

Файл ресурсов GenerateResponse.js включает JavaScript, используемый для выполнения преобразования. Вы можете увидеть этот код в файле doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js .

Apigee также предоставляет готовую политику XMLToJSON для преобразования XML в JSON. Вы можете отредактировать ProxyEndpoint, чтобы вместо этого использовать политику xmltojson , показанную ниже.

<XMLToJSON name="xmltojson">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

Тестирование примера

Если вы еще этого не сделали, попробуйте загрузить, развернуть и запустить образец policy-mashup-cookbook , который вы можете найти в папке doc-samples в репозитории образцов Apigee Edge на GitHub. Просто следуйте инструкциям в файле README в папке policy-mashup-cookbook. Или следуйте кратким инструкциям здесь: Использование примеров прокси API .

Подводя итог, вы можете вызвать составной API следующим образом. Замените {myorg} на название вашей организации:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

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

{  
   "country":"us",
   "postalcode":"08008",
   "elevation":{  
      "meters":0.5045232,
      "feet":1.6552599030345978
   },
   "location":{  
      "latitude":39.75007129999999,
      "longitude":-74.1357407
   }
}

Краткое содержание

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