500 Internal Server Error - EmptyPath

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Sintomo

L'applicazione client riceve un codice di stato HTTP 500 Internal Server Error con il codice di errore protocol.http.EmptyPath come risposta per le chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 500 Internal Server Error

Inoltre, potresti visualizzare il seguente messaggio di errore:

{
   "fault":{
      "faultstring":"Request path cannot be empty",
      "detail":{
         "errorcode":"protocol.http.EmptyPath"
      }
   }
}

Possibili cause

Questo errore si verifica se l'URL della richiesta del server di backend, rappresentato dalla variabile di flusso target.url, contiene un percorso vuoto.

Come da specifiche RFC 3986, sezione 3: Componenti della sintassi e RFC 3986, sezione 3.3: Percorso:

  1. La sintassi URI è costituita dai seguenti componenti:

            foo://example.com:8042/over/there?name=ferret#nose
            \_/   \______________/\_________/ \_________/ \__/
             |            |            |            |       |
          scheme      authority       path        query   fragment
    
  2. Il componente path è obbligatorio e DEVE sempre avere una barra (/), anche se non ci sono altri caratteri nel percorso.

Pertanto, se l'URL della richiesta del server di backend non ha il componente path, ovvero non ha nemmeno una barra (/), Apigee Edge risponde con 500 Internal Server Error e il codice di errore protocol.http.EmptyPath.

Ad esempio: se target.url ha il valore https://www.mocktarget.apigee.net, si verifica questo errore perché il componente path è vuoto o mancante.

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
L'URL del server di backend (target.url) ha un percorso vuoto L'URL del server di backend rappresentato dalla variabile di flusso target.url ha un percorso vuoto. Utenti di Edge Public e Private Cloud

Passaggi di diagnostica comuni

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Monitoraggio delle API

Procedura 1: utilizzo del monitoraggio delle API

Per diagnosticare l'errore utilizzando API Monitoring:

  1. Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
  2. Passa all'organizzazione in cui vuoi esaminare il problema.

  3. Vai alla pagina Analizza > Monitoraggio API > Esamina.
  4. Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
  5. Traccia il codice di errore rispetto al tempo.

  6. Seleziona una cella con il codice di errore protocol.http.EmptyPath, come mostrato di seguito:

  7. Le informazioni sul codice di errore protocol.http.EmptyPath vengono visualizzate come mostrato di seguito:

  8. Fai clic su Visualizza log per espandere la riga della richiesta non riuscita.

  9. Nella finestra Log, prendi nota dei seguenti dettagli:
    • Codice di stato: 500
    • Origine del guasto: target
    • Codice guasto: protocol.http.EmptyPath
  10. Se l'origine del guasto è target e il codice di errore è protocol.http.EmptyPath, significa che l'URL del server di backend ha un percorso vuoto.

Traccia

Procedura n. 2: utilizzo dello strumento Trace

