Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Вызов 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.
Общее сообщение об ошибке, отображаемое на вкладке «Инструменты разработчика» > «Консоль», выглядит следующим образом:


Возможные причины
| Причина | Описание | Инструкции по устранению неполадок применимы для |
|---|---|---|
| Необработанная ошибка политики | Ответ об ошибке по умолчанию отправляется без заголовков CORS, если какая-либо политика завершается сбоем в потоке выполнения запроса API. | Пользователи Edge Public Cloud |
| Несколько значений для Access-Control-Allow-Origin | Использование «Добавить» вместо «Установить» в разделе «Назначить политику сообщений». | Пользователи Edge Public Cloud |
Причина: необработанная ошибка политики.
Диагностика
- Убедитесь, что проблема возникает только в том случае, если ожидается ответ, отличный от
2XX. - В случае неудачных запросов убедитесь, что в потоке прокси-сервера присутствуют политики.
- Отследите запрос и проверьте, не происходит ли сбой политики с
continueOnError="false"и не возникает ли ошибка. - Если да, проверьте, была ли выполнена политика AssignMessage CORS в потоке ответов об ошибках.
- Если нет, то это причина этой проблемы.
Это связано с тем, что при сбое какой-либо политики с элементомcontinueOnError="false"запрос попадает в поток ответа об ошибке. Если в потоке ответов об ошибках нет явной обработки ошибок, обратно отправляется ответ об ошибке по умолчанию, соответствующий политике. Этот ответ об ошибке не имеет заголовков CORS. В результате вызов API с интегрированного портала разработчика завершается сUnknown error.
На следующих снимках экрана показаны пример сообщения об ошибке и пример сообщения об успехе.
Пример сообщения об ошибке на интегрированном портале . Попробуйте эту панель API и в окне трассировки прокси:


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


Разрешение
- Вместо того, чтобы полагаться на сообщение об ошибке по умолчанию, необходимо реализовать правило ошибки для обработки ответа об ошибке. Включите политику AssignMessage CORS с соответствующими заголовками и вызовите ее в FaultRule .
- Иногда может оказаться невозможным определить правило неисправности для каждой неисправности; поэтому можно реализовать правило ошибки по умолчанию для выполнения политики AssignMessage CORS:
<?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.
Диагностика
- Проверьте значение заголовка Access-Control-Allow-Origin в сеансе трассировки .
- Заголовок Access-Control-Allow-Origin позволяет установить только одно значение. Установка более одного значения может вызвать проблему CORS, и портал разработчика не сможет предоставить какие-либо ответы.
- Если значение заголовка Access-Control-Allow-Origin в трассировке выглядит так:
*,*это означает, что и целевой сервер, и политика AssignMessage CORS устанавливают его значение. - Это может произойти, если пользователь использовал
<Add> elementдля Access-Control-Allow-Origin в политике или сама серверная часть устанавливает несколько значений.
Пример Access-Control-Allow-Origin, равный *,* :


Пример Access-Control-Allow-Origin, равный * :


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


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


Разрешение
- Рекомендуемый подход — использовать
<Set> element(вместо<Add> element) для Access-Control-Allow-Origin, поскольку допускается только одно значение. - Альтернативно, установите заголовок Access-Control-Allow-Origin только в одном месте; либо политика AssignMessage CORS , либо целевой сервер.
<?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-прокси
- Полная команда завитка, используемая для воспроизведения ошибки
- Файл трассировки запросов API
- Полный вывод ответа от целевого/внутреннего сервера вместе с размером полезной нагрузки.