Nieznany błąd w tym panelu interfejsu API

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

Wywołanie interfejsu API z zintegrowanego portalu dla programistów kończy się niepowodzeniem z powodu Unknown Error lub pustej odpowiedzi w panelu Wypróbuj ten interfejs API.

Komunikaty o błędach

W przypadku żądań interfejsu API w zintegrowanym portalu może się pojawić pusta odpowiedź lub ten komunikat o błędzie:

Unknown Error

Na karcie Narzędzia dla deweloperów > Konsola zobaczysz ten błąd:

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.

Ogólny komunikat o błędzie widoczny na karcie Narzędzia dla deweloperów > Konsola wygląda tak:

ogólny komunikat o błędzie, kliknij, aby powiększyć obraz ogólny komunikat o błędzie,

Możliwe przyczyny

Przyczyna Opis Instrukcje rozwiązywania problemów, które mają zastosowanie do
Nieobsłużony błąd zasady Gdy w przepływie wykonania żądania do interfejsu API nie powiedzie się żadna zasada, wysyłana jest domyślna odpowiedź o błędzie bez nagłówków CORS. Użytkowników Edge Public Cloud
Wiele wartości Access-Control-Allow-Origin Używanie Add zamiast Set w zasadzie Assign Message. Użytkowników Edge Public Cloud

Przyczyna: nieobsłużony błąd zasady

Diagnostyka

  1. Sprawdź, czy problem występuje tylko wtedy, gdy oczekiwana jest odpowiedź inna niż 2XX.
  2. W przypadku nieudanych żądań sprawdź, czy w przepływie proxy są zasady.
  3. Śledź żądanie i sprawdź, czy zasada z continueOnError="false" nie działa i nie powoduje błędu.
    1. Jeśli tak, sprawdź, czy zasada AssignMessage CORS została wykonana w przepływie odpowiedzi o błędzie.
    2. Jeśli nie, to jest to przyczyna tego problemu.
      Dzieje się tak, ponieważ gdy nie powiedzie się zasada z elementem continueOnError="false" , żądanie przechodzi do przepływu odpowiedzi o błędzie. Jeśli w przepływie odpowiedzi o błędzie nie ma wyraźnej obsługi błędów, wysyłana jest domyślna odpowiedź o błędzie odpowiadająca zasadzie. Ta odpowiedź o błędzie nie zawiera żadnych nagłówków CORS. W rezultacie wywołanie interfejsu API z zintegrowanego portalu dla deweloperów kończy się niepowodzeniem z powodu Unknown error.

Na tych zrzutach ekranu widać przykładowy komunikat o błędzie i przykładowy komunikat o powodzeniu.

Przykładowy komunikat o błędzie w zintegrowanym portalu Wypróbuj ten interfejs API w panelu i w oknie Śledzenie proxy:

przykładowy komunikat o błędzie, kliknij, aby powiększyć obraz przykładowy komunikat o błędzie,

Przykładowy komunikat o powodzeniu w zintegrowanym portalu Wypróbuj ten interfejs API w panelu i w oknie Śledzenie proxy:

przykładowy komunikat o sukcesie, kliknij, aby powiększyć obraz przykładowy komunikat o powodzeniu

Rozwiązanie

  1. Zamiast polegać na domyślnym komunikacie o błędzie, musisz wdrożyć regułę błędu, która będzie obsługiwać odpowiedź o błędzie. Dołącz zasadę AssignMessage CORS z odpowiednimi nagłówkami i wywołaj ją w FaultRule.
  2. Czasami może się okazać, że nie można zdefiniować reguły błędu dla każdego błędu. Dlatego można wdrożyć domyślną regułę błędu, która będzie wykonywać zasadę 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>

Przyczyna: wiele wartości Access-Control-Allow-Origin

Diagnostyka

  1. Sprawdź wartość nagłówka Access-Control-Allow-Origin w sesji śledzenia.
  2. Nagłówek Access-Control-Allow-Origin umożliwia ustawienie tylko jednej wartości do ustawienia. Ustawienie więcej niż 1 wartości może spowodować problem z CORS, a portal dla deweloperów nie będzie mógł renderować żadnych odpowiedzi.
  3. Jeśli wartość nagłówka Access-Control-Allow-Origin w śledzeniu wygląda tak:
    *,*
    oznacza to, że zarówno serwer docelowy, jak i zasada AssignMessage CORS ustawiają jego wartość.
  4. Może się to zdarzyć, gdy użytkownik użył elementu <Add> element dla Access-Control-Allow-Origin w zasadzie lub gdy backend sam ustawia wiele wartości.

Przykład Access-Control-Allow-Origin równego *,*:

przykład użycia wielu wartości, kliknij, aby wyświetlić większy obraz przykład użycia wielu wartości,

Przykład Access-Control-Allow-Origin równego *:

przykład użytej pojedynczej wartości, kliknij, aby powiększyć obraz użyta przykładowa pojedyncza wartość.

Przykład użycia <Add>:

Przykład użycia opcji Dodaj (kliknij, aby powiększyć obraz) Przykład użycia funkcji Add

Przykład użycia <Set>:

Przykład użycia opcji Ustaw. Kliknij, aby powiększyć obraz. przykład użycia funkcji Set

Rozwiązanie

  1. Zalecamy używanie <Set> element (zamiast <Add> element) dla Access-Control-Allow-Origin , ponieważ dozwolona jest tylko 1 wartość.
  2. Możesz też ustawić nagłówek Access-Control-Allow-Origin tylko w 1 miejscu – w zasadzie AssignMessage CORS lub na serwerze docelowym.
<?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>

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.

Informacje diagnostyczne, które musisz zebrać

Zbierz te informacje diagnostyczne, a potem skontaktuj się z zespołem pomocy Apigee Edge:

  • Nazwa organizacji
  • Nazwa środowiska
  • Nazwa proxy interfejsu API
  • Pełne polecenie curl użyte do odtworzenia błędu
  • Plik śledzenia żądań interfejsu API
  • Pełne dane wyjściowe odpowiedzi z serwera docelowego lub backendu wraz z rozmiarem ładunku