Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione
Documentazione di Apigee X. Informazioni
Sintomo
L'applicazione client riceve un codice di stato HTTP 400 Bad Request con codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtRequest in risposta all'API
chiamate.
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":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}Possibili cause
Questo errore si verifica solo se:
- La codifica specificata nell'intestazione della richiesta HTTP
Content-Encodingè valido e supportata da Apigee Edge, - Il formato del payload inviato dal client come parte della richiesta HTTP
corrisponde al formato di codifica specificato nell'intestazione
Content-Encoding
MA
Questo perché Apigee Edge non riesce a decodificare il payload utilizzando la codifica specificata, poiché
del payload non sia nello stesso formato della codifica specificata nel
Intestazione Content-Encoding.
Ecco alcuni esempi di valori Content-Encoding supportati e di come Apigee Edge
prevede che il formato del payload sia in questi casi:
| Scenario | Content-Encoding | Formato payload previsto |
|---|---|---|
| Codifica singola | gzip | Il formato Unix Consulta Formato GZIP RFC1952. |
| Codifica singola | sgonfiare | Questo formato utilizza la struttura |
| Codifica multipla | Codifica multipla Ad esempio, nei casi in cui la codifica viene eseguita due volte, i casi possono essere:
|
Più codifiche applicate al payload nell'ordine dato come appare nell'intestazione. |
Le possibili cause di questo errore sono le seguenti:
| Causa | Descrizione | Le istruzioni di risoluzione dei problemi applicabili a |
|---|---|---|
| Il formato del payload della richiesta non corrisponde alla codifica specificata nell'intestazione Content-Encoding | Il formato del payload della richiesta inviato dal client non è codificato o
corrispondono alla codifica specificata nell'intestazione Content-Encoding. |
Utenti perimetrali di cloud pubblici e privati |
Passaggi diagnostici comuni
Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:
Monitoraggio delle API
Per diagnosticare l'errore utilizzando API Monitoring:
- Accedi alla UI di Apigee Edge come utente con ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.
- Vai al menu Analizza > Monitoraggio delle API > Esamina.
- Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
- Assicurati che il filtro Proxy sia impostato su Tutti.
- Traccia il codice di errore in base all'ora.
Seleziona una cella con il codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtRequestcome mostrato di seguito:( visualizza immagine ingrandita)
Informazioni sul codice di errore Il valore
messaging.adaptors.http.flow.DecompressionFailureAtRequestviene visualizzato come mostrato di seguito:( visualizza immagine ingrandita)
Fai clic su Visualizza log ed espandi la riga che contiene l'errore
400.( visualizza immagine ingrandita)
- Nella finestra Log, tieni presente i seguenti dettagli:
- .
- Codice di stato:
400 - Origine errore:
proxy - Codice di errore:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Codice di stato:
- Se il campo Origine errore ha il valore
proxy, significa che che il formato del payload della richiesta non corrispondesse codifica supportata specificata nell'intestazioneContent-Encoding.
Strumento Trace
Per diagnosticare l'errore utilizzando lo strumento Trace:
- Attiva la sessione di traccia
e:
- .
- Attendi che si verifichi l'errore
400 Bad Requestoppure - Se riesci a riprodurre il problema, effettuare la chiamata API e riprodurre
400 Bad Request.
- Attendi che si verifichi l'errore
Assicurati che l'opzione Mostra tutte le informazioni di Flow sia attivata:
- Seleziona una delle richieste non riuscite ed esamina la traccia.
- Navigare attraverso le diverse fasi della traccia e individuare il punto in cui si è verificato l'errore si è verificato un errore.
In genere troverai l'errore in un flusso subito dopo Fase Richiesta ricevuta dal cliente come illustrato di seguito:
( visualizza immagine ingrandita)
-
Prendi nota dei valori delle proprietà della traccia:
- errore:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause indica che il payload della richiesta NON è in formato GZIP. Ciò significa che Apigee Edge si aspettava che il payload della richiesta fosse in formato GZIP come sarebbe stato specificato nell'intestazione
Content-Encoding. - errore:
Determina il valore dell'intestazione della richiesta
Content-Encoding. Per farlo, vai alla fase Richiesta ricevuta dal client come illustrato di seguito:( visualizza immagine ingrandita)
Tieni presente che il valore dell'intestazione della richiesta
Content-Encodingcorrisponde effettivamentegzip.La traccia di esempio riportata sopra mostra che la codifica specificata nell'intestazione della richiesta
Content-Encodingègzip; ma il payload della richiesta non è in formato GZIP. Pertanto, Apigee non può decomprimere il payload utilizzando gzip e restituisce l'erroreDecompression failure at request.- Prendi nota del codice di stato e del messaggio di errore restituito da Apigee Edge navigando
alla fase Risposta inviata al cliente nella traccia come illustrato di seguito:
( visualizza immagine ingrandita)
Prendi nota dei seguenti dettagli della traccia:
- Codice di stato:
400 Bad Request. - Contenuti relativi all'errore:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Codice di stato:
Vai alla fase AX (Analytics Data Recorded) nella traccia. e fai clic su questa opzione.
- Scorri verso il basso fino alla sezione Dettagli fase, Intestazioni degli errori e
determinare i valori di X-Apigee-fault-code e X-Apigee-fault-source
come mostrato di seguito:
( visualizza immagine ingrandita)
- Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source.
come
messaging.adaptors.http.flow.DecompressionFailureAtRequestepolicy, a indicare che il formato del payload della richiesta non corrispondeva specificata nell'intestazioneContent-Encoding.Intestazioni della risposta Valore X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
Per diagnosticare l'errore utilizzando i log di accesso NGINX:
- Se sei un utente Private Cloud, puoi utilizzare i log di accesso NGINX per
determinare le informazioni chiave sugli errori HTTP
400. Controlla i log di accesso NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDove: ORG, ENV e PORT# sono sostituiti con valori effettivi.
- Cerca per vedere se si sono verificati
400errori durante un intervallo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che non vanno a buon fine400. Se riscontri errori
400con il X-Apigee-fault-code corrispondente al valore dimessaging.adaptors.http.flow.DecompressionFailureAtRequest, quindi determinare il valore della X-Apigee-fault-source.Esempio di errore 400 nel 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-code
Intestazioni della risposta Valore X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
Causa: il formato del payload della richiesta non corrisponde alla codifica specificata nell'intestazione Content-Encoding
Per impostazione predefinita, Apigee Edge decomprime sempre il payload se l'intestazione della richiesta
Content-Encoding contiene un valore valido e un
supportata. Pertanto, si prevede che il formato del payload della richiesta
deve corrispondere alla codifica specificata nell'intestazione della richiesta Content-Encoding.
In caso di mancata corrispondenza, viene visualizzato questo errore.
Diagnosi
- Determinare il codice di errore e l'origine errore per l'errore osservato utilizzando l'API Monitoraggio, log di accesso dello strumento Trace o NGINX come spiegato in Passaggi comuni per la diagnosi.
- Se il codice di errore è
messaging.adaptors.http.flow.DecompressionFailureAtRequeste Origine errore ha il valorepolicyoproxy, questo valore indica che la richiesta inviata dall'applicazione client ha un payload che non corrisponde codifica supportata specificata nell'intestazione della richiestaContent-Encoding. Puoi determinare la mancata corrispondenza come parte della richiesta HTTP utilizzando uno dei seguenti metodo:
Messaggio di errore
Per eseguire la convalida utilizzando il messaggio di errore:
-
Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, consulta il
faultstring.Esempio di messaggio di errore:
"faultstring":"Decompression failure at request"
- Nel messaggio di errore riportato sopra, viene visualizzato
"Decompression failure at request", che implica che la richiesta non possono essere decompressi utilizzando la codifica specificata nelContent-Encodingintestazione.
Trace
Per eseguire la convalida utilizzando Trace:
- Determina il valore dell'intestazione della richiesta Content-Encoding e proprietà error.cause utilizzando Trace come spiegato in Passaggi comuni della diagnostica.
I valori della traccia di esempio sono i seguenti:
- Codifica dei contenuti:
gzip - error.cause:
Not in GZIP format
Il valore nell'intestazione della richiesta Content-Encoding è gzip; tuttavia, il payload della richiesta non è in formato GZIP (come indicato da error.cause). Pertanto, Apigee Edge risponde
400 Bad Requeste codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtRequest.- Codifica dei contenuti:
Richiesta effettiva
Per eseguire la convalida utilizzando la richiesta effettiva:
Se hai accesso alla richiesta effettiva effettuata dal client dell'applicazione, segui questi passaggi:
- Determina il valore passato all'intestazione della richiesta
Content-Encoding. - Determina il formato del payload inviato come parte della richiesta.
Se il valore dell'intestazione
Content-Encodingè nell'elenco di supportata, ma il formato del payload della richiesta non corrispondono alla codifica specificata nell'intestazioneContent-Encoding, questa è la causa del problema.Esempio di richiesta:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipLa richiesta di esempio riportata sopra invia il valore
gzipalContent-Encoding, che è un'intestazione . supportata in Apigee Edge. Tuttavia, il payload della richiestarequest_payload.zipè in formato ZIP. Pertanto, questa richiesta non riesce con il codice di stato400 Bad Requeste il codice di errore:messaging.adaptors.http.flow.DecompressionFailureAtRequest.
Log del processore di messaggi
Per eseguire la convalida utilizzando i log del processore di messaggi:
Se sei un utente Private Cloud, puoi utilizzare i log del processore di messaggi per determinare le informazioni chiave sugli errori HTTP
400.- Determinare l'ID messaggio della richiesta non riuscita utilizzando API Monitoring, lo strumento Trace o NGINX, come spiegato nella sezione Passaggi di diagnostica comuni.
Cerca l'ID messaggio nel log del processore di messaggi:
/opt/apigee/var/log/edge-message-processor/logs/system.logVerrà visualizzata una delle seguenti eccezioni:
Scenario 1
Scenario 1: quando la richiesta API ha l'intestazione Content-Encoding: gzip
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatLa riga
java.util.zip.ZipException: Not in GZIP formatnel messaggio di errore precedente indica che la richiesta il payload non viene inviato in formato GZIP anche se il fileContent-Encodingè specificato come gzip. Pertanto, Apigee Edge genera l'eccezione restituisce un codice di stato400con codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtRequestalle applicazioni client.Scenario 2
Scenario 2: quando la richiesta API ha l'intestazione Content-Encoding: deflate
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check….Caused by: java.util.zip.DataFormatException: incorrect header check.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)Le linee
java.util.zip.ZipException: incorrect header checkeCaused by: java.util.zip.DataFormatException: incorrect header checknel messaggio di errore riportato sopra indicano che il payload della richiesta non è stato inviato deflate e non corrisponde alla codifica specificata nelContent-Encodingdi deflate. Pertanto, Apigee Edge genera l'eccezione e restituisce un codice di stato400con codice di erroremessaging.adaptors.http.flow.DecompressionFailureAtRequestalle applicazioni client.
-
Risoluzione
- Se non è necessario il payload delle richieste compresse nel flusso proxy API in Apigee Edge
e nel server di backend, non passare l'intestazione
Content-Encoding. Se è necessario comprimere il payload della richiesta, vai al passaggio 2. - Assicurati che l'applicazione client invii sempre quanto segue:
- Uno degli
supportata come valore per l'intestazione
Content-Encodingnel richiesta - Il payload della richiesta nel formato supportato per Apigee Edge corrisponde alla codifica
formato specificato nell'intestazione
Content-Encoding
- Uno degli
supportata come valore per l'intestazione
- Nell'esempio discusso sopra, il payload della richiesta è in formato ZIP ma l'intestazione della richiesta
specifica
Content-Encoding: gzip. Puoi risolvere il problema inviando la richiesta comeContent-Encoding: gzipe il payload della richiesta anche ingzipformato:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Specifica
Apigee Edge risponde con il codice di stato 400 Bad Request con un codice di errore
messaging.adaptors.http.flow.DecompressionFailureAtRequest in base al seguente RFC
specifiche:
| Specifica |
|---|
| RFC 7231, sezione 6.5.1 |
| RFC 7231, sezione 3.1.2.2 |
Se hai ancora bisogno di aiuto dall'assistenza Apigee, vai a Raccogliere dati diagnostici.
Raccogliere dati diagnostici
Raccogli le seguenti informazioni diagnostiche e contatta l'assistenza Apigee Edge:
Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:
- Nome organizzazione
- Nome ambiente
- Nome proxy API
- Completa il comando
curlutilizzato per riprodurre l'errore400 - 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_logDove: ORG, ENV e PORT# vengono sostituiti con valori effettivi.
- Log di sistema del processore di messaggi
/opt/apigee/var/log/edge-message-processor/logs/system.log