Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. info
Krótki opis problemu
Aplikacja kliencka otrzymuje kod stanu HTTP 500 Internal Server Error z kodem błędu protocol.http.BadPath w odpowiedzi na wywołania interfejsu API.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 500 Internal Server Error
Możesz też zobaczyć 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 adres URL żądania serwera backendu, reprezentowany przez zmienną przepływu target.url, zawiera path , który zaczyna się od znaku zapytania (?) zamiast od ukośnika (/), co jest nieprawidłowe.
Zgodnie ze specyfikacjami RFC 3986, sekcja 3: Składniki składni i RFC 3986, sekcja 3.3: Ścieżka:
Składnia identyfikatora URI zawiera te komponenty:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- Komponent
pathjest wymagany i MUSI zaczynać się od ukośnika (/).
Jeśli więc adres URL żądania serwera backendu zawiera komponent path zaczynający się od znaku zapytania (?), a nie od ukośnika (/), Apigee Edge odpowiada kodem 500 Internal Server Error i kodem błędu protocol.http.BadPath.
Przykład: jeśli target.url ma wartość https://www.mocktarget.apigee.net?json, wystąpi ten błąd, ponieważ 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 publicznej i prywatnej chmury Edge |
Typowe etapy diagnostyki
Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub technik:
Monitorowanie interfejsów API
Procedura 1. Korzystanie z monitorowania interfejsu 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 interfejsu API > Zbadaj.
- Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
Wykreśl kod błędu na osi czasu.
Wybierz komórkę z kodem błędu
protocol.http.BadPath, jak pokazano poniżej:
Informacje o kodzie błędu
protocol.http.BadPathsą wyświetlane w sposób pokazany poniżej:
Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
- W oknie Dzienniki zanotuj 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 URL serwera backendu ma nieprawidłową ścieżkę.
Śledzenie
Procedura 2. Używanie narzędzia Śledzenie
Aby zdiagnozować błąd za pomocą narzędzia Trace:
- Włącz śledzenie sesji i wybierz jedną z tych opcji:
- Poczekaj na wystąpienie błędu
500 Internal Server Errorlub - 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 Pokaż wszystkie informacje o przepływach jest włączona:

- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
Błąd zwykle występuje w procesie po fazie Target Request Flow Started , jak pokazano poniżej:

Zanotuj wartość błędu z śladu:
Błąd: nieprawidłowa ścieżka żądania
Błąd jest zgłaszany przez Apigee Edge po fazie Target Request Flow Started, co oznacza, że adres URL serwera backendu ma nieprawidłową ścieżkę. Najprawdopodobniej dzieje się tak, gdy zmienna przepływu
target.url(reprezentująca adres URL serwera backendu) w Apigee Edge została zaktualizowana o nieprawidłową ścieżkę za pomocą jednej z zasad w przepływie żądania docelowego.- Sprawdź sekcję Variables Read and Assigned (Odczytane i przypisane zmienne) w każdym przepływie wstecz od przepływu błędu do fazy Target Request Flow Started (Rozpoczęto przepływ żądania docelowego).
- Określ zasadę, w której zaktualizowano zmienną przepływu
target.url:Przykładowy ślad pokazujący, że zasada JavaScriptu zaktualizowała zmienną przepływu
target.url:
W przykładowym śledzeniu powyżej zwróć uwagę na wartość zmiennej przepływu
target.url, która jest aktualizowana w zasadach JavaScriptu o nazwieJS- SetTargetURLw ten sposób:target.url : https://mocktarget.apigee.net?json - Wartość w
target.urlma te komponenty:- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
- scheme:
- Komponent ścieżki zaczyna się od znaku zapytania (
?), a nie od ukośnika (/), więc otrzymujesz błądInvalid request path. - W śladzie przejdź do fazy AX (Analytics Data Recorded) i kliknij ją.
Przewiń w dół do sekcji Szczegóły fazy – Nagłówki błędów i określ wartości X-Apigee-fault-code i X-Apigee-fault-source, jak pokazano poniżej:

