Политика RaiseFault

Вы просматриваете документацию 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

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

элемент <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">
Атрибут Описание Присутствие Тип
источник

Указывает исходный объект для копирования.

  • Если параметр source не указан, он рассматривается как простое сообщение. Например, если политика находится в потоке запроса, то в качестве источника по умолчанию используется объект запроса . Если политика находится в потоке ответа, то по умолчанию используется объект ответа . Если вы опустите параметр source , вы можете использовать абсолютную ссылку на переменную потока в качестве источника копии. Например, укажите значение как {request.header.user-agent} .
  • Если исходная переменная не может быть разрешена или имеет тип, отличный от сообщения, переменная <Copy> не отвечает.
Необязательный Нить

<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, его значение присваивается заголовку Content-Type .

Необязательный Нить
переменнаяПрефикс При необходимости указывается начальный разделитель для переменной потока, поскольку в 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:
<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.

Связанные темы

См. раздел «Обработка ошибок».