400 Richiesta errata - Duplicaintestazione

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

Sintomo

L'applicazione client riceve un codice di stato HTTP 400 Bad Request con il codice di errore protocol.http.DuplicateHeader come risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 400 Bad Request

Inoltre, potresti visualizzare un messaggio di errore simile a quello mostrato di seguito:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Possibili cause

Questo errore si verifica se un'intestazione HTTP specifica, a cui non è consentito avere duplicati in Apigee Edge, viene visualizzata più di una volta con valori uguali o diversi come parte della richiesta HTTP inviata dal client ad Apigee Edge.

In base alla sezione 3.2.2: Field Orderdella RFC 7230, un mittente NON DEVE generare più campi di intestazione con lo stesso nome di campo in un messaggio, a meno che l'intero valore del campo per quel campo di intestazione non sia definito come un elenco separato da virgole, [ovvero #(values)] o il campo di intestazione non sia un' eccezione nota. Se Apigee Edge rileva un'intestazione specifica, a cui non è consentito avere duplicati, più di una volta nella richiesta HTTP inviata dal client, risponde con 400 Bad Request e il codice di errore protocol.http.DuplicateHeader.

Ecco le possibili cause di questo errore:

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili per
Intestazione duplicata nella richiesta La richiesta HTTP dall'applicazione client ad Apigee contiene intestazioni duplicate. Utenti di Edge Public e Private Cloud

Passaggi comuni per la diagnosi

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

Monitoraggio delle API

Per diagnosticare l'errore utilizzando il monitoraggio delle API:

  1. Accedi all'interfaccia utente 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 l'intervallo di tempo specifico in cui hai osservato gli errori.
  5. Assicurati che il filtro Proxy sia impostato su Tutti.
  6. Traccia Codice di errore rispetto a Ora.
  7. Seleziona una cella con il codice di errore protocol.http.DuplicateHeader come mostrato di seguito:

  8. Le informazioni sul codice di errore protocol.http.DuplicateHeader vengono visualizzate come mostrato di seguito:

  9. Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
  10. Nella finestra Log, prendi nota dei seguenti dettagli:
    1. Codice di stato: 400
    2. Origine errore: apigee
    3. Codice di errore: protocol.http.DuplicateHeader.
  11. Se Origine errore ha il valore apigee o MP e Codice di errore ha il valore protocol.http.DuplicateHeader, significa che la richiesta HTTP del client conteneva intestazioni duplicate.

Strumento Traccia

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 sugli errori HTTP 400.
  2. Controlla i log di accesso NGINX:

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

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

  3. Cerca se sono presenti errori 400 durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che non vanno ancora a buon fine con 400.
  4. Se trovi errori 400 con X-Apigee-fault-code corrispondente al valore di protocol.http.DuplicateHeader, allora determina il valore di X-Apigee-fault-source.

    Esempio di errore 400 dal log di accesso NGINX:

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

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Causa: intestazione duplicata nella richiesta

Diagnosi

  1. Determina il Codice di errore e l'Origine errore per l'errore osservato utilizzando il monitoraggio delle API o i log di accesso NGINX, come spiegato in Passaggi comuni per la diagnosi.
  2. Se Origine errore ha il valore apigee o MP, significa che la richiesta inviata dall'applicazione client ad Apigee contiene intestazioni duplicate.
  3. Puoi determinare l'intestazione effettiva inviata più di una volta come parte della richiesta utilizzando uno dei seguenti metodi:

    Messaggio di errore

    Utilizzo del messaggio di errore

    1. Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, allora consulta faultstring. faultstring contiene il nome dell'intestazione inviata più di una volta.

      Messaggio di errore di esempio:

      "faultstring":"Duplicate Header \"Expires\""
    2. Nel messaggio di errore riportato sopra, puoi notare che l'intestazione Expires viene inviata più di una volta, come indicato in faultstring.

    Richiesta effettiva

    Utilizzo della richiesta effettiva

    1. Se hai accesso alla richiesta effettiva effettuata dall'applicazione client, allora segui questi passaggi:

      1. Verifica l'elenco delle intestazioni passate nella richiesta.
      2. Se noti che una determinata intestazione viene visualizzata più di una volta nella richiesta con lo stesso valore o valori diversi , questa è la causa dell’errore.

      Richiesta di esempio:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      Nella richiesta di esempio riportata sopra, l'intestazione Expires viene inviata più di una volta. Pertanto, questa richiesta non va a buon fine con l'errore 400 Bad Request e il codice di errore: protocol.http.DuplicateHeader.

    2. In alternativa, se hai accesso ai log del client, puoi verificare se hai informazioni sulla richiesta effettiva effettuata ad Apigee Edge e determinare l'intestazione inviata più di una volta.

Risoluzione

Correggere la duplicazione

Opzione 1 [opzione consigliata]: correggere l'applicazione client in modo che non includa intestazioni duplicate

  1. Analizza il motivo per cui il client specifico invia un'intestazione duplicata. Ad esempio, Expires nel caso precedente. Verifica che i proxy API possano accettare l'intestazione duplicata. In genere, non è consigliabile in base alla specifica HTTP RFC7230.
  2. Se non è consigliabile, modifica l'applicazione client in modo che non invii intestazioni duplicate.

    Nell'esempio discusso sopra, si nota che l'intestazione Expires viene inviata due volte con lo stesso valore, il che non è consigliabile. Puoi risolvere il problema passando l' Expires intestazione una sola volta, come mostrato di seguito:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Se è consigliabile e vuoi consentire le intestazioni duplicate, vai all' opzione 2: utilizzo della proprietà CwC.

CwC

Opzione 2: utilizzo della proprietà CwC

Apigee fornisce una proprietà CwC HTTPHeader.<HeaderName> ,che consente alle applicazioni client e ai server di destinazione di inviare intestazioni duplicate ai proxy API in Apigee Edge.

Proprietà CwC Valori
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Ad esempio, la seguente proprietà può essere impostata sui processori di messaggi per consentire duplicati e più valori per l'intestazione Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Se sei un utente di cloud privato, puoi configurare la proprietà per impedire ad Apigee Edge di generare un errore 400 Bad Request, anche se la richiesta contiene intestazioni duplicate, utilizzando la guida illustrativa Configurare i processori di messaggi per utilizzare intestazioni duplicate.
  2. Se sei un utente di Public Cloud, contatta l'assistenza di Apigee Edge per configurare questa proprietà per la tua organizzazione.

Specifica

Apigee si aspetta che l'applicazione client non invii intestazioni duplicate come parte della richiesta secondo le seguenti specifiche RFC:

Specifica
RFC 7230, sezione 3.2.2: Field Order
RFC 7230, sezione 3.2 Header Fields

Se hai ancora bisogno dell'assistenza di Apigee, vai a Raccogliere informazioni di diagnostica.

Raccogliere informazioni di diagnostica

Raccogli le seguenti informazioni di diagnostica, quindi contatta l'assistenza di Apigee Edge.

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

  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Comando curl completo utilizzato per riprodurre l'errore 400
  • 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 del proxy API
  • Comando curl completo utilizzato per riprodurre l'errore 400
  • 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