Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Что
Генерирует пользовательское сообщение в ответ на ошибку. Используйте RaiseFault для определения ответа об ошибке, который возвращается запрашивающему приложению при возникновении определенного условия.
Общую информацию об обработке ошибок см. в разделе «Обработка ошибок» .
Образцы
Возврат FaultResponse
В наиболее распространенном случае RaiseFault используется для возврата пользовательского ответа об ошибке запрашивающему приложению. Например, эта политика вернет код состояния 404 без полезной нагрузки:
<RaiseFault name="404">
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<FaultResponse>
<Set>
<StatusCode>404</StatusCode>
<ReasonPhrase>The resource requested was not found</ReasonPhrase>
</Set>
</FaultResponse>
</RaiseFault>Возврат полезной нагрузки FaultResponse
Более сложный пример включает возврат пользовательской полезной нагрузки ответа об ошибке, а также HTTP-заголовков и HTTP-кода состояния. В следующем примере ответ об ошибке заполняется XML-сообщением, содержащим HTTP-код состояния, полученный Edge от бэкэнд-сервиса, и заголовком, содержащим тип произошедшей ошибки:
<RaiseFault name="ExceptionHandler"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <FaultResponse> <Set> <Payload contentType="text/xml"> <root>Please contact support@company.com</root> </Payload> <StatusCode>{response.status.code}</StatusCode> <ReasonPhrase>Server error</ReasonPhrase> </Set> <Add> <Headers> <Header name="FaultHeader">{fault.name}</Header> </Headers> </Add> </FaultResponse> </RaiseFault>
Список всех переменных, доступных для динамического заполнения сообщений FaultResponse, см. в справочнике по переменным.
Обработка ошибок при вызове сервиса
О политике RaiseFault
Apigee Edge позволяет выполнять пользовательскую обработку исключений с помощью политики типа RaiseFault. Политика RaiseFault, аналогичная политике AssignMessage , позволяет генерировать пользовательский ответ об ошибке в случае её возникновения.
Используйте политику RaiseFault для определения ответа об ошибке, который возвращается запрашивающему приложению при возникновении определенной ситуации ошибки. Ответ об ошибке может состоять из HTTP-заголовков, параметров запроса и полезной нагрузки сообщения. Пользовательский ответ об ошибке может быть более полезен для разработчиков приложений и конечных пользователей, чем общие сообщения об ошибках или коды ответов HTTP.
При выполнении политика RaiseFault передает управление от текущего потока к потоку Error, который затем возвращает указанный ответ об ошибке запрашивающему клиентскому приложению. Когда поток сообщений переключается на поток Error, дальнейшая обработка политики не происходит. Все оставшиеся этапы обработки пропускаются, и ответ об ошибке возвращается непосредственно запрашивающему приложению.
RaiseFault можно использовать в ProxyEndpoint или TargetEndpoint. Обычно к политике RaiseFault добавляется условие . После выполнения RaiseFault Apigee выполнит обычную обработку ошибок, оценив правила обработки ошибок (FaultRules), или, если правила обработки ошибок не определены, прекратит обработку запроса.
Ссылка на элемент
В справочном документе по элементам описываются элементы и атрибуты политики RaiseFault.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1"> <DisplayName>RaiseFault 1</DisplayName> <FaultResponse> <AssignVariable> <Name/> <Value/> </AssignVariable> <Add> <Headers/> </Add> <Copy source="request"> <Headers/> <StatusCode/> <ReasonPhrase/> </Copy> <Remove> <Headers/> </Remove> <Set> <Headers/> <Payload/> <ReasonPhrase/> <StatusCode/> </Set> </FaultResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </RaiseFault>
атрибуты <RaiseFault>
<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">
В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:
| Атрибут | Описание | По умолчанию | Присутствие |
|---|---|---|---|
name | Внутреннее имя политики. Значение атрибута При необходимости используйте элемент | Н/Д | Необходимый |
continueOnError | Установите значение Установите значение | ЛОЖЬ | Необязательный |
enabled | Установите значение Установите значение | истинный | Необязательный |
async | Этот атрибут устарел. | ЛОЖЬ | Устарело |
Элемент <DisplayName>
Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.
<DisplayName>Policy Display Name</DisplayName>
| По умолчанию | Н/Д Если вы опустите этот элемент, будет использовано значение атрибута |
|---|---|
| Присутствие | Необязательный |
| Тип | Нить |
элемент <IgnoreUnresolvedVariables>
(Необязательно) Игнорирует любые неразрешенные ошибки переменных в потоке. Допустимые значения: true/false. По умолчанию true .
элемент <FaultResponse>
(Необязательно) Определяет ответное сообщение, возвращаемое запрашивающему клиенту. FaultResponse использует те же настройки, что и политика AssignMessage (недоступна в Apigee Edge для частного облака).
<FaultResponse><AssignVariable> элемент
Присваивает значение целевой переменной потока. Если переменная потока не существует, функция AssignVariable создает её.
Например, используйте следующий код для установки переменной с именем myFaultVar в политике RaiseFault:
<FaultResponse>
<AssignVariable>
<Name>myFaultVar</Name>
<Value>42</Value>
</AssignVariable>
...
</FaultResponse>Затем вы можете ссылаться на эту переменную в шаблонах сообщений в политике RaiseFault. Кроме того, политика, прикрепленная к правилу FaultRule, также может получить доступ к этой переменной. Например, следующая политика AssignMessage использует переменную, установленную в RaiseFault, для установки заголовка в ответе на сообщение об ошибке:
<AssignMessage enabled="true" name="Assign-Message-1"> <Add> <Headers> <Header name="newvar">{myFaultVar}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Элемент <AssignVariable> в политике RaiseFault использует тот же синтаксис, что и элемент <AssignVariable> в политике AssignMessage . Обратите внимание, что эта функциональность в настоящее время недоступна в Apigee Edge для частного облака.
<FaultResponse><Add>/<Headers> элемент
Добавляет HTTP-заголовки к сообщению об ошибке. Обратите внимание, что пустой заголовок <Add><Headers/></Add> не добавляет никаких заголовков. В этом примере значение переменной потока request.user.agent копируется в заголовок.
<Add>
<Headers>
<Header name="user-agent">{request.user.agent}</Header>
</Headers>
</Add>По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Нить |
<FaultResponse><Copy> элемент
Копирует информацию из сообщения, указанного в атрибуте source , в сообщение об ошибке.
<Copy source="request">
<Headers/>
<StatusCode/>
<ReasonPhrase/>
</Copy>По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Нить |
Атрибуты
<Copy source="response">
| Атрибут | Описание | Присутствие | Тип |
|---|---|---|---|
| источник | Указывает исходный объект для копирования.
| Необязательный | Нить |
<FaultResponse><Copy>/<Headers> элемент
Копирует указанный HTTP-заголовок из источника в сообщение об ошибке. Чтобы скопировать все заголовки, укажите <Copy><Headers/></Copy>.
<Copy source='request'>
<Headers>
<Header name="headerName"/>
</Headers>
</Copy>Если имеется несколько заголовков с одинаковым именем, используйте следующий синтаксис:
<Copy source='request'>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Copy>В этом примере копируются "h1", "h2" и второе значение "h3". Если "h3" содержит только одно значение, то оно не копируется.
По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Нить |
<FaultResponse><Copy>/<StatusCode> элемент
Код состояния HTTP, который необходимо скопировать из объекта, указанного атрибутом source, в сообщение об ошибке.
<Copy source='response'>
<StatusCode>404</StatusCode>
</Copy>По умолчанию: | ЛОЖЬ |
Присутствие: | Необязательный |
Тип: | Нить |
<FaultResponse><Copy>/<ReasonPhrase> элемент
Описание причины, которое необходимо скопировать из объекта, указанного атрибутом источника, в сообщение об ошибке.
<Copy source='response'>
<ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Copy>По умолчанию: | ЛОЖЬ |
Присутствие: | Необязательный |
Тип: | Нить |
<FaultResponse><Remove>/<Headers> элемент
Удаляет указанные HTTP-заголовки из сообщения об ошибке. Чтобы удалить все заголовки, укажите <Remove><Headers/></Remove> . В этом примере удаляется заголовок user-agent из сообщения.
<Remove>
<Headers>
<Header name="user-agent"/>
</Headers>
</Remove>Если имеется несколько заголовков с одинаковым именем, используйте следующий синтаксис:
<Remove>
<Headers>
<Header name="h1"/>
<Header name="h2"/>
<Header name="h3.2"/>
</Headers>
</Remove>В этом примере удаляются "h1", "h2" и второе значение "h3". Если "h3" имеет только одно значение, то оно не удаляется.
По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Нить |
<FaultResponse><Set> элемент
Задает информацию в сообщении об ошибке.
<Set> <Headers/> <Payload> </Payload> <StatusCode/> <ReasonPhrase/> </Set>
По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Н/Д |
<FaultResponse>/<Set>/<Headers> элемент
Устанавливает или перезаписывает HTTP-заголовки в сообщении об ошибке. Обратите внимание, что пустой заголовок <Set><Headers/></Set> не устанавливает никаких заголовков. В этом примере заголовок user-agent устанавливается равным переменной сообщения, указанной с помощью элемента <AssignTo> .
<Set>
<Headers>
<Header name="user-agent">{request.header.user-agent}</Header>
</Headers>
</Set>По умолчанию: | Н/Д |
Присутствие: | Необязательный |
Тип: | Нить |
<FaultResponse>/<Set>/<Payload> элемент
Задает содержимое сообщения об ошибке.
<Set> <Payload contentType="text/plain">test1234</Payload> </Set>
Задайте полезную нагрузку в формате JSON:
<Set> <Payload contentType="application/json"> {"name":"foo", "type":"bar"} </Payload> </Set>
В JSON-данные можно вставлять переменные, используя атрибуты variablePrefix и variableSuffix с разделительными символами, как показано в следующем примере.
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set>
Или, начиная с облачной версии 16.08.17, вы также можете использовать фигурные скобки для вставки переменных:
<Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set>
Задайте смешанную полезную нагрузку в XML:
<Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </Payload> </Set>
По умолчанию: | |
Присутствие: | Необязательный |
Тип: | Нить |
Атрибуты
<Payload contentType="content_type" variablePrefix="char" variableSuffix="char">
| Атрибут | Описание | Присутствие | Тип |
|---|---|---|---|
| contentType | Если указан параметр contentType, его значение присваивается заголовку | Необязательный | Нить |
| переменнаяПрефикс | При необходимости указывается начальный разделитель для переменной потока, поскольку в JSON-данных нельзя использовать символ "{" по умолчанию. | Необязательный | Чар |
| переменнаяСуффикс | При необходимости указывается завершающий разделитель для переменной потока, поскольку в JSON-данных нельзя использовать символ "}". | Необязательный | Чар |
<FaultResponse>/<Set>/<StatusCode> элемент
Устанавливает код состояния ответа.
<Set source='request'>
<StatusCode>404</StatusCode>
</Set>По умолчанию: | ЛОЖЬ |
Присутствие: | Необязательный |
Тип: | Логический |
<FaultResponse>/<Set>/<ReasonPhrase> элемент
Задает фразу-обоснование ответа.
<Set source='request'>
<ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Set>По умолчанию: | ЛОЖЬ |
Присутствие: | Необязательный |
Тип: | Логический |
<ShortFaultReason> элемент
Указывает на необходимость отображения краткого описания причины ошибки в ответе:
<ShortFaultReason>true|false</ShortFaultReason>
По умолчанию в ответе политики указывается следующая причина ошибки:
"fault":{"faultstring":"Raising fault. Fault name : Raise-Fault-1","detail":{"errorcode":"errorCode"}}}Чтобы сделать сообщение более читабельным, можно установить для элемента <ShortFaultReason> значение true, чтобы сократить строку faultstring до одного только имени политики:
"fault":{"faultstring":"Raise-Fault-1","detail":{"errorcode":"errorCode"}}}Допустимые значения: true/false (по умолчанию).
По умолчанию: | ЛОЖЬ |
Присутствие: | Необязательный |
Тип: | Логический |
Переменные потока
Переменные потока позволяют динамически управлять политиками и потоками во время выполнения на основе HTTP-заголовков, содержимого сообщений или контекста потока. После выполнения политики RaiseFault доступны следующие предопределенные переменные потока. Дополнительную информацию о переменных потока см. в справочнике по переменным .
| Переменная | Тип | Разрешение | Описание |
|---|---|---|---|
| fault.name | Нить | Только для чтения | При выполнении политики RaiseFault этой переменной всегда присваивается строковое значение RaiseFault . |
| fault.type | Нить | Только для чтения | Возвращает тип ошибки, указанный в сообщении об ошибке, а если он недоступен, то пустую строку. |
| категория неисправностей | Нить | Только для чтения | Возвращает категорию ошибки, указанную в сообщении об ошибке, а если она недоступна, то пустую строку. |
Пример использования функции RaiseFault
В следующем примере используется условие для проверки наличия queryparam с именем zipcode во входящем запросе. Если этот queryparam отсутствует, процесс вызовет ошибку с помощью функции RaiseFault:
<Flow name="flow-1">
<Request>
<Step>
<Name>RF-Error-MissingQueryParam</Name>
<Condition>request.queryparam.zipcode = null</Condition>
</Step>
...
</Request>
...
<Condition>(proxy.pathsuffix MatchesPath "/locations") and (request.verb = "GET")</Condition>
</Flow><RaiseFault name='RF-Error-MissingQueryParam'> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <FaultResponse> <Set> <Payload contentType='application/json'>{ "error" : { "code" : 400.02, "message" : "invalid request. Pass a zipcode queryparam." } } </Payload> <StatusCode>400</StatusCode> <ReasonPhrase>Bad Request</ReasonPhrase> </Set> </FaultResponse> </RaiseFault>
Ссылка на ошибку
В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые устанавливаются Edge, когда эта политика вызывает ошибку. Эту информацию важно знать, если вы разрабатываете правила обработки ошибок. Дополнительные сведения см. в разделах Что нужно знать об ошибках политики и Обработка ошибок .
Ошибки выполнения
Эти ошибки могут возникнуть при выполнении политики.
| Код неисправности | Статус HTTP | Причина |
|---|---|---|
steps.raisefault.RaiseFault | 500 | См. строку ошибки. |
Ошибки развертывания
Никто.
Переменные неисправности
Эти переменные устанавливаются при возникновении ошибки во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .
| Переменные | Где | Пример |
|---|---|---|
fault.name=" fault_name " | fault_name — это имя ошибки, как указано в таблице ошибок времени выполнения выше. Имя неисправности — это последняя часть кода неисправности. | fault.name = "RaiseFault" |
raisefault. policy_name .failed | policy_name — указанное пользователем имя политики, вызвавшей ошибку. | raisefault.RF-ThrowError.failed = true |
Пример ответа об ошибке
{ "fault":{ "detail":{ "errorcode":"steps.raisefault.RaiseFault" }, "faultstring":"Raising fault. Fault name: [name]" } }
Схема
Каждый тип политики определяется XML-схемой ( .xsd ). Для справки, схемы политик доступны на GitHub.
Связанные темы
См. раздел «Обработка ошибок».