Wartości X-Apigee-fault-code i X-Apigee-fault-source będą odpowiednio równe
protocol.http.BadPathitarget, co oznacza, że ten błąd jest spowodowany nieprawidłową ścieżką w adresie URL serwera backendu.Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source target
NGINX
Procedura 3. Korzystanie z dzienników dostępu NGINX
Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników dostępu NGINX do określania kluczowych informacji o żądaniach HTTP
500 Internal Server Error. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) nie ma żadnych
500błędów z kodem błęduprotocol.http.BadPathlub czy nadal występują żądania, które kończą się niepowodzeniem z kodem500. Jeśli znajdziesz błędy
500, w których X-Apigee-fault-code pasuje do wartościprotocol.http.BadPath, określ wartość X-Apigee-fault-source.Przykładowy błąd 500 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości dla X-Apigee-fault-code i X-Apigee-fault-source:
Nagłówki Wartość X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source targetZwróć uwagę, że wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio
protocol.http.BadPathitarget, 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
500 Internal Server Errorza pomocą usługi API Monitoring, narzędzia Trace Tool lub dzienników dostępu NGINX zgodnie z opisem w artykule Typowe kroki diagnostyczne. - Jeśli Kod błędu ma wartość
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.urlw Apigee Edge. Ten błąd zwykle występuje, gdy próbujesz dynamicznie zaktualizować adres URL serwera backendu (target.url) za pomocą dowolnych zasad (w przepływie proxy lub współdzielonym przepływie) w przepływie żądania docelowego, tak aby zawierał nieprawidłową ścieżkę.Sprawdź, czy zmienna przepływu
target.urlma nieprawidłową ścieżkę i źródło jej wartości, korzystając z jednej z tych metod:Śledzenie
Korzystanie z narzędzia Trace
Jeśli udało Ci się zarejestrować ślad tego błędu, wykonaj czynności opisane w sekcjach Korzystanie z narzędzia Trace i
- Sprawdź, czy
target.urlma nieprawidłową ścieżkę, czyli czy zaczyna się od znaku zapytania (?) zamiast od ukośnika (/). Jeśli tak, znajdź zasadę, która zmodyfikowała lub zaktualizowała wartość
target.url, tak aby zawierała nieprawidłową ścieżkę.Przykładowy ślad pokazujący, że zasada JavaScriptu zaktualizowała zmienną przepływu
target.url
- W powyższym przykładowym śledzeniu widać, że zasada JavaScript zmodyfikowała lub zaktualizowała wartość
target.url, tak aby zawierała nieprawidłową ścieżkę. - Pamiętaj, że
target.urlma te komponenty:- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
Ścieżka zaczyna się od znaku zapytania (
?) zamiast ukośnika (/), dlatego jest nieprawidłowa. - scheme:
Logi
Korzystanie z logów na serwerze logów
- Jeśli nie masz śladu tego błędu (problem występuje sporadycznie), sprawdź, czy informacje o wartości zmiennej przepływu
target.urlzostały zarejestrowane za pomocą zasad, takich jak MessageLogging lub ServiceCallout, na serwerze dziennika. - Jeśli masz logi, przejrzyj je i
- Sprawdź, czy
target.urlma nieprawidłową ścieżkę. - Sprawdź, czy możesz określić informacje o tym, które zasady zostały zmodyfikowane
target.url, aby zawierać nieprawidłową ścieżkę.
- Sprawdź, czy
Proxy interfejsu API
Sprawdzanie działającego nieprawidłowo serwera proxy interfejsu API
Jeśli nie masz śladu ani logów tego błędu, sprawdź nieprawidłowy serwer proxy interfejsu API, aby określić, co zmodyfikowało lub zaktualizowało zmienną przepływu
target.url, tak że zawiera ona nieprawidłową ścieżkę. Sprawdź, czy:- Zasady w serwerze proxy interfejsu API
- Wszystkie przepływy współdzielone wywoływane z proxy
- Sprawdź, czy
Dokładnie sprawdź konkretne zasady (np. AssignMessage lub JavaScript), które modyfikują lub aktualizują zmienną przepływu
target.url, i ustal przyczynę aktualizacjitarget.url, która powoduje nieprawidłową ścieżkę.Oto kilka przykładów zasad, które nieprawidłowo aktualizują zmienną przepływu
target.url, tak aby zawierała nieprawidłową ścieżkę, co powoduje ten błąd.Próbka 1
Przykład 1. Aktualizowanie zmiennej
target.urlzasady JavaScriptvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
W powyższym przykładzie zmienna przepływu
target.urljest aktualizowana wartościąhttps://mocktarget.apigee.net?jsonzawartą w innej zmiennejurl..Wartość
urlskłada się z tych elementów:- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
Ścieżka zaczyna się od znaku zapytania (
?) zamiast od ukośnika (/), co jest nieprawidłowe. Dlatego Apigee Edge zwraca500 Internal Server Errorz kodem błęduprotocol.http.BadPath.Próbka 2
Przykład 2. Aktualizowanie zmiennej
target.urlw zasadach JavaScriptu 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 zmienna przepływu
target.urljest aktualizowana przez połączenie wartościhttps://mocktarget.apigee.netzawartej w zmiennejurli wartości innej zmiennejpath, której wartość jest pobierana zrequest.header.Path..Jeśli masz dostęp do rzeczywistego żądania lub śladu, możesz sprawdzić rzeczywistą wartość przekazaną do funkcji
request.header.Path.Przykładowe żądanie przesł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 ramach żądania. Wartość zmiennej
pathw zasadach JavaScriptu tonull.Przykłady:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + "?user"target.url = https://mocktarget.apigee.net?user
Wartość
target.urlskłada się z tych elementów:- scheme:
https - authority:
mocktarget.apigee.net - path:
?user
Ścieżka zaczyna się od znaku zapytania (
?) zamiast od ukośnika (/), co jest nieprawidłowe. Dlatego Apigee Edge zwraca wartość500 Internal Server Errorz kodem błęduprotocol.http.BadPath.Próbka 3
Przykład 3. Aktualizowanie zmiennej
target.urlw zasadach AssignMessage<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ść
urlma te komponenty:- scheme:
https - authority:
mocktarget.apigee.net - path:
?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 Errorz kodem błęduprotocol.http.BadPath.- scheme:
Rozdzielczość
Zgodnie ze specyfikacją adresu URL
RFC 3986, sekcja 3: Składniki składni komponent path jest wymagany i musi zawsze zaczynać się od znaku „/”. Aby rozwiązać ten problem, wykonaj te czynności:
- Sprawdź, czy adres URL serwera backendu, reprezentowany przez zmienną przepływu
target.url, zawsze ma prawidłową ścieżkę i zawsze zaczyna się od ukośnika (/).- W niektórych przypadkach w ścieżce może nie być nazwy zasobu. Wtedy upewnij się, że ścieżka zawiera co najmniej ukośnik (
/). - Jeśli do określania wartości zmiennej przepływu używasz innych zmiennych
target.url, 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 tych operacji nie zawiera nieprawidłowej ścieżki.
- W niektórych przypadkach w ścieżce może nie być nazwy zasobu. Wtedy upewnij się, że ścieżka zawiera co najmniej ukośnik (
W przykładach omówionych powyżej możesz rozwiązać ten problem w sposób opisany poniżej:
Próbka 1
Przykład 1. Aktualizowanie zmiennej
target.urlzasady JavaScriptAby rozwiązać ten problem, użyj ukośnika (
/) zamiast znaku zapytania (?) w zmiennejurl, jak pokazano poniżej:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
Próbka 2
Przykład 2. Aktualizowanie zmiennej
target.urlw zasadach JavaScriptu 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, upewnij się, że w ramach nagłówka żądania
Pathprzekazujesz prawidłową ścieżkę, np./user, jak pokazano poniżej:Przykładowe żądanie:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
Próbka 3
Przykład 3. Aktualizacja zmiennej
target.urlw zasadzie AssignMessageDodaj prawidłową ścieżkę w elemencie
<Value>zasady AssignMessage. Oznacza to, że w elemencie<Value>musisz zastąpić znak zapytania (?) ukośnikiem prawym (/) i ustawić wartośćhttps://mocktarget.apigee.net/echo, aby rozwiązać ten problem, jak pokazano poniżej:<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
pathkomponent w adresie URL serwera backendu MUSI zawsze zaczynać się od ukośnika (/) zgodnie z tymi specyfikacjami:Specyfikacja RFC 3986, sekcja 3: Składniki składni RFC 3986, sekcja 3.3: Ścieżka Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.
musi zbierać informacje diagnostyczne;
Jeśli problem nadal występuje po wykonaniu powyższych instrukcji, zbierz te 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 proxy interfejsu API
- Polecenie
curlużyte do odtworzenia500 Internal Server Errorz kodem błęduprotocol.http.BadPath - Plik śledzenia żądań do interfejsu API
Jeśli jesteś użytkownikiem chmury Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie dotyczący żądań, które nie zostały zrealizowane
- Nazwa środowiska
- pakiet proxy interfejsu API,
- Plik śledzenia żądań do interfejsu API
Logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora komunikatów
/opt/apigee/var/log/edge-message- processor/logs/system.log
Odniesienia