500 Internal Server Error - EmptyPath

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

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.

In base alle specifiche RFC 3986, sezione 3: componenti di sintassi e RFC 3986, sezione 3.3: percorso:

  1. La sintassi URI ha i seguenti componenti:

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

Pertanto, se l'URL della richiesta del server di backend non include 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, questo errore si verifica perché il componente path è vuoto o mancante.

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Il percorso dell'URL del server di backend (target.url) è vuoto L'URL del server di backend rappresentato dalla variabile di flusso target.url ha un percorso vuoto. Utenti di cloud pubblico e privato perimetrale

Passaggi di diagnosi più 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 il monitoraggio delle API:

  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 riscontrato gli errori.
  5. Traccia Codice di errore su Ora.

  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 errore: target
    • Codice di errore: protocol.http.EmptyPath
  10. Se l'Origine dell'errore è target e il Codice di errore è protocol.http.EmptyPath, ciò indica che il percorso dell'URL del server di backend è vuoto.

Traccia

Procedura 2: utilizzo dello strumento Trace

Per diagnosticare l'errore utilizzando lo strumento Trace:

  1. Abilita la sessione di traccia e
    • Attendi che si verifichi l'errore 500 Internal Server Error oppure
    • Se riesci a riprodurre il problema, esegui la chiamata API per riprodurlo 500 Internal Server Error
  2. Assicurati che l'opzione Mostra tutte le FlowInfos sia abilitata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Naviga tra le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
  5. Generalmente l'errore viene visualizzato in un flusso successivo alla fase Inizio del flusso di richiesta target, come mostrato di seguito:

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

    error: Il percorso della richiesta non può essere vuoto

    Poiché l'errore viene generato da Apigee Edge dopo la fase Inizio del flusso di richieste target, indica che il path nell'URL del server di backend è vuoto. Ciò si verifica molto probabilmente se la variabile di flusso target.url (che rappresenta l'URL del server di backend) è stata aggiornata con un percorso vuoto attraverso 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 richieste target avviato.
  8. Determina il criterio in cui la variabile di flusso target.url viene aggiornata.

    La traccia di esempio che mostra il criterio JavaScript ha aggiornato la variabile di flusso target.url:

    Nella traccia di esempio mostrata sopra, tieni presente che il valore della variabile di variabile di flusso target.url viene aggiornato in un criterio JavaScript denominato SetTargetURL come segue:

    target.url : https://mocktarget.apigee.net
    
  9. Tieni presente che target.url include i seguenti componenti:
    • schema: https://mocktarget.apigee.net
    • path: vuoto
  10. Ricevi quindi l'errore Request path cannot be empty.
  11. Vai alla fase AX (Analytics Data Recorded) della traccia e fai clic.
  12. Scorri verso il basso fino alla sezione Dettagli fase - Intestazioni degli 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 , indicando rispettivamente 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 3: utilizzo dei log di accesso di NGINX

Per diagnosticare l'errore utilizzando i log degli accessi di NGINX:

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

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

  3. Cerca per vedere se si sono verificati errori 500 con il codice di errore protocol.http.EmptyPath durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che continuano a non funzionare con 500.
  4. Se riscontri errori 500 con X-Apigee-fault-code corrispondente al valore di protocol.http.EmptyPath, determina il valore di X-Apigee-fault-source.

    Esempio di errore 500 dal log degli accessi di NGINX:

    La voce di esempio precedente del log degli accessi 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 rispettivamente protocol.http.EmptyPath e target , indicando che questo errore è causato dal fatto che l'URL del server di backend ha un percorso vuoto.

Causa: il percorso dell'URL del server di backend (target.url) è vuoto

Diagnostica

  1. Determina il codice di errore e l'origine dell'errore per 500 Internal Server Error utilizzando il monitoraggio delle API, lo strumento Trace o i log degli accessi NGINX, come spiegato nella sezione Passaggi comuni della diagnostica.
  2. Se il Codice di errore è protocol.http.EmptyPath e l'Origine dell'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. In genere questo errore si verifica se provi ad aggiornare l'URL del server di backend, ovvero target.url in modo dinamico utilizzando uno dei criteri (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 l'origine del relativo valore seguendo uno dei seguenti passaggi:

    Traccia

    Utilizzo dello strumento Trace

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

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

      La traccia di esempio che mostra il criterio JavaScript ha aggiornato la variabile di flusso target.url:

    3. Nella traccia di esempio precedente, 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 include i seguenti componenti:
      • schema: https://mocktarget.apigee.net
      • path: vuoto

    Log

    Utilizzo dei log nel server di log

    1. Se non disponi di una traccia per questo errore (problema intermittente), verifica di aver registrato le informazioni sul valore della variabile di flusso target.url utilizzando criteri come MessageLogging o ServiceCallout sul server di log.
    2. Se disponi dei log, esaminali e:
      1. Verifica che il percorso di target.url sia vuoto.
      2. Verifica se riesci a determinare quale criterio ha modificato target.url per contenere un percorso vuoto

    proxy API

    Revisione del proxy API con errori

    Se non disponi di una traccia o di log per questo errore, esamina il proxy API con errori per determinare che 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
    • Eventuali flussi condivisi richiamati dal proxy
  5. Esamina il criterio specifico (ad esempio, AssignMessage o JavaScript) che modifica o aggiorna con attenzione la variabile di flusso target.url e determina la causa dell'aggiornamento di target.url per avere un percorso vuoto.

    Di seguito sono riportati alcuni criteri di esempio che aggiornano erroneamente la variabile di flusso target.url in modo da contenere un percorso vuoto che genera questo errore.

    Esempio 1

    Esempio 1: aggiornamento del criterio JavaScript in aggiornamento della variabile target.url

    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 include i seguenti componenti:

    • schema: 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: criterio JavaScript che aggiorna la variabile target.url

    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.

    Esempio di richiesta 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. Di conseguenza, 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 ha i seguenti componenti:

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

    Esempio 3

    Esempio n. 3: criterio di AssegnaMessage che aggiorna la variabile target.url 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 ha i seguenti componenti:

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

    In tutti gli esempi precedenti, il percorso dell'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

Secondo la specifica RFC 3986, sezione 2: componenti di sintassi, il componente path è obbligatorio e DEVE sempre contenere una barra (/), anche se non sono presenti altri caratteri come parte di path. Per risolvere il problema, procedi nel seguente modo:

  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, il percorso potrebbe non contenere un nome risorsa, quindi assicurati che il percorso abbia 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 il risultato delle operazioni con stringhe non abbia un percorso vuoto.
  2. Negli esempi discussi in Diagnosi, puoi risolvere il problema come spiegato di seguito:

    Esempio 1

    Esempio 1: criterio JavaScript che aggiorna la variabile target.url

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

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

    Esempio 2

    Esempio n. 2: criterio JavaScript che aggiorna la variabile target.url

    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, nell'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 3

    Esempio 3: criterio di AssegnaMessage che aggiorna la variabile target.url tramite un'altra variabile

    Aggiungi un percorso valido nell'elemento <Value> del criterio AssegnaMessage. Ad esempio, puoi avere /json come percorso per l'API MockTarget. In altre parole, 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>
    

Specifiche

Apigee Edge si aspetta che l'URL del server di backend non abbia un percorso vuoto in base alle seguenti specifiche:

Specifiche
RFC 3986, sezione 3: componenti di sintassi
RFC 3986, sezione 3.3: percorso

Se hai ancora bisogno di aiuto dall'Assistenza Apigee, vai alla pagina Devi raccogliere informazioni diagnostiche.

Devi raccogliere dati diagnostici

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

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

  • Nome dell'organizzazione.
  • Nome ambiente
  • Nome proxy API
  • Comando curl completo 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 Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle di proxy API
  • File di traccia per le richieste API
  • Log degli accessi 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