Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
В этой теме вы узнаете, как использовать 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 доступ к переменным потока осуществляется через объект контекста. Этот объект является частью объектной модели Edge JavaScript. Подробную информацию об объектной модели см. в разделе «Объектная модель JavaScript» .
Прежде чем начать
Прежде чем приступить к изучению этого примера из кулинарной книги, вам также следует ознакомиться со следующими основными понятиями:
- Что такое политика и как её применять к доверенностям. Для ознакомления с понятием политики см. статью «Что такое политика?» .
- Структура потока прокси, как описано в разделе «Настройка потоков» . Потоки позволяют указать последовательность выполнения политик API-прокси. В этом примере создается и добавляется несколько политик в поток API-прокси.
- Как организован проект API-прокси в вашей файловой системе, описано в справочнике по настройке API-прокси .
- Необходимо иметь практические знания XML, JSON и JavaScript. В этом примере вы создадите API-прокси и его политики с помощью XML-файлов, расположенных в файловой системе.
Если вы скачали пример кода, все файлы, обсуждаемые в этой теме, находятся в папке javascript-cookbook sample. В следующих разделах пример кода рассматривается подробно.
Понимание потока прокси-серверов
Для выполнения 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
Флаг -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 и создавать пользовательские сообщения ответа.