Правило RaiseFault

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Что

Создает специальное сообщение в ответ на ошибку. Используйте 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. Если правило находится в потоке ответов, по умолчанию используется объект response. Если вы не укажете 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, который нужно скопировать из объекта, указанного в атрибуте источника, в сообщение об ошибке.

<Copy source='response'>
    <StatusCode>404</StatusCode>      
</Copy>

По умолчанию:

false

Присутствие

Необязательно

Тип:

Строка

Элемент <FaultResponse><Copy>/<ReasonPhrase>

Описание причины, которое нужно скопировать из объекта, указанного в атрибуте источника, в сообщение об ошибке.

<Copy source='response'>     
    <ReasonPhrase>The resource requested was not found.</ReasonPhrase>     
</Copy>

По умолчанию:

false

Присутствие

Необязательно

Тип:

Строка

Элемент <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

Если указан тип контента, его значение присваивается заголовку Content-Type.

Необязательно Строка
variablePrefix Позволяет указать начальный разделитель для переменной потока, поскольку в полезной нагрузке JSON нельзя использовать символ "{", заданный по умолчанию. Необязательно Char
variableSuffix Необязательный параметр, который позволяет указать конечный разделитель для переменной потока, поскольку в полезной нагрузке JSON нельзя использовать символ "}", заданный по умолчанию. Необязательно Char

Элемент <FaultResponse>/<Set>/<StatusCode>

Задает код статуса ответа.

<Set source='request'>
    <StatusCode>404</StatusCode>
</Set>

По умолчанию:

false

Присутствие

Необязательно

Тип:

Логическое значение

Элемент <FaultResponse>/<Set>/<ReasonPhrase>

Задает фразу причины ответа.

<Set source='request'>     
    <ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Set>

По умолчанию:

false

Присутствие

Необязательно

Тип:

Логическое значение

Элемент <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(по умолчанию).

По умолчанию:

false

Присутствие

Необязательно

Тип:

Логическое значение

Переменные процесса

Переменные потока позволяют динамически изменять поведение правил и потоков во время выполнения на основе заголовков HTTP, контента сообщений или контекста потока. После выполнения правила RaiseFault доступны следующие стандартные переменные потока: Подробнее о переменных потока…

Переменная Тип Разрешение Описание
fault.name Строка Только чтение Когда выполняется правило RaiseFault, эта переменная всегда имеет значение строки RaiseFault.
fault.type Строка Только чтение Возвращает тип ошибки, а если он недоступен – пустую строку.
fault.category Строка Только чтение Возвращает категорию ошибки, указанную в ошибке, или пустую строку, если категория недоступна.

Пример использования 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.

Статьи по теме

Подробнее об обработке ошибок…