Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X. Информация
Используйте правило FlowCallout, чтобы вызвать общий поток из прокси-сервера API или другого общего потока.
В общем потоке создается последовательность шагов, которую можно повторно использовать во время выполнения из разных мест. Эти шаги реализуются в виде правил, как в прокси-сервере API. Правило FlowCallout позволяет вызывать общий поток из прокси API и других общих потоков. Он работает так же, как вызов функции в традиционном языке программирования.
- Предположим, вы создали общий поток с функциями безопасности, такими как проверка ключа API, проверка токена OAuth и защита с помощью регулярных выражений. Этот общий поток представляет собой соглашение о том, как проверять входящие запросы. С помощью правил FlowCallout можно вызывать этот общий поток из нескольких прокси API.
- Вы можете вызвать один общий поток из другого, реализовав политику FlowCallout в общем потоке.
Примеры
Как подтвердить ключ API в общем потоке
В этом примере общий поток используется для выполнения стандартных задач, связанных с безопасностью. В этом случае общий поток проверяет ключ API. Прокси API и другие общие потоки могут использовать правило FlowCallout для вызова этого общего потока.
В приведенном ниже определении общего потока содержится правило Verify-API-Key, которое выполняется, когда общий поток вызывается из правила FlowCallout в прокси-сервере API.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SharedFlow name="default">
<Step>
<Name>Verify-API-Key</Name>
</Step>
</SharedFlow>Правило VerifyAPIKey в предыдущем общем потоке извлекает значение ключа и проверяет его.
<VerifyAPIKey async="false" continueOnError="false" enabled="true" name="Verify-API-Key">
<DisplayName>Verify API Key</DisplayName>
<APIKey ref="request.queryparam.apikey"/>
</VerifyAPIKey>Следующее правило FlowCallout, используемое в прокси-сервере API, вызывает предыдущий общий поток для проверки ключа API. Пакет общего потока verify-apikey-shared (не показан здесь) настраивает общий поток так же, как пакет APIProxy настраивает прокси.
<FlowCallout async="false" continueOnError="false" enabled="true" name="Auth-Flow-Callout">
<DisplayName>Auth Flow Callout</DisplayName>
<SharedFlowBundle>verify-apikey-shared</SharedFlowBundle>
</FlowCallout>Как передавать параметры в общий поток
В этом примере показано, как передавать параметры из правила FlowCallout в общий поток. В этом случае правило FlowCallout вызывает общий поток, предназначенный для выполнения стандартных функций обработки строк. Общий поток содержит код JavaScript, который объединяет входные данные, преобразует их в нижний регистр или выполняет обе эти операции. Правило FlowCallout определяет параметры, которые указывают на входные и выходные данные строки, а также на то, что делать с входными данными.
Правило
String-HandlerFlowCallout вызывает общий поток, передавая параметры, указывающие переменную для хранения выходных данных общего потока, операцию общего потока и входные данные (в данном случае строковый литерал, но это также может быть переменная потока). ЭлементыParameterзадают названия и значения переменных, которые нужно создать во время выполнения. Общий поток может извлекать эти переменные для использования в собственном коде.<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <FlowCallout async="false" continueOnError="false" enabled="true" name="String-Handler"> <DisplayName>String Handler</DisplayName> <Parameters> <Parameter name="input">Gladys Kravitz</Parameter> <Parameter name="operations">concatenate tolowercase</Parameter> <Parameter name="outputVariable">string.handler.output</Parameter> </Parameters> <SharedFlowBundle>StringHandler</SharedFlowBundle> </FlowCallout>В следующем
defaultобщем потоке содержитсяSharedStringFunctionsправило JavaScript, которое выполняется при вызове общего потока из правила FlowCallout.<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <SharedFlow name="default"> <Step> <Name>SharedStringFunctions</Name> </Step> </SharedFlow>В общем потоке следующее правило JavaScript
SharedStringFunctionsуказывает на файл JavaScript SharedStringFunctions.js с кодом для выполнения.<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="SharedStringFunctions"> <DisplayName>SharedStringFunctions</DisplayName> <Properties/> <ResourceURL>jsc://SharedStringFunctions.js</ResourceURL> </Javascript>
Следующий код JavaScript, SharedStringFunctions.js, выполняется в соответствии с правилом JavaScript
SharedStringFunctions. Этот скрипт извлекает значения из переменных, созданных на основе элементов правила "Выноска с переходом"Parameter.// Input value from the calling API proxy. var handledString = context.getVariable("input"); // Variable to use for output from this script. var outputVariable = context.getVariable("outputVariable"); // A space-separated list of things to do to the input string. // Convert to lower case to handle unintentional capitals in configuration. var operation = context.getVariable("operations").toLowerCase(); // If "lowercase" was given as an operation, convert the input to lowercase. if (operation.includes("tolowercase")) { handledString = handledString.toLowerCase(); } // If "concatenate" was given as an operation, concatenate the input. if (operation.includes("concatenate")) { handledString = handledString.replace(/\s+/g, ''); } // Assign the resulting string to the output variable specified by // the calling API proxy. context.setVariable(outputVariable, handledString);
- Выполнение возвращается из правила JavaScript в общий поток, а затем в правило FlowCallout в исходном прокси-сервере API.
Сведения об элементах
Ниже перечислены элементы и атрибуты, которые можно настроить в этом правиле:
<FlowCallout async="false" continueOnError="false" enabled="true" name="Flow-Callout-1">
<DisplayName>Custom label used in UI</DisplayName>
<SharedFlowBundle>thereferencedsharedflowbundle</SharedFlowBundle>
</FlowCallout>Атрибуты элемента <FlowCallout>
<FlowCallout async="false" continueOnError="false" enabled="true" name="Flow-Callout-1">
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
Элемент <SharedFlowBundle>
Указывает название общего потока, который нужно вызвать. Значение этого элемента должно совпадать со значением атрибута name целевого элемента SharedFlowBundle.
<SharedFlowBundle/>
В самом простом случае в качестве значения этого элемента указывается название вызываемого общего потока. Значение этого элемента должно совпадать со значением атрибута name в общем потоке.
<SharedFlowBundle>Shared-Flow-Name</SharedFlowBundle>
| По умолчанию | Н/Д |
| Присутствие |
Обязательно. |
| Тип | Н/Д |
Атрибуты
Нет.
Элемент <Parameter>
Указывает параметр и значение (или источник значения), которые будут переданы в качестве переменной в общий поток, вызываемый этим правилом.
С помощью параметра можно указать значение (или переменную, содержащую значение), которое должно быть передано в общий поток, вызываемый правилом. Это похоже на указание параметра при вызове функции. Как и в случае с параметром функции, значение параметра FlowCallout может меняться в зависимости от контекста вызова общего потока.
Параметры FlowCallout видны только во время выполнения общего потока.
Синтаксис
Этот элемент можно использовать с любым из следующих вариантов синтаксиса. Обратите внимание, что если вы используете литеральное значение, его формат будет зависеть от кода, который его обрабатывает.
<!- A literal value in an attribute. --/> <Parameter name="parameter-name" value='parameter-value' /> <!- A reference to a variable in an attribute. --/> <Parameter name="parameter-name" ref='source-variable-name' /> <!- A literal value in the element content. --/> <Parameter name="parameter-name">parameter-value</Parameter> <!- An reference to an attribute in the element content. --/> <Parameter name="parameter-name">{source-variable-name}</Parameter>
Пример
Это правило String-Handler FlowCallout передает параметры, указывающие, где хранить выходные данные общего потока и какие входные данные использовать. Элементы Parameter задают названия и значения переменных, которые нужно создать во время выполнения. Общий поток может извлекать эти переменные для использования в собственном коде.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FlowCallout async="false" continueOnError="false" enabled="true" name="String-Handler">
<DisplayName>String Handler</DisplayName>
<Parameters>
<Parameter name="input">Gladys Kravitz</Parameter>
<Parameter name="outputVariable">string.handler.output</Parameter>
</Parameters>
<SharedFlowBundle>StringHandler</SharedFlowBundle>
</FlowCallout>| По умолчанию | Н/Д |
| Присутствие |
Обязательно. |
| Тип | Н/Д |
Атрибуты
| Атрибут | Описание | По умолчанию | Тип поля | Тип |
|---|---|---|---|---|
| name | Название переменной времени выполнения, которую нужно создать с помощью этого параметра. | Нет. | Обязательно. | Строка |
| ref |
Переменная, содержащая значение, которое будет использоваться во время выполнения. Не указывайте этот атрибут, если вы задаете литеральное значение. |
Нет. | Необязательное поле. | Строка |
| value | Значение, которое будет использоваться в переменной времени выполнения, созданной с помощью этого параметра. Не указывайте этот атрибут, если вы задаете название переменной, которая должна быть источником значения. | Нет. | Необязательное поле. | Строка |
Элемент <Parameters>
Указывает набор элементов <Parameter>, которые будут переданы в качестве переменных в общий поток, вызываемый этим правилом.
Синтаксис
<Parameters> <Parameter name="parameter-name" value='parameter-value' /> </Parameters>
| По умолчанию | Н/Д |
| Присутствие |
Необязательное поле. |
| Тип | Н/Д |
Атрибуты
Нет.
Схемы
Переменные процесса
Переменные потока позволяют динамически изменять поведение правил и потоков во время выполнения на основе заголовков HTTP, контента сообщений или контекста потока. Подробнее о переменных потока…
| Переменная | Описание |
|---|---|
|
|
Область действия: во время выполнения общего процесса Значение атрибута name общего потока. |
|
|
Область действия: во время выполнения общего потока, прикрепленного к точке перехвата потока. Название хука потока. |
Справочник по ошибкам
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .
Ошибки выполнения
Эти ошибки могут возникнуть при выполнении политики.
| Код неисправности | Статус HTTP | Причина | Исправить |
|---|---|---|---|
flow.SharedFlowNotFound | 500 | Либо общий поток не существует, либо общий поток существует, но не развернут. | build |
Ошибки развертывания
Н/Д
Статьи по теме
- Создание общих потоков: многократно используемые общие потоки
- Выполнение общих потоков в нескольких прокси: прикрепление общего потока с помощью перехватчика потока