Программирование прокси API с помощью JavaScript

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

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

Скачайте и попробуйте образец кода

Пример кулинарной книги

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

В прокси-сервере API есть два примера кода JavaScript:

  • setHeaders.js: этот код JavaScript получает значения нескольких переменных, которые задаются при вызове прокси-сервера API. Скрипт JavaScript добавляет эти переменные в сообщение ответа, чтобы вы могли видеть их значения для каждого запроса.
  • minimize.js: этот код JavaScript показывает, как работать с контентом сообщений. Идея этого примера заключается в том, что сервис часто возвращает больше данных, чем необходимо. Таким образом, JavaScript анализирует ответное сообщение, извлекает из него несколько интересных свойств и использует их для создания контента ответного сообщения.

Код для setHeader.js:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

Код для minimize.js:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

Переменные потока можно получить в JavaScript с помощью объекта контекста. Этот объект является частью объектной модели JavaScript Edge. Подробнее об объектной модели JavaScript…

Подготовка

Прежде чем изучать пример из этого руководства, ознакомьтесь с основными понятиями:

  • Что такое правила и как прикрепить их к прокси. Чтобы узнать больше о правилах, прочитайте статью Что такое правила.
  • Структура потока прокси-сервера, как описано в разделе Настройка потоков. Потоки позволяют задать последовательность, в которой правила выполняются прокси-сервером API. В этом примере создано несколько правил, которые добавлены в поток прокси-сервера API.
  • Как организован проект прокси-сервера API в файловой системе, как описано в справочнике по конфигурации прокси-сервера API.
  • Знание XML, JSON и JavaScript. В этом примере вы создадите прокси API и его правила с помощью XML-файлов, хранящихся в файловой системе.

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

Как работает прокси-сервер

Чтобы JavaScript выполнялся в прокси-сервере API, его нужно прикрепить к потоку с помощью прикрепления правил, которое называется шагом. Правило типа Javascript (с учетом регистра) содержит только ссылку на название файла JavaScript. Вы указываете на файл JavaScript в правиле с помощью элемента ResourceURL.

Например, в следующем правиле упоминается файл JavaScript setHeader.js.

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

Это правило можно прикрепить к потоку прокси-сервера API так же, как и любое другое правило. Прикрепив правило к потоку прокси-сервера API, вы указываете, где должен выполняться код JavaScript. Это позволяет выполнять код JavaScript, который взаимодействует с сообщениями запросов или ответов, когда они проходят через прокси-сервер API. В этом примере оба скрипта JavaScript выполняются в потоке ответов, поскольку правила выполняют два действия: устанавливают заголовки HTTP в сообщении ответа и "минимизируют" сообщение ответа, которое Apigee Edge возвращает приложению, отправившему запрос.

Если вы откроете эту конфигурацию потока в интерфейсе управления, то увидите конфигурацию потока, приведенную ниже.

В панели навигации выберите Proxy Endpoints > default > PostFlow.

Ниже показана соответствующая конфигурация XML для ProxyEndpoint с названием default.

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

Ниже приведена сводка элементов потока.

  • <Request> – элемент <Request> состоит из нескольких элементов <Step>. На каждом шаге вызывается одно из правил, которые вы создадите в оставшейся части этой статьи. Эти правила прикрепляют JavaScript к потоку прокси-сервера API, а место прикрепления определяет, когда будет выполняться JavaScript.
  • <Response> – элемент <Response> также включает элемент <Steps>. Эти шаги также вызывают правила, которые отвечают за обработку окончательного ответа от целевого объекта (в этом примере это целевой объект макета сервиса Apigee – обратите внимание на настройку HTTPTargetConnection в разделе /apiproxy/targets/default.xml).
  • <HTTPProxyConnection> – указывает хост и путь URI, которые определяют сетевой адрес, по которому приложения вызывают этот API.
  • <RouteRule> – этот элемент указывает, какая конфигурация TargetEndpoint вызывается ProxyEndpoint.

Как добавить код JavaScript в прокси

Файлы JavaScript (например, скрипты Python, JAR-файлы Java, файлы XSLT и т. д.) хранятся как ресурсы. Если вы только начинаете работать с JavaScript, проще всего хранить файлы JavaScript в прокси-сервере API. По мере развития JavaScript должен становиться как можно более универсальным и пригодным для повторного использования, а затем храниться на уровне среды или организации. Это позволяет не хранить одни и те же файлы JavaScript в нескольких прокси API, что может быстро стать неудобным.

Подробнее о том, как хранить ресурсы на уровне организации и среды…

Попробовать

Инструкции по развертыванию и вызову прокси-сервера приведены в файле README для сборника рецептов JavaScript.

Импорт и развертывание прокси-сервера API

После внесения изменений вы можете сохранить прокси-сервер API в инструменте создания прокси-сервера API в интерфейсе управления.

Или выполните следующую команду в каталоге /api-platform-samples/doc-samples/javascript-cookbook.

$ sh deploy.sh

Тестирование JavaScript

Выполните следующую команду в каталоге /api-platform-samples/doc-samples/javascript-cookbook.

$ sh invoke.sh

Флаг curl -v используется в сценарии командной строки, чтобы просматривать HTTP-заголовки в сообщении ответа, измененном с помощью JavaScript.

Вы можете отправить запрос напрямую, выполнив следующие действия:

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

Если код JavaScript выполнен правильно, вы увидите ответ, похожий на приведенный ниже:

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

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

Ошибки скриптов

При написании кода на JavaScript неизбежно возникают ошибки. Ниже показан формат ошибок JavaScript, которые могут возникать при работе с прокси-сервером API.

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

Когда использовать JavaScript

В Apigee Edge обычно есть несколько способов реализовать определенную функцию. По возможности используйте готовые правила и не пытайтесь реализовать всю логику прокси-сервера API на JavaScript. Хотя Apigee Edge использует скомпилированный код JavaScript для повышения производительности, маловероятно, что JavaScript будет работать так же хорошо, как правила. Поддержка и отладка JavaScript могут быть сложнее. Используйте JavaScript только для функций, которые необходимы вам.

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

Сводка

В этом разделе справочного руководства вы узнали, как включить JavaScript в конфигурацию прокси-сервера API, чтобы реализовать собственное поведение. В примерах показано, как получить переменные, проанализировать JSON и создать собственные сообщения ответа.