Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin. bilgi
Belirti
İstemci uygulaması, API çağrılarına yanıt olarak 400 Bad Request HTTP durum kodunu ve messaging.adaptors.http.flow.DecompressionFailureAtRequest hata kodunu alır.
Hata mesajı
İstemci uygulaması aşağıdaki yanıt kodunu alır:
HTTP/1.1 400 Bad Request
Ayrıca, aşağıda gösterilene benzer bir hata mesajı da görebilirsiniz:
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}Olası nedenler
Bu hata yalnızca aşağıdaki durumlarda oluşur:
- HTTP isteği başlığında
Content-Encodingbelirtilen kodlama geçerlidir ve Apigee Edge tarafından desteklenir. - İstemci tarafından HTTP isteğinin bir parçası olarak gönderilen yük biçimi,
Content-Encodingbaşlığında belirtilen kodlama biçimiyle eşleşmiyor.
BUT
Bunun nedeni, yükün biçimi Content-Encoding üstbilgisinde belirtilen kodlamayla aynı biçimde olmadığından Apigee Edge'in yükü belirtilen kodlamayı kullanarak çözememesidir.
Desteklenen Content-Encoding değerleri ve Apigee Edge'in bu durumlarda yük biçiminin nasıl olmasını beklediğiyle ilgili birkaç örneği aşağıda bulabilirsiniz:
| Senaryo | İçerik-Kodlaması | Beklenen yük biçimi |
|---|---|---|
| Tek Kodlama | gzip | Unix RFC1952 GZIP Biçimi'ni inceleyin. |
| Tek Kodlama | sıkıştırma | Bu biçimde, deflate sıkıştırma algoritmasıyla |
| Birden fazla kodlama | Birden fazla kodlama Örneğin, kodlamanın iki kez yapıldığı durumlarda bu hata şöyle görünebilir:
|
Üstbilgide göründüğü sırayla yük için birden fazla kodlama uygulanır. |
Bu hatanın olası nedenleri şunlardır:
| Neden | Açıklama | Aşağıdaki ürünler için geçerli sorun giderme talimatları |
|---|---|---|
| İstek yükü biçimi, Content-Encoding başlığında belirtilen kodlamayla eşleşmiyor | İstemci tarafından gönderilen istek yükünün biçimi kodlanmamış veya Content-Encoding üstbilgisinde belirtilen kodlamayla eşleşmiyor. |
Edge Public ve Private Cloud kullanıcıları |
Sık karşılaşılan teşhis adımları
Bu hatayı teşhis etmek için aşağıdaki araçlardan/tekniklerden birini kullanın:
API Monitoring
API İzleme'yi kullanarak hatayı teşhis etmek için:
- Apigee Edge kullanıcı arayüzünde oturum açın. Uygun bir role sahip bir kullanıcı olarak oturum açın.
Sorunu incelemek istediğiniz kuruluşa geçin.
- Analyze > API Monitoring > Investigate (Analiz > API İzleme > İnceleme) sayfasına gidin.
- Hataları gözlemlediğiniz belirli zaman aralığını seçin.
- Proxy filtresinin Tümü olarak ayarlandığından emin olun.
- Hata Kodunu Zaman ile karşılaştırın.
Aşağıda gösterildiği gibi, hata kodu
messaging.adaptors.http.flow.DecompressionFailureAtRequestolan bir hücre seçin:
Hata kodu
messaging.adaptors.http.flow.DecompressionFailureAtRequestile ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:
Günlükleri göster'i tıklayın ve
400hatasıyla başarısız olan satırı genişletin.
- Günlükler penceresinde aşağıdaki ayrıntıları not edin:
- Durum Kodu:
400 - Hata Kaynağı:
proxy - Hata Kodu:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Durum Kodu:
- Hata Kaynağı
proxydeğerine sahipse bu, istek yükü biçimininContent-Encodingüstbilgisinde belirtilen desteklenen kodlamayla eşleşmediğini gösterir.
İzleme aracı
İzleme aracını kullanarak hatayı teşhis etmek için:
- İzleme oturumunu ve aşağıdakilerden birini etkinleştirin:
400 Bad Requesthatasının oluşmasını bekleyin veya- Sorunu yeniden oluşturabiliyorsanız API çağrısını yapın ve sorunu yeniden oluşturun
400 Bad Request.
Tüm FlowInfo'ları göster'in etkinleştirildiğinden emin olun:
- Başarısız olan isteklerden birini seçip izlemeyi inceleyin.
- İzlemenin farklı aşamalarında gezinin ve hatanın nerede oluştuğunu bulun.
Hatayı genellikle aşağıdaki örnekte gösterildiği gibi, akışta Müşteriden İstek Alındı aşamasından hemen sonra bulabilirsiniz:
-
İzdeki özelliklerin değerlerini not edin:
- hata:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause, istek yükünün GZIP biçiminde OLMADIĞINI belirtir. Bu, Apigee Edge'in
Content-Encodingüstbilgisinde belirtildiği gibi istek yükünün GZIP biçiminde olmasını beklediği anlamına gelir. - hata:
İstek başlığı
Content-Encodingdeğerini belirleyin. Bunun için aşağıdaki resimde gösterildiği gibi Müşteriden İstek Alındı aşamasına gidin:
İstek başlığı
Content-Encodingdeğerinin gerçektengzipolduğunu unutmayın.Yukarıdaki örnek izleme, istek başlığında belirtilen kodlamanın
Content-Encodingolduğunu gösteriyor. Ancak istek yükügzipGZIP biçiminde değil. Bu nedenle Apigee, gzip kullanarak yükü açamaz veDecompression failure at requesthatasını döndürür.- Apigee Edge tarafından döndürülen durum kodunu ve hata mesajını not edin.
Aşağıda gösterildiği gibi, izlemede Response Sent to Client (İstemciye Yanıt Gönderildi) aşamasına geçiş yapın:
İzlemeyle ilgili aşağıdaki ayrıntıları not edin:
- Durum kodu:
400 Bad Request. - Hata İçeriği:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Durum kodu:
İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve bu aşamayı tıklayın.
- Aşağı kaydırarak Aşama Ayrıntıları, Hata Başlıkları bölümüne gidin ve aşağıdaki gibi X-Apigee-fault-code ve X-Apigee-fault-source değerlerini belirleyin:
- X-Apigee-fault-code ve X-Apigee-fault-source değerlerini
messaging.adaptors.http.flow.DecompressionFailureAtRequestvepolicyolarak görürsünüz. Bu, istek yükü biçimininContent-Encodingbaşlığında belirtilen kodlamayla eşleşmediğini gösterir.Yanıt başlıkları Değer X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
NGINX erişim günlüklerini kullanarak hatayı teşhis etmek için:
- Özel bulut kullanıcısıysanız HTTP
400hatalarıyla ilgili temel bilgileri belirlemek için NGINX erişim günlüklerini kullanabilirsiniz. NGINX erişim günlüklerini kontrol edin:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logNerede: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.
- Belirli bir süre boyunca
400hataları olup olmadığını (sorun geçmişte yaşandıysa) veya400ile hâlâ başarısız olan istekler olup olmadığını kontrol edin. 400hataları bulursanız ve X-Apigee-fault-code,messaging.adaptors.http.flow.DecompressionFailureAtRequestdeğeriyle eşleşiyorsa X-Apigee-fault-source değerini belirleyin.NGINX erişim günlüğünden örnek 400 hatası:
NGINX erişim günlüğündeki yukarıdaki örnek girişte, X-Apigee-fault-code ve X-Apigee-fault-source için aşağıdaki değerler yer almaktadır:
Yanıt başlıkları Değer X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
Nedeni: İstek yükü biçimi, Content-Encoding başlığında belirtilen kodlamayla eşleşmiyor.
Varsayılan olarak, istek başlığı
Content-Encoding geçerli ve
desteklenen bir kodlama içeriyorsa Apigee Edge her zaman yükü açar. Bu nedenle, istek yükünün biçiminin, istek başlığında Content-Encoding belirtilen kodlamayla eşleşmesi beklenir.
Bir uyuşmazlık varsa bu hatayı alırsınız.
Teşhis
- API İzleme, İzleme Aracı veya NGINX erişim günlükleri kullanılarak gözlemlenen hatanın Hata Kodunu ve Hata Kaynağını belirleyin. Bu işlem, Genel teşhis adımları bölümünde açıklanmıştır.
- Hata Kodu
messaging.adaptors.http.flow.DecompressionFailureAtRequestise ve Hata Kaynağıpolicyveyaproxydeğerine sahipse bu durum, istemci uygulaması tarafından gönderilen isteğin, istek başlığındaContent-Encodingbelirtilen desteklenen kodlamayla eşleşmeyen bir yük içerdiğini gösterir. Aşağıdaki yöntemlerden birini kullanarak HTTP isteğinin bir parçası olarak uyuşmazlığı belirleyebilirsiniz:
Hata mesajı
Hata mesajını kullanarak doğrulamak için:
-
Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa
faultstringbölümüne bakın.Örnek hata mesajı:
"faultstring":"Decompression failure at request"
- Yukarıdaki hata mesajında
"Decompression failure at request"ifadesi gösteriliyor. Bu ifade, isteğinContent-Encodingbaşlığında belirtilen kodlama kullanılarak sıkıştırmasının açılamadığını gösteriyor.
Trace
Trace'i kullanarak doğrulamak için:
- Content-Encoding istek başlığının ve error.cause özelliğinin değerini Trace kullanarak belirleyin. Bu işlem, Sık karşılaşılan teşhis adımları bölümünde açıklanmıştır.
Örnek izlemedeki değerler şunlardır:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
İstek başlığındaki Content-Encoding değeri gzip; ancak istek yükü GZIP biçiminde değil (error.cause ile belirtildiği gibi). Bu nedenle, Apigee Edge
400 Bad Requestve hata kodumessaging.adaptors.http.flow.DecompressionFailureAtRequestile yanıt verir.- Content-Encoding:
Gerçek istek
Gerçek isteği kullanarak doğrulamak için:
İstemci uygulaması tarafından yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:
- İstek başlığına
Content-Encodingiletilen değeri belirleyin. - İsteğin bir parçası olarak gönderilen yükün biçimini belirleyin.
Content-Encodingbaşlığının değeri, desteklenen kodlama listesinde yer alıyorsa ancak istek yükünün biçimi,Content-Encodingbaşlığında belirtilen kodlamayla eşleşmiyorsa sorun bundan kaynaklanıyordur.Örnek istek:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipYukarıdaki örnek istek, Apigee Edge'de desteklenen bir kodlama olan
Content-Encodingbaşlığınagzipdeğerini gönderir. Ancak istek yükürequest_payload.zipZIP biçimindedir. Bu nedenle, bu istek400 Bad Requestdurum kodu vemessaging.adaptors.http.flow.DecompressionFailureAtRequesthata koduyla başarısız olur.
Mesaj işleyici günlükleri
Mesaj İşleyici günlüklerini kullanarak doğrulamak için:
Özel bulut kullanıcısıysanız HTTP
400hatalarıyla ilgili temel bilgileri belirlemek için Mesaj İşleyici günlüklerini kullanabilirsiniz.- Genel teşhis adımları bölümünde açıklandığı gibi, API İzleme, İzleme aracı veya NGINX erişim günlüklerini kullanarak başarısız olan isteğin ileti kimliğini belirleyin.
Mesaj İşleyici günlüğünde ileti kimliğini arayın:
/opt/apigee/var/log/edge-message-processor/logs/system.logAşağıdaki istisnalardan birini görürsünüz:
1. senaryo
1. senaryo: API isteğinde Content-Encoding: gzip üstbilgisi olduğunda
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 formatYukarıdaki hata mesajında
java.util.zip.ZipException: Not in GZIP formatsatırı,Content-Encodinggzip olarak belirtilmesine rağmen istek yükünün GZIP biçiminde gönderilmediğini gösteriyor. Bu nedenle, Apigee Edge istisna oluşturur ve istemci uygulamalarına400durum koduyla birliktemessaging.adaptors.http.flow.DecompressionFailureAtRequesthata kodunu döndürür.2. senaryo
2. Senaryo: API isteğinde Content-Encoding: deflate üstbilgisi olduğunda
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)Yukarıdaki hata mesajındaki
java.util.zip.ZipException: incorrect header checkveCaused by: java.util.zip.DataFormatException: incorrect header checksatırları, istek yükünün deflate biçiminde gönderilmediğini ve deflate'inContent-Encodingbaşlığında belirtilen kodlamayla eşleşmediğini gösterir. Bu nedenle, Apigee Edge istisna oluşturur ve istemci uygulamalarına400durum koduyla birliktemessaging.adaptors.http.flow.DecompressionFailureAtRequesthata kodunu döndürür.
-
Çözünürlük
- Apigee Edge'deki API proxy akışında ve arka uç sunucusunda sıkıştırılmış istek yüküne gerek yoksa
Content-Encodingüstbilgisini geçirmeyin. İstek yükünün sıkıştırılması gerekiyorsa 2. adıma gidin. - İstemci uygulamasının her zaman aşağıdakileri gönderdiğinden emin olun:
- İstekteki
Content-Encodingbaşlığının değeri olarak desteklenen kodlamalardan herhangi biri - Apigee Edge'e gönderilen, desteklenen biçimdeki istek yükü,
Content-Encodingbaşlığında belirtilen kodlama biçimiyle eşleşiyor.
- İstekteki
- Yukarıda bahsedilen örnekte, istek yükü ZIP biçimindedir ancak istek başlığı
Content-Encoding: gzipdeğerini belirtir. İsteğiContent-Encoding: gzipüstbilgisi ve istek yükü degzipbiçiminde göndererek sorunu düzeltebilirsiniz:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Spesifikasyon
Apigee Edge, aşağıdaki RFC spesifikasyonlarına göre 400 Bad Request durum koduyla ve messaging.adaptors.http.flow.DecompressionFailureAtRequest hata koduyla yanıt verir:
| Spesifikasyon |
|---|
| RFC 7231, bölüm 6.5.1 |
| RFC 7231, bölüm 3.1.2.2 |
Apigee Destek Ekibi'nden hâlâ yardıma ihtiyacınız varsa Teşhis bilgilerini toplama başlıklı makaleyi inceleyin.
Teşhis bilgilerini toplamalıdır
Aşağıdaki teşhis bilgilerini toplayın ve ardından Apigee Edge Destek Ekibi ile iletişime geçin:
Herkese açık bulut kullanıcısıysanız aşağıdaki bilgileri sağlayın:
- Kuruluş adı
- Ortam adı
- API proxy'si adı
400hatasını yeniden oluşturmak için kullanılancurlkomutunun tamamı- API istekleri için izleme dosyası
Private Cloud kullanıcısıysanız aşağıdaki bilgileri sağlayın:
- Başarısız olan istekler için gözlemlenen hata mesajının tamamı
- Ortam adı
- API proxy paketi
- API istekleri için izleme dosyası
NGINX erişim günlükleri
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logNerede: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.
- Mesaj İşleyici sistem günlükleri
/opt/apigee/var/log/edge-message-processor/logs/system.log