Вы просматриваете документацию 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 |
Причина: Необработанная ошибка политики
Диагноз
- Убедитесь, что проблема возникает только в том случае, если ожидается ответ, отличный от
2XX. - В случае сбоя запросов убедитесь, что в потоке прокси-сервера присутствуют соответствующие политики.
- Проследите за запросом и проверьте, не завершается ли с ошибкой политика с
continueOnError="false"и не генерирует ли она ошибку. - Если да, то проверьте, была ли выполнена политика CORS AssignMessage в потоке обработки ошибок.
- В противном случае, это и есть причина проблемы.
Это происходит потому, что когда любая политика с элементомcontinueOnError="false"завершается с ошибкой, запрос переходит в поток обработки ошибок. Если в потоке обработки ошибок нет явной обработки ошибок, то отправляется ответ с ошибкой по умолчанию, соответствующий политике. Этот ответ с ошибкой не содержит заголовков CORS. В результате вызов API из интегрированного портала разработчика завершается сUnknown error.
На следующих скриншотах показаны примеры сообщения об ошибке и сообщения об успешном завершении операции.
Пример сообщения об ошибке во встроенном портале. Попробуйте эту панель API и окно трассировки прокси:


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


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


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


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


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


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