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

Вы просматриваете документацию по 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 Использование Add вместо Set в Assign Message Policy. Пользователи Edge Public Cloud

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

Диагноз

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

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

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

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

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

пример сообщения об успехе, нажмите, чтобы увеличить изображениепример сообщения об успехе

Разрешение

  1. Вместо того, чтобы полагаться на сообщение об ошибке по умолчанию, необходимо реализовать правило ошибки для обработки ответа об ошибке. Включите политику CORS AssignMessage с соответствующими заголовками и вызовите ее в FaultRule .
  2. Иногда может оказаться невозможным определить правило отказа для каждого отказа; поэтому можно реализовать правило ошибки по умолчанию для выполнения политики 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.

Диагноз

  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, равный *,* :

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

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

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

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

пример с использованием Добавить, нажмите, чтобы увеличить изображениепример Использование добавления

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

пример с использованием набора, нажмите, чтобы увеличить изображениепример с использованием Set

Разрешение

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