Per diagnosticare l'errore utilizzando lo strumento Trace:

  1. Attiva l'opzione Traccia sessione e
    • Attendi che si verifichi l'errore 500 Internal Server Error oppure
    • Se riesci a riprodurre il problema, effettua la chiamata API per riprodurlo 500 Internal Server Error
  2. Assicurati che l'opzione Mostra tutte le informazioni sul flusso sia abilitata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Esamina le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
  5. In genere, l'errore si verifica in un flusso dopo la fase Target Request Flow Started, come mostrato di seguito:

  6. Prendi nota del valore dell'errore dalla traccia.

    error: Request path cannot be empty

    Poiché l'errore viene generato da Apigee Edge dopo la fase Target Request Flow Started, indica che path nell'URL del server di backend è vuoto. Ciò si verifica molto probabilmente se la variabile di flusso target.url (che rappresenta l'URL per il server di backend) è stata aggiornata con un percorso vuoto tramite uno dei criteri nel flusso di richiesta.

  7. Esamina la sezione Variabili lette e assegnate in ciascuno dei flussi a ritroso dal punto di errore alla fase Flusso di richiesta di destinazione avviato.
  8. Determina il criterio in cui viene aggiornata la variabile di flusso target.url .

    Traccia di esempio che mostra che la norma JavaScript ha aggiornato la variabile di flusso target.url:

    Nella traccia di esempio mostrata sopra, nota che il valore della variabile di flusso variabile target.url viene aggiornato in una policy JavaScript denominata SetTargetURL come segue:

    target.url : https://mocktarget.apigee.net
  9. Tieni presente che target.url è composto dai seguenti componenti:
    • scheme: https://mocktarget.apigee.net
    • path: vuoto
  10. Pertanto, viene visualizzato l'errore Request path cannot be empty.
  11. Vai alla fase AX (dati di Analytics registrati) nella traccia e fai clic.
  12. Scorri verso il basso fino alla sezione Dettagli fase - Intestazioni errori e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

  13. Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source come protocol.http.EmptyPath e target rispettivamente, a indicare che questo errore è causato dal fatto che l'URL del server di backend ha un percorso vuoto.
    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

NGINX

Procedura n. 3: utilizzo dei log di accesso NGINX

Per diagnosticare l'errore utilizzando i log di accesso NGINX:

  1. Se sei un utente di Private Cloud, puoi utilizzare i log di accesso NGINX per determinare le informazioni chiave su HTTP 500 Internal Server Error.
  2. Controlla i log di accesso di NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. Cerca se sono presenti errori 500 con codice di errore protocol.http.EmptyPath durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste ancora non riuscite con 500.
  4. Se trovi errori 500 con X-Apigee-fault-code che corrisponde al valore di protocol.http.EmptyPath, determina il valore di X-Apigee-fault-source.

    Esempio di errore 500 dal log di accesso NGINX:

    La voce di esempio riportata sopra del log di accesso NGINX ha i seguenti valori per X- Apigee-fault-code e X-Apigee-fault-source:

    Intestazioni Valore
    X-Apigee-fault-code protocol.http.EmptyPath
    X-Apigee-fault-source target

    Nota che i valori di X-Apigee-fault-code e X-Apigee-fault-source sono protocol.http.EmptyPath e target rispettivamente, il che indica che questo errore è causato dal fatto che l'URL del server di backend ha un percorso vuoto.

Causa: l'URL del server di backend (target.url) ha un percorso vuoto

Diagnosi

  1. Determina il codice di errore e l'origine dell'errore per 500 Internal Server Error utilizzando API Monitoring, Trace Tool o i log di accesso NGINX come spiegato in Passaggi comuni per la diagnosi.
  2. Se il codice di errore è protocol.http.EmptyPath e l'origine errore ha il valore target, significa che l'URL del server di backend ha un percorso vuoto.
  3. L'URL del server di backend è rappresentato dalla variabile di flusso target.url in Apigee Edge. Questo errore si verifica in genere se tenti di aggiornare l'URL del server di backend, ovvero target.url dinamicamente utilizzando una delle norme (all'interno del proxy/flusso condiviso) nel flusso di richieste di destinazione, in modo che abbia un percorso vuoto.

  4. Determina se la variabile di flusso target.url ha effettivamente un percorso vuoto e la sorgente del suo valore utilizzando uno dei seguenti passaggi:

    Traccia

    Utilizzo dello strumento Trace

    Se hai acquisito una traccia per questo errore, segui i passaggi descritti in Utilizzo dello strumento Trace e:

    1. Verifica se target.url ha un percorso vuoto.
    2. In caso affermativo, scopri quale norma ha modificato o aggiornato il valore di target.url in modo che contenga un percorso vuoto.

      Esempio di traccia che mostra la variabile di flusso aggiornata dal criterio JavaScript target.url:

    3. Nella traccia di esempio riportata sopra, nota che il criterio JavaScript ha modificato o aggiornato il valore di target.url in modo che contenga un percorso vuoto.
    4. Tieni presente che target.url ha i seguenti componenti:
      • scheme: https://mocktarget.apigee.net
      • path: vuoto

    Log

    Utilizzare i log nel server di log

    1. Se non hai una traccia di questo errore (un problema intermittente), controlla se hai registrato le informazioni sul valore della variabile di flusso target.url, utilizzando criteri come MessageLogging o ServiceCallout sul tuo server di log.
    2. Se hai i log, esaminali e:
      1. Verifica se target.url ha un percorso vuoto e
      2. Verifica se riesci a determinare quale policy ha modificato target.url in modo che contenga un percorso vuoto

    Proxy API

    Esaminare il proxy API non riuscito

    Se non disponi di una traccia o di log per questo errore, esamina il proxy API non riuscito per determinare cosa ha modificato o aggiornato la variabile di flusso target.url in modo che contenga un percorso non valido. Controlla quanto segue:

    • Il criterio all'interno del proxy API
    • Tutti i flussi condivisi richiamati dal proxy
  5. Esamina la norma specifica (ad esempio AssignMessage o JavaScript) che modifica o aggiorna la variabile di flusso target.url con attenzione e determina la causa dell'aggiornamento di target.url in modo che abbia un percorso vuoto.

    Ecco alcuni esempi di norme che aggiornano la variabile di flusso target.url in modo errato in modo che contenga un percorso vuoto che genera questo errore.

    Esempio 1

    Esempio 1: variabile target.url di aggiornamento delle norme JavaScript

    var url = "https://mocktarget.apigee.net"
    context.setVariable("target.url", url);

    Nell'esempio precedente, nota che la variabile di flusso target.url viene aggiornata con il valore https://mocktarget.apigee.net contenuto in un'altra variabile url.

    Tieni presente che target.url è composto dai seguenti componenti:

    • scheme: https://mocktarget.apigee.net
    • path: vuoto

    Poiché il percorso è vuoto, Apigee Edge restituisce 500 Internal Server Error con il codice di errore protocol.http.EmptyPath.

    Esempio 2

    Esempio n. 2: variabile target.url di aggiornamento delle norme JavaScript

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    Nell'esempio precedente, nota che la variabile di flusso target.url viene aggiornata concatenando il valore https://mocktarget.apigee.net contenuto in una variabile url e il valore di un'altra variabile path, il cui valore viene recuperato da request.header.Path.

    Se hai accesso alla richiesta o alla traccia effettiva, puoi verificare il valore effettivo trasmesso a request.header.Path.

    Richiesta di esempio effettuata dall'utente:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
    

    In questo esempio, il percorso dell'intestazione non viene inviato come parte della richiesta. Pertanto, il valore del percorso della variabile nel criterio JavaScript è null.

    Pertanto:

    • url = https://mocktarget.apigee.net + path
    • url = https://mocktarget.apigee.net + null
    • target.url = https://mocktarget.apigee.netnull

    Tieni presente che target.url è composto dai seguenti componenti:

    • scheme: https://mocktarget.apigee.netnull
    • path: vuoto

    Esempio n. 3

    Esempio 3: aggiornamento della variabile target.url del criterio AssignMessage tramite un'altra variabile

    <AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

    Tieni presente che target.url è composto dai seguenti componenti:

    • scheme: https://mocktarget.apigee.net
    • path: vuoto

    In tutti gli esempi precedenti, il percorso nell'URL del server di backend, ovvero target.url è vuoto, pertanto Apigee Edge restituisce 500 Internal Server Error con il codice di errore protocol.http.EmptyPath.

Risoluzione

Come da specifica RFC 3986, sezione 2: Syntax Components, il componente path è obbligatorio e deve sempre avere una barra obliqua (/), anche se non ci sono altri caratteri come parte di path. Per risolvere il problema, esegui i seguenti passaggi:

  1. Assicurati che l'URL del server di backend, rappresentato dalla variabile di flusso target.url, abbia sempre un percorso non vuoto.
    1. In alcuni casi, potresti non avere un nome risorsa nel percorso, quindi assicurati che il percorso contenga almeno una barra (/).
    2. Se utilizzi altre variabili per determinare il valore della variabile di flusso target.url, assicurati che le altre variabili non abbiano un percorso vuoto.
    3. Se esegui operazioni sulle stringhe per determinare il valore della variabile di flusso target.url, assicurati che il risultato o l'esito delle operazioni sulle stringhe non abbia un percorso vuoto.
  2. Negli esempi descritti in Diagnosi, puoi risolvere il problema come spiegato di seguito:

    Esempio 1

    Esempio 1: variabile target.url di aggiornamento delle norme JavaScript

    Aggiungi una barra (/) alla variabile url per risolvere questo problema come mostrato di seguito:

    var url = "https://mocktarget.apigee.net/"
    context.setVariable("target.url", url);

    Esempio 2

    Esempio n. 2: variabile target.url di aggiornamento delle norme JavaScript

    var path = context.getVariable("request.header.Path");
    var url = "https://mocktarget.apigee.net" + path
    context.setVariable("target.url", url);

    Per risolvere il problema, assicurati di trasmettere un percorso valido, ad esempio /iloveapis, come parte dell'intestazione della richiesta Path, come mostrato di seguito:

    Richiesta di esempio:

    curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
    

    Esempio n. 3

    Esempio 3: aggiornamento della variabile target.url del criterio AssignMessage tramite un'altra variabile

    Aggiungi un percorso valido nell'elemento <Value> del criterio AssignMessage. Ad esempio, puoi impostare /json come percorso per l'API MockTarget. ovvero modifica l'elemento <Value> in https://mocktarget.apigee.net/json come mostrato di seguito:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL">
        <DisplayName>AM-SetTargetURL</DisplayName>
        <AssignVariable>
             <Name>target.url</Name>
             <Value>https://mocktarget.apigee.net/json</Value>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>

Specifica

Apigee Edge prevede che l'URL del server di backend non abbia un percorso vuoto come da le seguenti specifiche:

Specifica
RFC 3986, sezione 3: Componenti della sintassi
RFC 3986, sezione 3.3: Path

Se hai ancora bisogno di assistenza da parte dell'assistenza Apigee, vai a Informazioni di diagnostica da raccogliere.

Deve raccogliere informazioni di diagnostica

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza Apigee Edge.

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome organizzazione
  • Nome ambiente
  • Nome del proxy API
  • Completa il comando curl utilizzato per riprodurre 500 Internal Server Error con il codice di errore protocol.http.EmptyPath
  • File di traccia per le richieste API

Se sei un utente di Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle proxy API
  • File di traccia per le richieste API
  • Log di accesso NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  • Log di sistema del processore di messaggi /opt/apigee/var/log/edge-message- processor/logs/system.log

Riferimenti

Variabili di flusso - target