Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Krótki opis problemu
W odpowiedzi na wywołania interfejsu API aplikacja kliencka otrzymuje kod stanu HTTP 500 Internal Server Error
z kodem błędu protocol.http.BadPath
.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 500 Internal Server Error
Oprócz tego może pojawić się ten komunikat o błędzie:
{ "fault":{ "faultstring":"Invalid request path", "detail":{ "errorcode":"protocol.http.BadPath" } } }
Możliwe przyczyny
Ten błąd występuje, jeśli URL żądania serwera backendu, reprezentowany przez zmienną przepływu target.url
, zawiera element path
zaczynający się od znaku zapytania (?
) zamiast ukośnika (/
), co jest nieprawidłowe.
Zgodnie ze specyfikacją RFC 3986, sekcja 3: Komponenty składni i RFC 3986, sekcja 3.3: Ścieżka:
Składnia identyfikatora URI składa się z tych komponentów:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
- Komponent
path
jest wymagany i MUSI zaczynać się od ukośnika (/
) i zawsze zawierać ukośnik.
Dlatego jeśli URL żądania serwera backendu zawiera komponent path
rozpoczynający się od znaku zapytania (?
) zamiast ukośnika prawego (/
), Apigee Edge w odpowiedzi wysyła 500 Internal Server Error
i kod błędu protocol.http.BadPath
.
Jeśli np. target.url
zawiera wartość https://www.mocktarget.apigee.net?json
, ten błąd występuje, gdy path
jest nieprawidłowy, ponieważ zaczyna się od znaku zapytania (?
), a nie od ukośnika (/
).
Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
---|---|---|
Adres URL serwera backendu (target.url) ma nieprawidłową ścieżkę | Komponent ścieżki w adresie URL serwera backendu reprezentowany przez zmienną przepływu target.url zaczyna się od znaku zapytania (? ) zamiast ukośnika (/ ). |
Użytkownicy chmury publicznej i prywatnej usługi Edge |
Najczęstsze kroki diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub metod:
Monitorowanie interfejsów API
Procedura 1. Korzystanie z monitorowania interfejsów API
Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
- Wybierz przedział czasu, w którym zaobserwowano błędy.
Porównaj kod błędu z czasem.
Wybierz komórkę z kodem błędu
protocol.http.BadPath
, jak pokazano poniżej:Informacje o kodzie błędu
protocol.http.BadPath
są wyświetlane jak poniżej:Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
- W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
500
- Źródło błędu:
target
- Kod błędu:
protocol.http.BadPath
- Kod stanu:
- Jeśli źródło błędu to
target
, a kod błędu toprotocol.http.BadPath
, oznacza to, że adres URL serwera backendu ma nieprawidłową ścieżkę.
Trace
Procedura 2. Korzystanie z narzędzia do śledzenia
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz sesję śledzenia i
- Poczekaj na wystąpienie błędu
500 Internal Server Error
lub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API, aby go odtworzyć.
500 Internal Server Error
- Poczekaj na wystąpienie błędu
Sprawdź, czy opcja Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
Błąd zwykle pojawia się w przepływie po fazie rozpoczęcia docelowego przepływu żądania , jak pokazano poniżej:
Zapisz wartość błędu ze logu czasu:
błąd: nieprawidłowa ścieżka żądania
Ponieważ błąd jest zgłaszany przez Apigee Edge po fazie rozpoczęcia przepływu żądania docelowego, oznacza to, że adres URL serwera backendu ma nieprawidłową ścieżkę. Najczęściej dzieje się tak, gdy zmienna przepływu
target.url
(która reprezentuje adres URL serwera backendu) w Apigee Edge została zaktualizowana o nieprawidłową ścieżkę przez jedną z zasad w docelowym przepływie żądania.- Sprawdź sekcję Zmienne odczytane i przypisane w każdym kroku wstecz od ścieżki błędu do fazy rozpoczęcia docelowego przepływu żądania.
- Wskaż zasadę, w której została zaktualizowana
target.url
zmienna przepływu:Przykładowy ślad pokazujący aktualizację zasady JavaScriptu
target.url:
W przykładowym logu czasu pokazanym powyżej wartość zmiennej zmiennej przepływu
target.url
jest aktualizowana w zasadzie JavaScript o nazwieJS- SetTargetURL
w następujący sposób:target.url : https://mocktarget.apigee.net?json
- Pamiętaj, że wartość w
target.url
składa się z tych komponentów:- schemat:
https
- autorstwo:
mocktarget.apigee.net
- ścieżka:
?json
- schemat:
- Ponieważ komponent ścieżka zaczyna się od znaku zapytania (
?
), a nie od ukośnika (/
), pojawia się błądInvalid request path
. - Przejdź do fazy AX (rejestrowane dane Analytics) w logu czasu i kliknij ją.
Przewiń w dół do sekcji Szczegóły fazy – Nagłówki błędów i ustal wartości X-Apigee-fault-code oraz X-Apigee-fault-source, jak pokazano poniżej:
Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source odpowiednio
protocol.http.BadPath
itarget
, wskazując, że ten błąd jest spowodowany tym, że adres URL serwera backendu ma nieprawidłową ścieżkę.Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
NGINX
Procedura 3. Używanie dzienników dostępu NGINX
Aby zdiagnozować błąd przy użyciu logów dostępu NGINX:
- Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów dostępu NGINX do określenia kluczowych informacji o HTTP
500 Internal Server Error
. Sprawdź logi dostępu do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Sprawdź, czy występują jakieś
500
błędy z kodem błęduprotocol.http.BadPath
w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z500
. Jeśli znajdziesz błędy
500
z kodem X-Apigee-fault-code pasującym do wartości X-Apigee-fault-code , sprawdź wartość źródła błędów X-Apigee-fault-code .Przykładowy błąd 500 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodów X-Apigee- fault-code i X-Apigee-fault-source:
nagłówków, Wartość X-Apigee-fault-code protocol.http.BadPath
X-Apigee-fault-source target
Zauważ, że wartości X-Apigee-fault-code i X-Apigee-fault-source to
protocol.http.BadPath
oraztarget
, co oznacza, że ten błąd jest spowodowany tym, że adres URL serwera backendu ma nieprawidłową ścieżkę.
Przyczyna: adres URL serwera backendu (target.url) ma nieprawidłową ścieżkę
Diagnostyka
- Określ kod błędu i źródło błędu dla urządzenia
500 Internal Server Error
za pomocą logów dostępu API Monitoring, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z typowymi czynnościami diagnostycznymi. - Jeśli kod błędu to
protocol.http.BadPath
, a źródło błędu ma wartośćtarget
, oznacza to, że adres URL serwera backendu ma nieprawidłową ścieżkę. Adres URL serwera backendu jest reprezentowany przez zmienną przepływu
target.url
w Apigee Edge. Ten błąd występuje zwykle wtedy, gdy próbujesz dynamicznie zaktualizować adres URL serwera backendu (target.url
) przy użyciu dowolnej zasady (w ramach serwera proxy/przepływu współdzielonego) w docelowym przepływie żądań, tak aby miała nieprawidłową ścieżkę.Ustal, czy zmienna przepływu
target.url
rzeczywiście ma nieprawidłową ścieżkę i źródło jej wartości, korzystając z jednej z tych metod:Trace
Korzystanie z narzędzia do śledzenia
Jeśli udało Ci się zarejestrować log czasu związany z tym błędem, wykonaj czynności opisane w sekcji Używanie narzędzia do śledzenia i
- Sprawdź, czy adres
target.url
ma nieprawidłową ścieżkę, czyli czy zaczyna się od znaku zapytania (?
) zamiast ukośnika (/
). Jeśli tak, sprawdź zasadę, która zmodyfikowała lub zaktualizowała wartość
target.url
, tak aby zawierała nieprawidłową ścieżkę.Przykładowy ślad pokazujący aktualizację zasady JavaScriptu
target.url
- W powyższym przykładowym logu czasu można zauważyć, że zasada JavaScript zmodyfikowała lub zaktualizowała wartość
target.url
, tak aby zawierała nieprawidłową ścieżkę. - Pamiętaj, że
target.url
zawiera te komponenty:- schemat:
https
- autorstwo:
mocktarget.apigee.net
- ścieżka:
?json
Ścieżka zaczyna się od znaku zapytania (
?
) zamiast ukośnika (/
), dlatego jest nieprawidłowa. - schemat:
Logi
Używanie dzienników na serwerze logów
- Jeśli nie masz logu czasu związanego z tym błędem (przejściowym problemem), sprawdź, czy zapisano na serwerze logów informacje o wartości zmiennej przepływu
target.url
, korzystając z takich zasad jak MessageLogging lub ServiceCallout. - Jeśli masz logi, przejrzyj je i
- Sprawdź, czy ścieżka
target.url
jest nieprawidłowa i - Sprawdź, czy możesz ustalić informacje o tym, która zasada zmodyfikowała
target.url
tak, aby zawierała nieprawidłową ścieżkę
- Sprawdź, czy ścieżka
proxy interfejsu API
Sprawdzanie niedziałającego serwera proxy interfejsu API
Jeśli nie masz logu czasu ani logów dotyczących tego błędu, sprawdź serwer proxy interfejsu API, który nie działa, aby ustalić, co zmodyfikowało lub zaktualizowało zmienną przepływu
target.url
, tak aby zawierała nieprawidłową ścieżkę. Wykonaj te czynności:- Zasada w ramach serwera proxy interfejsu API
- Wszystkie udostępnione przepływy wywoływane z serwera proxy
- Sprawdź, czy adres
Dokładnie sprawdź konkretną zasadę (np. AssignMessage lub JavaScript), która modyfikuje lub aktualizuje zmienną przepływu
target.url
i ustal przyczynę aktualizacji zasadytarget.url
tak, aby zawierała nieprawidłową ścieżkę.Oto kilka przykładowych zasad, które nieprawidłowo aktualizują zmienną przepływu
target.url
, dodając nieprawidłową ścieżkę prowadzącą do tego błędu.Przykład 1
Przykład 1. Zasady JavaScriptu dotyczące aktualizowania zmiennej
target.url
var url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
W przykładzie powyżej zmienna przepływu
target.url
jest aktualizowana wartościąhttps://mocktarget.apigee.net?json
znajdującą się w innej zmiennejurl.
.Pamiętaj, że wartość elementu
url
składa się z tych komponentów:- schemat:
https
- autorstwo:
mocktarget.apigee.net
- ścieżka:
?json
Ścieżka zaczyna się od znaku zapytania (
?
) zamiast ukośnika (/
), co jest nieprawidłowe. Dlatego Apigee Edge zwraca500 Internal Server Error
z kodem błęduprotocol.http.BadPath
.Przykład 2
Przykład 2. Zasada JavaScript – aktualizowanie zmiennej
target.url
na podstawie wartości w nagłówku żądaniavar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
W powyższym przykładzie widać, że zmienna przepływu
target.url
jest aktualizowana przez konkatenację wartościhttps://mocktarget.apigee.net
zawartej w zmiennejurl
oraz wartości innej zmiennejpath
, której wartość jest pobierana z adresurequest.header.Path.
Jeśli masz dostęp do rzeczywistego żądania lub logu czasu, możesz zweryfikować rzeczywistą wartość przesłaną do
request.header.Path
.Przykładowe żądanie wysłane przez użytkownika
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
W tym przykładzie ścieżka nagłówka nie jest wysyłana w żądaniu. Dlatego wartość zmiennej
path
w zasadzie JavaScriptu wynosinull
.Przykłady:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + "?user"
target.url = https://mocktarget.apigee.net?user
Pamiętaj, że wartość
target.url
składa się z tych komponentów:- schemat:
https
- autorstwo:
mocktarget.apigee.net
- ścieżka:
?user
Ścieżka zaczyna się od znaku zapytania (
?
) zamiast ukośnika (/
), co jest nieprawidłowe. Z tego powodu Apigee Edge zwraca500 Internal Server Error
z kodem błęduprotocol.http.BadPath
.Przykład 3
Przykład 3. Zasady przypisywania wiadomości aktualizujące zmienną
target.url
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Pamiętaj, że wartość
url
składa się z tych komponentów:- schemat:
https
- autorstwo:
mocktarget.apigee.net
- ścieżka:
?echo
W tym przykładzie ścieżka zaczyna się od znaku zapytania (
?
), a nie od ukośnika (/
), co jest nieprawidłowe. Dlatego Apigee Edge zwraca500 Internal Server Error
z kodem błęduprotocol.http.BadPath
.- schemat:
Rozdzielczość
Zgodnie ze specyfikacją adresu URL
RFC 3986, sekcja 3. Komponenty, komponent path
jest wymagany i MUSI zawsze zaczynać się od „/”. Aby rozwiązać ten problem, wykonaj te czynności:
- Upewnij się, że URL serwera backendu reprezentowany przez zmienną przepływu
target.url
ma zawsze prawidłową ścieżkę i zawsze zaczyna się od ukośnika (/
).- W niektórych przypadkach nazwa zasobu w ścieżce może nie zawierać nazwy zasobu. Następnie sprawdź, czy ścieżka ma przynajmniej ukośnik (
/
). - Jeśli do określania wartości zmiennej przepływu
target.url
używasz innych zmiennych, upewnij się, że nie mają one nieprawidłowej ścieżki. - Jeśli wykonujesz operacje na ciągach znaków, aby określić wartość zmiennej przepływu
target.url
, upewnij się, że wynik operacji na ciągu znaków nie zawiera nieprawidłowej ścieżki.
- W niektórych przypadkach nazwa zasobu w ścieżce może nie zawierać nazwy zasobu. Następnie sprawdź, czy ścieżka ma przynajmniej ukośnik (
W przykładach opisanych powyżej możesz rozwiązać ten problem w sposób opisany poniżej:
Przykład 1
Przykład 1. Zasady JavaScriptu dotyczące aktualizowania zmiennej
target.url
Aby rozwiązać ten problem, użyj ukośnika (
/
) zamiast znaku zapytania (?
) w zmiennejurl
, aby rozwiązać ten problem w podany niżej sposób:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
Przykład 2
Przykład 2. Zasada JavaScript – aktualizowanie zmiennej
target.url
na podstawie wartości w nagłówku żądaniavar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Aby rozwiązać ten problem, podaj prawidłową ścieżkę, na przykład
/user
, w nagłówku żądaniaPath
:Przykładowe żądanie:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
Przykład 3
Przykład 3. Zasady przypisywania wiadomości aktualizujące zmienną
target.url
Dodaj prawidłową ścieżkę w elemencie
<Value>
w zasadzie AssignMessage. Aby rozwiązać ten problem, zastąp znak zapytania (?
) ukośnikiem (/
) w elemencie<Value>
i ustaw jego wartość nahttps://mocktarget.apigee.net/echo
:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Specyfikacja
Apigee Edge oczekuje, że komponent
path
w adresie URL serwera backendu MUSI zawsze zaczynać się od ukośnika prawego (/
) zgodnie z tymi specyfikacjami:Specyfikacja RFC 3986, sekcja 3. Komponenty składni RFC 3986, sekcja 3.3: Ścieżka Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Wymagane jest zbieranie informacji diagnostycznych.
Musisz zebrać informacje diagnostyczne
Jeśli problem nie ustąpi mimo wykonania powyższych instrukcji, zbierz poniższe informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:
- Nazwa organizacji
- Nazwa środowiska
- Nazwa serwera proxy interfejsu API
- Wykonaj polecenie
curl
użyte do odtworzenia elementu500 Internal Server Error
z kodem błęduprotocol.http.BadPath
- Plik śledzenia żądań interfejsu API
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Zaobserwowany pełny komunikat o błędzie dotyczący nieudanych żądań
- Nazwa środowiska
- Pakiet proxy interfejsu API
- Plik śledzenia żądań interfejsu API
Logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora wiadomości
/opt/apigee/var/log/edge-message- processor/logs/system.log
Odniesienia