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:
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
- Sprawdź, czy problem występuje tylko wtedy, gdy oczekiwana jest odpowiedź inna niż
2XX. - W przypadku nieudanych żądań sprawdź, czy w przepływie proxy są zasady.
-
Śledź żądanie i sprawdź, czy zasada z
continueOnError="false"nie działa i nie powoduje błędu. - Jeśli tak, sprawdź, czy zasada AssignMessage CORS została wykonana w przepływie odpowiedzi o błędzie.
- Jeśli nie, to jest to przyczyna tego problemu.
Dzieje się tak, ponieważ gdy nie powiedzie się zasada z elementemcontinueOnError="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 powoduUnknown 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 powodzeniu w zintegrowanym portalu Wypróbuj ten interfejs API w panelu i w oknie Śledzenie proxy:
Rozwiązanie
- 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.
- 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
- Sprawdź wartość nagłówka Access-Control-Allow-Origin w sesji śledzenia.
- 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.
- 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ść. - Może się to zdarzyć, gdy użytkownik użył elementu
<Add> elementdla Access-Control-Allow-Origin w zasadzie lub gdy backend sam ustawia wiele wartości.
Przykład Access-Control-Allow-Origin równego *,*:
Przykład Access-Control-Allow-Origin równego *:
Przykład użycia <Add>:
Przykład użycia <Set>:
Rozwiązanie
- Zalecamy używanie
<Set> element(zamiast<Add> element) dla Access-Control-Allow-Origin , ponieważ dozwolona jest tylko 1 wartość. - 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