Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
![]()
Что
Позволяет использовать Java для реализации специального поведения, которое не предусмотрено правилами Apigee. В коде Java можно получить доступ к свойствам сообщения (заголовкам, параметрам запроса, контенту) и переменным потока в прокси-потоке. Если вы только начинаете работать с этим правилом, ознакомьтесь с информацией о том, как создать вызов Java.
Список поддерживаемых версий Java приведен в статье Поддерживаемое программное обеспечение и его версии.
Когда
Рекомендации приведены в разделе "Когда следует использовать вызов Java?" статьи Как создать вызов Java.
Обзор
Правило Java Callout позволяет получать и задавать переменные потока, выполнять пользовательскую логику и обработку ошибок, извлекать данные из запросов или ответов и т. д. Это правило позволяет реализовать специальное поведение, не предусмотренное другими стандартными правилами Edge.
Вы можете упаковать приложение Java с любыми нужными JAR-файлами. Обратите внимание, что при использовании Java Callout действуют некоторые ограничения. Они перечислены ниже в разделе Ограничения.Примеры
Простой пример
Как создать выноску для JavaКак получить свойства в коде Java
Элемент <Property> позволяет указать пару "название-значение", которую можно получить во время выполнения в коде Java. Пример использования свойств можно найти в статье Как использовать свойства в выноске Java.
Используйте атрибут name элемента <Property>, чтобы указать имя, с помощью которого можно будет получить доступ к свойству из кода Java. Значение элемента <Property> (значение между открывающим и закрывающим тегами) – это значение, которое получит код Java. Значение должно быть строкой. Ссылаться на переменную потока, чтобы получить значение, нельзя.
- Настройте ресурс. В этом случае значением свойства будет название переменной
response.status.code.<JavaCallout async="false" continueOnError="false" enabled="true" name="JavaCallout"> <DisplayName>JavaCallout</DisplayName> <ClassName>com.example.mypolicy.MyJavaCallout</ClassName> <ResourceURL>java://MyJavaCallout.jar</ResourceURL> <Properties> <Property name="source">response.status.code</Property> </Properties> </Javascript>
- В коде Java реализуйте следующий конструктор в классе Execution:
public class MyJavaCallout implements Execution{ public MyJavaCallout(Map<string, string> props){ // Extract property values from map. } ... }
Как задать переменные потока в коде Java
Подробное описание того, как задавать переменные в контексте сообщения (переменные потока) в коде Java, приведено в сообщении сообщества Apigee.
Сведения об элементах
В справочнике по элементам описаны элементы и атрибуты правила JavaCallout.
<JavaCallout name="MyJavaCalloutPolicy"> <ClassName>com.example.mypolicy.MyJavaCallout</ClassName> <ResourceURL>java://MyJavaCallout.jar</ResourceURL> </JavaCallout>
Атрибуты <JavaCallout>
<JavaCallout name="MyJavaCalloutPolicy" enabled="true" continueOnError="false" async="false" >
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
Элемент <ClassName>
Указывает название класса Java, который выполняется при запуске правила Java Callout. Класс должен быть включен в JAR-файл, указанный в <ResourceURL>. Также ознакомьтесь со статьей Как создать вызов Java.
<JavaCallout name="MyJavaCalloutPolicy"> <ResourceURL>java://MyJavaCallout.jar</ResourceURL> <ClassName>com.example.mypolicy.MyJavaCallout</ClassName> </JavaCallout>
| По умолчанию: | Н/Д |
| Присутствие | Обязательно |
| Тип: | Строка |
Элемент <Property>
Указывает свойство, к которому можно получить доступ из кода Java во время выполнения. Для каждого свойства необходимо указать строковое значение. Ссылаться на переменные потока в этом элементе нельзя. Рабочий пример использования свойств можно найти в статье Как использовать свойства в выноске Java.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| По умолчанию: | Нет |
| Присутствие | Необязательно |
| Тип: | Строка |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля |
|---|---|---|---|
| name |
Указывает название ресурса. |
Н/Д | Обязательно. |
Элемент<ResourceURL>
Этот элемент указывает на JAR-файл Java, который будет выполняться при запуске правила вызова Java.
Вы можете сохранить этот файл в области действия прокси-сервера API (в разделе /apiproxy/resources/java в пакете прокси-сервера API или в разделе "Скрипты" на панели навигации редактора прокси-сервера API) или в области действия организации или среды для повторного использования в нескольких прокси-серверах API, как описано в разделе Файлы ресурсов.
<JavaCallout name="MyJavaCalloutPolicy"> <ResourceURL>java://MyJavaCallout.jar</ResourceURL> <ClassName>com.example.mypolicy.MyJavaCallout</ClassName> </JavaCallout>
| По умолчанию: | Нет |
| Присутствие | Обязательно |
| Тип: | Строка |
Справочник по ошибкам
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .
Ошибки выполнения
Эти ошибки могут возникнуть при выполнении политики.
| Код неисправности | Статус HTTP | Причина | Исправить |
|---|---|---|---|
steps.javacallout.ExecutionError | 500 | Происходит, когда код Java генерирует исключение или возвращает значение NULL во время выполнения политики JavaCallout. | build |
Ошибки развертывания
Эти ошибки могут возникнуть при развертывании прокси-сервера, содержащего политику.
| Название ошибки | Строка неисправности | Статус HTTP | Происходит, когда |
|---|---|---|---|
ResourceDoesNotExist | Resource with name [name] and type [type] does not exist | Н/Д | Файл, указанный в элементе <ResourceURL> , не существует. |
JavaCalloutInstantiationFailed | Failed to instantiate the JavaCallout Class [classname] | Н/Д | Файл класса, указанный в элементе <ClassName> отсутствует в банке. |
IncompatibleJavaVersion | Failed to load java class [classname] definition due to - [reason] | Н/Д | См. строку ошибки. См. также Поддерживаемое программное обеспечение и поддерживаемые версии . |
JavaClassNotFoundInJavaResource | Failed to find the ClassName in java resource [jar_name] - [class_name] | Н/Д | См. строку ошибки. |
JavaClassDefinitionNotFound | Failed to load java class [class_name] definition due to - [reason] | Н/Д | См. строку ошибки. |
NoAppropriateConstructor | No appropriate constructor found in JavaCallout class [class_name] | Н/Д | См. строку ошибки. |
NoResourceForURL | Could not locate a resource with URL [string] | Н/Д | См. строку ошибки. |
Переменные неисправности
Эти переменные устанавливаются, когда эта политика вызывает ошибку. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
fault.name=" fault_name " | fault_name — это имя ошибки, как указано в таблице ошибок времени выполнения выше. Имя неисправности — это последняя часть кода неисправности. | fault.name Matches "ExecutionError" |
javacallout. policy_name .failed | policy_name — указанное пользователем имя политики, вызвавшей ошибку. | javacallout.JC-GetUserData.failed = true |
Пример ответа об ошибке
{ "fault":{ "faultstring":"Failed to execute JavaCallout. [policy_name]", "detail":{ "errorcode":"javacallout.ExecutionError" } } }
Пример правила неисправности
<FaultRule name="JavaCalloutFailed"> <Step> <Name>AM-JavaCalloutError</Name> </Step> <Condition>(fault.name Matches "ExecutionError") </Condition> </FaultRule>
Схемы
Компиляция и развертывание
Подробнее о том, как создать вызов Java…
Ограничения
Ниже перечислены ограничения, которые необходимо учитывать при написании выносок Java:
- Большинство системных вызовов запрещено. Например, вы не можете читать или записывать данные во внутреннюю файловую систему.
- Доступ к сети через сокеты. Apigee ограничивает доступ к адресам sitelocal, anylocal, loopback и linklocal.
- Выноска не может получить информацию о текущем процессе, списке процессов или использовании ЦП/памяти на компьютере. Хотя некоторые из таких звонков могут работать, они не поддерживаются и могут быть отключены в любой момент. Чтобы обеспечить совместимость с будущими версиями, не используйте такие вызовы в коде.
- Использование библиотек Java, включенных в Apigee Edge, не поддерживается. Эти библиотеки предназначены только для функций продукта Edge, и нет гарантии, что они будут доступны в каждом выпуске.
- Не используйте
io.apigeeилиcom.apigeeв качестве названий пакетов в выносках Java. Эти названия зарезервированы и используются другими модулями Apigee.
Упаковка
Поместите JAR-файл в прокси-сервер API в папку /resources/java. Если ваш вызов Java зависит от дополнительных сторонних библиотек, упакованных в отдельные JAR-файлы, поместите эти JAR-файлы в каталог /resources/java, чтобы они правильно загружались во время выполнения.
Если вы создаете или изменяете прокси-сервер с помощью интерфейса управления, добавьте новый ресурс и укажите дополнительный зависимый JAR-файл. Если файлов JAR несколько, просто добавьте их как дополнительные ресурсы. Вам не нужно изменять конфигурацию правил, чтобы ссылаться на дополнительные JAR-файлы. Достаточно указать их в /resources/java.
Информацию о загрузке JAR-файлов Java можно найти в разделе Файлы ресурсов.
Подробный пример того, как упаковать и развернуть объект уточнения Java с помощью Maven или javac, приведен в статье Как создать объект уточнения Java.
Javadoc
Документация Javadoc по написанию кода Java Callout приведена на GitHub. Вам нужно будет клонировать или скачать HTML-код на устройство, а затем открыть файл index.html в браузере.
Примечания
- Правило Java Callout не содержит кода. Вместо этого правило Java Callout ссылается на ресурс Java и определяет шаг в потоке API, на котором выполняется код Java. Вы можете загрузить JAR-файл Java через редактор прокси-сервера в интерфейсе управления или добавить его в каталог
/resources/javaв прокси-серверах API, которые вы разрабатываете локально. - Для простых операций, таких как вызовы API к удаленным сервисам, мы рекомендуем использовать правило ServiceCallout. Ознакомьтесь с правилами в отношении описаний услуг.
- Для относительно простых взаимодействий с контентом сообщений, например для изменения или извлечения HTTP-заголовков, параметров или контента сообщений, Apigee рекомендует использовать правила JavaScript.
Статьи по теме
- Другие примеры можно найти в репозитории java-cookbook.