Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Политика JavaScript в Apigee Edge позволяет добавлять собственный код, который выполняется в контексте потока прокси API. Например, пользовательский код в политике JavaScript можно использовать для:
- Получить и установить переменные потока
- Выполнение пользовательской логики и обработка ошибок
- Извлечение данных из запросов или ответов
- Динамически редактировать целевой URL-адрес серверной части
- Динамически добавлять или удалять заголовки из запроса или ответа.
- Разобрать ответ JSON
HTTP-клиент
Мощной функцией политики Javascript является HTTP-клиент . HTTP-клиент (или объект httpClient
) можно использовать для выполнения одного или нескольких вызовов серверных или внешних служб. HTTP-клиент особенно полезен, когда необходимо выполнить вызовы к нескольким внешним службам и объединить ответы в одном API.
Пример кода JavaScript, вызывающего серверную часть с помощью объекта httpClient
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest);
Объект httpClient
предоставляет два метода get
и send
(в приведенном выше примере кода используется send
) для выполнения HTTP-запросов. Оба метода являются асинхронными и возвращают объект exchange
до завершения фактического HTTP-запроса.
HTTP-запросы могут занять от нескольких секунд до нескольких минут. После выполнения HTTP-запроса важно знать, когда он будет завершен, чтобы можно было обработать ответ на запрос. Один из наиболее распространенных способов определить завершение HTTP-запроса — вызвать метод waitForComplete()
объекта exchange
.
ожиданиеForComplete()
Метод waitForComplete()
приостанавливает поток до тех пор, пока HTTP-запрос не завершится и не будет возвращен ответ (успех/неуспех). Затем можно обработать ответ от серверной части или внешней службы.
Пример кода JavaScript с функцией waitForComplete()
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest); // Wait for the asynchronous GET request to finish exchange.waitForComplete(); // Get and Process the response if (exchange.isSuccess()) { var responseObj = exchange.getResponse().content.asJSON; return responseObj.access_token; } else if (exchange.isError()) { throw new Error(exchange.getError()); }
Антипаттерн
Использование waitForComplete()
после отправки HTTP-запроса в коде JavaScript повлияет на производительность.
Рассмотрим следующий код JavaScript, который вызывает waitForComplete()
после отправки HTTP-запроса.
Код для sample.js
// Send the HTTP request var exchangeObj = httpClient.get("http://example.com"); // Wait until the request is completed exchangeObj.waitForComplete(); // Check if the request was successful if (exchangeObj.isSuccess()) { response = exchangeObj.getResponse(); context.setVariable('example.status', response1.status); } else { error = exchangeObj.getError(); context.setVariable('example.error', 'Woops: ' + error); }
В этом примере:
- Код JavaScript отправляет HTTP-запрос серверному API.
- Затем он вызывает
waitForComplete()
, чтобы приостановить выполнение до завершения запроса.API
waitForComplete()
блокирует поток, выполняющий код JavaScript, до тех пор, пока серверная часть не завершит обработку запроса и не ответит.
Существует верхний предел количества потоков (30%), которые могут одновременно выполнять код JavaScript на процессоре сообщений в любое время. После достижения этого предела не будет доступных потоков для выполнения кода JavaScript. Таким образом, если в коде JavaScript слишком много одновременных запросов, выполняющих API waitForComplete()
, последующие запросы завершатся с ошибкой 500 Internal Server Error и сообщением об ошибке «Тайм-аут» даже до истечения срока действия политики JavaScript.
Как правило, этот сценарий может возникнуть, если серверной части требуется много времени для обработки запросов или имеется высокий трафик.
Влияние
- Запросы API завершатся с ошибкой 500 Internal Server Error и с сообщением об ошибке «Время ожидания истекло», когда количество одновременных запросов, выполняющих
waitForComplete()
в коде JavaScript, превышает предопределенный предел. - Диагностика причины проблемы может быть сложной, поскольку JavaScript завершается с ошибкой «Время ожидания истекло», хотя срок действия конкретной политики JavaScript еще не истек.
Лучшая практика
Используйте обратные вызовы в HTTP-клиенте, чтобы оптимизировать код вызова и повысить производительность, а также избегать использования waitForComplete()
в коде JavaScript. Этот метод гарантирует, что поток, выполняющий JavaScript, не будет заблокирован до тех пор, пока HTTP-запрос не будет завершен.
Когда используется обратный вызов, поток отправляет HTTP-запросы в коде JavaScript и возвращается обратно в пул. Поскольку поток больше не блокируется, он доступен для обработки других запросов. После завершения HTTP-запроса и готовности обратного вызова к выполнению задача будет создана и добавлена в очередь задач. Один из потоков пула выполнит обратный вызов в зависимости от приоритета задачи.
Пример кода JavaScript с использованием обратных вызовов в httpClient
function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get("http://example.com", onComplete);