Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin. bilgi
Belirti
İstemci uygulaması, API çağrılarına yanıt olarak messaging.adaptors.http.flow.DecompressionFailureAtRequest
hata koduyla birlikte 400 Bad Request
HTTP durum 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ğıdakine 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:
Content-Encoding
HTTP isteği başlığında belirtilen kodlama geçerlidir ve Apigee Edge tarafından desteklenmektedir.- İstemci tarafından HTTP isteğinin bir parçası olarak gönderilen yük biçimi,
Content-Encoding
üst bilgisinde belirtilen kodlama biçimiyle eşleşmiyor.
ANCAK
Bunun nedeni, yükün biçimi Content-Encoding
başlığında belirtilen kodlamayla aynı biçimde olmadığı için Apigee Edge'in belirtilen kodlamayı kullanarak yükü çözememesidir.
Aşağıda, desteklenen Content-Encoding
değerlere ve Apigee Edge'in bu durumlarda yük biçiminin nasıl olmasını beklediğine dair birkaç örnek verilmiştir:
Senaryo | İçerik-Kodlaması | Beklenen yük biçimi |
---|---|---|
Tek Kodlama | gzip | Unix RFC1952 GZIP Biçimi sayfasını inceleyin. |
Tek Kodlama | söndürme | Bu biçim, sıkıştırma sıkıştırması algoritmasıyla |
Birden Çok Kodlama | Birden Çok Kodlama Örneğin, kodlama iki kez yapıldığında şu olabilir:
|
Başlıkta göründüğü sırada yüke birden fazla kodlama uygulanır. |
Bu hatanın olası nedenleri şunlardır:
Neden | Açıklama | Şunun 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 başlığında belirtilen kodlamayla eşleşmiyor. |
Edge Herkese Açık ve Özel Bulut kullanıcıları |
Yaygın teşhis adımları
Bu hatayı teşhis etmek için aşağıdaki araçlardan/tekniklerden birini kullanın:
API Monitoring
API Monitoring'i kullanarak hatayı teşhis etmek için:
- Uygun role sahip bir kullanıcı olarak Apigee Edge kullanıcı arayüzünde oturum açın.
Sorunu incelemek istediğiniz kuruluşa geçin.
- Analiz > API İzleme > Araştır sayfasına gidin.
- Hataları gözlemlediğiniz belirli zaman aralığını seçin.
- Proxy filtresinin Tümü olarak ayarlandığından emin olun.
- Hata Kodu'nu Zamana göre çizin.
Aşağıda gösterildiği gibi
messaging.adaptors.http.flow.DecompressionFailureAtRequest
hata koduna sahip bir hücre seçin:messaging.adaptors.http.flow.DecompressionFailureAtRequest
hata kodu ile ilgili bilgi aşağıda gösterildiği gibi görüntülenir:Günlükleri görüntüle'yi tıklayın ve
400
hatasıyla başarısız olan satırı genişletin.- Günlükler penceresinde aşağıdaki ayrıntıları dikkate alın:
- Durum Kodu:
400
- Hata Kaynağı:
proxy
- Hata Kodu:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- Durum Kodu:
- Hata Kaynağı
proxy
değerine sahipse bu durum, istek yükü biçimininContent-Encoding
başlığında belirtilen desteklenen kodlama ile eşleşmediğini gösterir.
İzleme aracı
Hatayı İzle aracını kullanarak teşhis etmek için:
- İzleme oturumunu etkinleştirin ve aşağıdakilerden birini yapın:
400 Bad Request
hatasının oluşmasını bekleyin veya- Sorunu yeniden oluşturabiliyorsanız API çağrısı yapın ve
400 Bad Request
işlemini yeniden oluşturun.
Tüm FlowInfo'ları göster seçeneğinin etkin olduğundan emin olun:
- Başarısız isteklerden birini seçip izi inceleyin.
- İzin farklı aşamaları arasında gezinin ve hatanın nerede gerçekleştiğini bulun.
Hatayı genellikle aşağıda gösterildiği gibi İstemciden Alınan İstek aşamasından hemen sonraki akışta bulursunuz:
-
İ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 istek yükünün
Content-Encoding
başlığında belirtildiği gibi GZIP biçiminde olmasını beklediği anlamına gelir. - hata:
Content-Encoding
istek başlığının değerini belirleyin. Bunun için aşağıda gösterildiği gibi Müşteriden İstek Alındı aşamasına gidin:Content-Encoding
istek başlığı değerinin gerçektengzip
olduğunu unutmayın.Yukarıdaki örnek iz,
Content-Encoding
istek başlığında belirtilen kodlamanıngzip
olduğunu ancak istek yükü GZIP biçiminde olmadığını göstermektedir. Bu nedenle Apigee, gzip'i kullanarak yükü çözemez veDecompression failure at request
hatasını döndürür.- Apigee Edge'in döndürdüğü durum kodunu ve hata mesajını not edin.
izdeki İstemciye Gönderilen Yanıt aşamasına aşağıda gösterildiği gibi ekleyin:
İzdeki 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:
İzdeki AX (Analytics Verileri Kaydedilen) aşamasına gidin ve bunu tıklayın.
- Aşama Ayrıntıları ve Hata Başlıkları bölümüne ilerleyin ve X-Apigee-fault-code ile X-Apigee-fault-source değerlerini aşağıda gösterildiği gibi belirleyin:
- X-Apigee-fault-code ve X-Apigee-fault-source değerlerini
messaging.adaptors.http.flow.DecompressionFailureAtRequest
vepolicy
olarak görürsünüz. Bu, istek yükü biçimininContent-Encoding
baş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.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
NGINX erişim günlüklerini kullanarak hatayı teşhis etmek için:
- Private Cloud kullanıcısıysanız HTTP
400
hatalarıyla ilgili önemli 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_log
Yer: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.
- Belirli bir süre boyunca
400
hatası olup olmadığını (sorun geçmişte olduysa) veya400
nedeniyle başarısız olan isteklerin olup olmadığını görmek için arama yapın. X-Apigee-fault-code ile
messaging.adaptors.http.flow.DecompressionFailureAtRequest
değeriyle eşleşen bir400
hatası bulursanız X-Apigee-fault-source değerini belirleyin.NGINX erişim günlüğünden örnek 400 hatası:
NGINX erişim günlüğünden yukarıdaki örnek giriş, X-Apigee-fault-code ve X-Apigee-fault-code için aşağıdaki değerlere sahiptir:
Yanıt başlıkları Değer X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
Neden: İstek yükü biçimi, Content-Encoding başlığında belirtilen kodlamayla eşleşmiyor
Content-Encoding
istek başlığı hem geçerli hem de
desteklenen bir kodlama içeriyorsa Apigee Edge varsayılan olarak yükü her zaman açar. Bu nedenle, istek yükünün biçiminin Content-Encoding
istek başlığında belirtilen kodlamayla eşleşmesi beklenir.
Uyuşmazlık varsa bu hatayı alırsınız.
Teşhis
- API Monitoring, İzleme aracı veya NGINX erişim günlüklerini kullanarak gözlemlenen hata için Yaygın teşhis adımları bölümünde açıklandığı şekilde Hata Kodu ve Hata Kaynağı'nı belirleyin.
- Hata Kodu
messaging.adaptors.http.flow.DecompressionFailureAtRequest
ise ve Hata Kaynağıpolicy
veyaproxy
değerine sahipse bu durum, istemci uygulaması tarafından gönderilen isteğin,Content-Encoding
istek başlığında belirtilen desteklenen kodlamayla eşleşmeyen bir yüke sahip olduğunu gösterir. Uyuşmazlığı, aşağıdaki yöntemlerden birini kullanarak HTTP isteğinin bir parçası olarak 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
faultstring
dokümanına bakın.Örnek hata mesajı:
"faultstring":"Decompression failure at request"
- Yukarıdaki hata mesajında, isteğin
Content-Encoding
üstbilgisinde belirtilen kodlama kullanılarak sıkıştırılamadığı anlamına gelen"Decompression failure at request"
görüntülenir.
Trace
Trace kullanarak doğrulamak için:
- Yaygın teşhis adımlarında açıklandığı şekilde, Trace kullanarak Content-Encoding istek başlığı ve error.cause özelliğinin değerini belirleyin.
Örnek izdeki değerler aşağıdaki gibidir:
- İçerik Kodlaması:
gzip
- error.cause:
Not in GZIP format
İstek başlığındaki Content-Encoding değeri, gzip şeklindedir. Ancak, istek yükü GZIP biçiminde değildir (error.cause ile gösterilir). Bu nedenle Apigee Edge,
400 Bad Request
vemessaging.adaptors.http.flow.DecompressionFailureAtRequest
hata koduyla yanıt verir.- İçerik Kodlaması:
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:
Content-Encoding
istek başlığına iletilen değeri belirleyin.- İsteğin bir parçası olarak gönderilen yükün biçimini belirleyin.
Content-Encoding
üst bilgisinin değeri desteklenen kodlama listesindeyse ancak istek yükünün biçimiContent-Encoding
başlığında belirtilen kodlamayla eşleşmiyorsa sorunun nedeni budur.Örnek istek:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"
-X POST -d @request_payload.zipYukarıdaki örnek istek,
gzip
değerini Apigee Edge'de desteklenen bir kodlama olanContent-Encoding
başlığına gönderir. Ancakrequest_payload.zip
istek yükü ZIP biçiminde. Bu nedenle, bu istek bir400 Bad Request
durum kodu ve şu hata koduyla başarısız olur:messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
Mesaj İşleyici günlükleri
İleti İşleyici günlüklerini kullanarak doğrulamak için:
Private Cloud kullanıcısıysanız HTTP
400
hatalarıyla ilgili önemli bilgileri belirlemek için Mesaj İşleyici günlüklerini kullanabilirsiniz.- API Monitoring, Trace aracı veya NGINX erişim günlüklerini kullanarak başarısız isteğin mesaj kimliğini Yaygın teşhis adımları bölümünde açıklandığı şekilde belirleyin.
İleti İşleyici günlüğünde ileti kimliğini arayın:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Aşağıdaki istisnalardan birini görürsünüz:
1. Senaryo
1. Senaryo: API isteği, Content-Encoding: gzip başlığına sahip 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() : Exception
java.util.zip.ZipException: Not in GZIP format
occurred 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ındaki
java.util.zip.ZipException: Not in GZIP format
satırı,Content-Encoding
öğesinin gzip olarak belirtilmesine rağmen istek yükünün GZIP biçiminde gönderilmediğini belirtir. Bu nedenle Apigee Edge bu durumu ortadan kaldırır ve istemci uygulamalarınamessaging.adaptors.http.flow.DecompressionFailureAtRequest
hata koduna sahip bir400
durum kodu döndürür.2. Senaryo
2. Senaryo: API isteği Content-Encoding: deflate başlığına sahip 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 check
veCaused by: java.util.zip.DataFormatException: incorrect header check
satırları, istek yükünün deflate biçiminde gönderilmediğini ve deflate'inContent-Encoding
başlığında belirtilen kodlamayla eşleşmediğini gösterir. Bu nedenle Apigee Edge bu durumu bir kenara koyar ve istemci uygulamalarınamessaging.adaptors.http.flow.DecompressionFailureAtRequest
hata koduna sahip400
durum kodu 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
başlığını iletin. İstek yükünü sıkıştırmanız gerekiyorsa 2. adıma gidin. - İstemci uygulamasının her zaman aşağıdakileri gönderdiğinden emin olun:
- İstekte
Content-Encoding
üst bilgisinin değeri olarak desteklenen kodlamalardan herhangi biri - Apigee Edge'e desteklenen biçimdeki istek yükü,
Content-Encoding
başlığında belirtilen kodlama biçimiyle eşleşir
- İstekte
- Yukarıda açıklanan örnekte, istek yükü ZIP biçimindedir ancak istek başlığı
Content-Encoding: gzip
değerini belirtir. İstek üst bilgisiniContent-Encoding: gzip
ve istek yükünü degzip
biç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 özelliklerine göre messaging.adaptors.http.flow.DecompressionFailureAtRequest
hata koduyla 400 Bad Request
durum koduyla yanıt verir:
Spesifikasyon |
---|
RFC 7231, bölüm 6.5.1 |
RFC 7231, bölüm 3.1.2.2 |
Apigee Desteği'nden hâlâ yardıma ihtiyacınız varsa Teşhis bilgilerini toplamalısınız başlıklı makaleyi inceleyin.
Teşhis bilgileri toplanmalı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 adı
400
hatasını yeniden oluşturmak için kullanılancurl
komutunu tamamlayın- API istekleri için izleme dosyası
Private Cloud kullanıcısıysanız aşağıdaki bilgileri sağlayın:
- Başarısız istekler için gözlemlenen tam hata mesajı
- 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_log
Yer: 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