Неизвестная ошибка в панели Попробуйте этот API

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

Симптом

Вызов API из интегрированного портала разработчика завершается с Unknown Error или пустым ответом на панели "Попробовать этот API" .

Сообщения об ошибках

Встроенный портал может отображать пустой ответ или следующее сообщение об ошибке для запросов API:

Unknown Error

На вкладке «Инструменты разработчика» > «Консоль» вы увидите следующую ошибку:

Access to XMLHTTPRequest at 'API_URL' from origin 'URL_of_Integrated_DevPortal'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is
present on the requested resource.

В разделе «Инструменты разработчика» > «Консоль» отображается следующее стандартное сообщение об ошибке:

Общее сообщение об ошибке, нажмите для увеличения изображения.общее сообщение об ошибке

Возможные причины

Причина Описание Инструкции по устранению неполадок, применимые для
Необработанная ошибка политики В случае сбоя какой-либо политики в процессе выполнения запроса к API, по умолчанию отправляется ответ об ошибке без заголовков CORS. Пользователи Edge Public Cloud
Несколько значений для параметра Access-Control-Allow-Origin Используйте «Добавить» вместо «Установить» в политике назначения сообщений. Пользователи Edge Public Cloud

Причина: Необработанная ошибка политики

Диагноз

  1. Убедитесь, что проблема возникает только в том случае, если ожидается ответ, отличный от 2XX .
  2. В случае сбоя запросов убедитесь, что в потоке прокси-сервера присутствуют соответствующие политики.
  3. Проследите за запросом и проверьте, не завершается ли с ошибкой политика с continueOnError="false" и не генерирует ли она ошибку.
    1. Если да, то проверьте, была ли выполнена политика CORS AssignMessage в потоке обработки ошибок.
    2. В противном случае, это и есть причина проблемы.
      Это происходит потому, что когда любая политика с элементом continueOnError="false" завершается с ошибкой, запрос переходит в поток обработки ошибок. Если в потоке обработки ошибок нет явной обработки ошибок, то отправляется ответ с ошибкой по умолчанию, соответствующий политике. Этот ответ с ошибкой не содержит заголовков CORS. В результате вызов API из интегрированного портала разработчика завершается с Unknown error .

На следующих скриншотах показаны примеры сообщения об ошибке и сообщения об успешном завершении операции.

Пример сообщения об ошибке во встроенном портале. Попробуйте эту панель API и окно трассировки прокси:

Пример сообщения об ошибке (нажмите для увеличения изображения)пример сообщения об ошибке

Пример сообщения об успешном завершении в интегрированном портале. Попробуйте эту панель API и окно трассировки прокси:

Пример сообщения об успешном завершении (нажмите для увеличения изображения).пример сообщения об успешном завершении

Разрешение

  1. Вместо использования стандартного сообщения об ошибке необходимо реализовать правило обработки ошибок. Включите политику CORS AssignMessage с соответствующими заголовками и вызовите её в правиле обработки ошибок (FaultRule) .
  2. В некоторых случаях определение отдельного правила обработки ошибок для каждой ошибки может быть нецелесообразным; поэтому можно реализовать правило обработки ошибок по умолчанию для выполнения политики CORS AssignMessage:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="proxy-endpoint-name">
    <Description/>
    <!-- Add a default fault rule to add CORS -->
    <DefaultFaultRule name="fault-rule">
        <Step>
            <Name>add-cors</Name>
        </Step>
    </DefaultFaultRule>
    <FaultRules/>
    <!--
    <Flows />
    Rest of the proxy definition
    -->
</ProxyEndpoint>

Причина: Множественные значения параметра Access-Control-Allow-Origin

Диагноз

  1. Проверьте значение заголовка Access-Control-Allow-Origin в сеансе трассировки .
  2. Заголовок Access-Control-Allow-Origin позволяет задать только одно значение. Установка более одного значения может вызвать проблему CORS, и портал разработчика не сможет отобразить ответы.
  3. Если значение заголовка Access-Control-Allow-Origin в трассировке выглядит следующим образом:
    *,*
    Это означает, что и целевой сервер, и политика CORS AssignMessage устанавливают его значение.
  4. Это может произойти, если пользователь использовал <Add> element для параметра Access-Control-Allow-Origin в политике, или если бэкэнд сам устанавливает несколько значений.

Пример: Access-Control-Allow-Origin equal to *,* :

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

Пример параметра Access-Control-Allow-Origin : * :

Пример использованного единственного значения, нажмите для увеличения изображения.пример использования одного значения

Пример использования <Add> :

Пример использования функции «Добавить», нажмите для увеличения изображения.пример использования функции «Добавить»

Пример использования <Set> :

Пример использования множества (нажмите для увеличения изображения).пример использования множества

Разрешение

  1. Рекомендуемый подход заключается в использовании <Set> element (вместо <Add> element ) для параметра Access-Control-Allow-Origin, поскольку допускается только одно значение.
  2. В качестве альтернативы, можно установить заголовок Access-Control-Allow-Origin только в одном месте: либо в политике CORS AssignMessage , либо на целевом сервере.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="set-cors">
    <DisplayName>Set CORS</DisplayName>
    <FaultRules/>
    <Properties/>
    <Set>
        <Headers>
            <Header name="Access-Control-Allow-Origin">*</Header>
        </Headers>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

Если вам по-прежнему нужна помощь службы поддержки Apigee, перейдите по ссылке «Необходимо собрать диагностическую информацию» .

Необходимо собрать диагностическую информацию.

Соберите следующую диагностическую информацию, а затем свяжитесь со службой поддержки Apigee Edge :

  • Название организации
  • Название среды
  • Имя API-прокси
  • Полная команда curl, использованная для воспроизведения ошибки.
  • Файл трассировки для запросов API
  • Полный вывод ответа от целевого/бэкэнд-сервера, а также размер полезной нагрузки.