400 Richiesta errata - Duplicaintestazione

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

Sintomo

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

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 400 Bad Request

Inoltre, potrebbe essere visualizzato 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 che non può avere duplicati in Apigee Edge viene visualizzata più di una volta con valori uguali o diversi nell'ambito della richiesta HTTP inviata dal client ad Apigee Edge.

Secondo RFC 7230, sezione 3.2.2: Ordine dei campi, 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 tale campo di intestazione non sia definito come un elenco separato da virgole, [ad es. #(values)] o il campo dell'intestazione è un'eccezione nota. Se Apigee Edge trova un'intestazione specifica, questa non può 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.

Di seguito sono riportate le possibili cause di questo errore:

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Intestazione duplicata nella richiesta La richiesta HTTP dall'applicazione client ad Apigee contiene intestazioni duplicate. 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

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. Assicurati che il filtro del proxy sia impostato su Tutti.
  6. Traccia Codice di errore su 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 l'Origine dell'errore ha il valore apigee o MP e il Codice di errore ha il valore protocol.http.DuplicateHeader, ciò indica che la richiesta HTTP del client conteneva intestazioni duplicate.

Strumento Traccia

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

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

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

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

    Esempio di errore 400 dal log degli accessi di NGINX:

    La voce di esempio sopra riportata dal log di accesso NGINX ha i seguenti valori per X-Apigee-ming-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

Diagnostica

  1. Determina il codice di errore e l'origine dell'errore per l'errore osservato utilizzando i log di accesso dell'API Monitoring o NGINX, come spiegato nella sezione Passaggi comuni di diagnosi.
  2. Se l'Origine dell'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 che viene inviata più di una volta nell'ambito della richiesta utilizzando uno dei seguenti metodi:

    Messaggio di errore

    Utilizzare il messaggio di errore

    1. Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, fai riferimento all'faultstring. faultstring contiene il nome dell'intestazione che è stato inviato più di una volta.

      Esempio di messaggio di errore:

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

    Richiesta effettiva

    Tramite la richiesta effettiva

    1. Se hai accesso alla richiesta effettiva effettuata dall'applicazione client, procedi nel seguente modo:

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

      Esempio di richiesta:

      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 precedente, l'intestazione Expires viene inviata più di una volta. Pertanto, questa richiesta ha esito negativo e restituisce l'errore 400 Bad Request e il codice di errore: protocol.http.DuplicateHeader.

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

Risoluzione

Correggi duplicazione

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

  1. Analizza il motivo per cui un client specifico deve inviare un'intestazione duplicata. Ad esempio, Expires nel caso precedente. Verifica che i proxy API possano accettare l'intestazione duplicata. In genere, non è auspicabile secondo la specifica HTTP RFC7230.
  2. Se non lo desideri, 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 è desiderabile. Puoi risolvere il problema passando l'intestazione Expires solo una volta, come mostrato di seguito:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. Se lo ritieni opportuno e vuoi consentire le intestazioni duplicate, vai a Opzione 2 utilizzando la 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 Private Cloud, puoi configurare la proprietà in modo da impedire ad Apigee Edge di generare un errore 400 Bad Request, anche se la richiesta contiene intestazioni duplicate utilizzando la guida illustrativa sulla configurazione dei processori di messaggi per l'uso di intestazioni duplicate.
  2. Se sei un utente del cloud pubblico, contatta l'assistenza Apigee Edge per configurare questa proprietà per la tua organizzazione.

Specifiche

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

Specifiche
RFC 7230, sezione 3.2.2: Ordine dei campi
Campi intestazione RFC 7230, sezione 3.2

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

Devi raccogliere dati diagnostici

Raccogli le seguenti informazioni diagnostiche e poi 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 l'errore 400
  • 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
  • Completa il comando curl che hai usato per riprodurre l'errore 400
  • 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