400 Hatalı İstek - Sıkıştırmayı Açma Hatası

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-Encoding belirtilen kodlama geçerlidir ve Apigee Edge tarafından desteklenir.
  • BUT

  • İstemci tarafından HTTP isteğinin bir parçası olarak gönderilen yük biçimi, Content-Encoding başlığında belirtilen kodlama biçimiyle eşleşmiyor.

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 gzip biçimi.

RFC1952 GZIP Biçimi'ni inceleyin.

Tek Kodlama sıkıştırma

Bu biçimde, deflate sıkıştırma algoritmasıyla zlib yapısı kullanılır.

RFC1950 ve RFC1951'e bakın..

Birden fazla kodlama

Birden fazla kodlama

Örneğin, kodlamanın iki kez yapıldığı durumlarda bu hata şöyle görünebilir:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • deflate, deflate
Ü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:

  1. Apigee Edge kullanıcı arayüzünde oturum açın. Uygun bir role sahip bir kullanıcı olarak oturum açın.
  2. Sorunu incelemek istediğiniz kuruluşa geçin.

  3. Analyze > API Monitoring > Investigate (Analiz > API İzleme > İnceleme) sayfasına gidin.
  4. Hataları gözlemlediğiniz belirli zaman aralığını seçin.
  5. Proxy filtresinin Tümü olarak ayarlandığından emin olun.
  6. Hata Kodunu Zaman ile karşılaştırın.
  7. Aşağıda gösterildiği gibi, hata kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest olan bir hücre seçin:

    ( daha büyük resmi görüntüle)

  8. Hata kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest ile ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:

    ( daha büyük resmi görüntüle)

  9. Günlükleri göster'i tıklayın ve 400 hatasıyla başarısız olan satırı genişletin.

    ( daha büyük resmi görüntüle)

  10. 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.
  11. Hata Kaynağı proxy değerine sahipse bu, istek yükü biçiminin Content-Encoding üstbilgisinde belirtilen desteklenen kodlamayla eşleşmediğini gösterir.

İzleme aracı

İzleme aracını kullanarak hatayı teşhis etmek için:

  1. İzleme oturumunu ve aşağıdakilerden birini etkinleştirin:
    1. 400 Bad Request hatasının oluşmasını bekleyin veya
    2. Sorunu yeniden oluşturabiliyorsanız API çağrısını yapın ve sorunu yeniden oluşturun 400 Bad Request.
  2. Tüm FlowInfo'ları göster'in etkinleştirildiğinden emin olun:

  3. Başarısız olan isteklerden birini seçip izlemeyi inceleyin.
  4. İzlemenin farklı aşamalarında gezinin ve hatanın nerede oluştuğunu bulun.
  5. Hatayı genellikle aşağıdaki örnekte gösterildiği gibi, akışta Müşteriden İstek Alındı aşamasından hemen sonra bulabilirsiniz:

    ( daha büyük resmi görüntüle)

  6. İ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.

  7. İstek başlığı Content-Encoding değerini belirleyin. Bunun için aşağıdaki resimde gösterildiği gibi Müşteriden İstek Alındı aşamasına gidin:

    ( daha büyük resmi görüntüle)

    İstek başlığı Content-Encoding değerinin gerçekten gzip olduğunu unutmayın.

    Yukarıdaki örnek izleme, istek başlığında belirtilen kodlamanın Content-Encoding olduğunu gösteriyor. Ancak istek yükü gzip GZIP biçiminde değil. Bu nedenle Apigee, gzip kullanarak yükü açamaz ve Decompression failure at request hatasını döndürür.

  8. 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:

    ( daha büyük resmi görüntüle)

    İ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"}}}
  9. İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve bu aşamayı tıklayın.

  10. 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:

    ( daha büyük resmi görüntüle)

  11. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini messaging.adaptors.http.flow.DecompressionFailureAtRequest ve policy olarak görürsünüz. Bu, istek yükü biçiminin Content-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:

  1. Özel bulut kullanıcısıysanız HTTP 400 hatalarıyla ilgili temel bilgileri belirlemek için NGINX erişim günlüklerini kullanabilirsiniz.
  2. NGINX erişim günlüklerini kontrol edin:

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

    Nerede: ORG, ENV ve PORT# gerçek değerlerle değiştirilir.

  3. Belirli bir süre boyunca 400 hataları olup olmadığını (sorun geçmişte yaşandıysa) veya 400 ile hâlâ başarısız olan istekler olup olmadığını kontrol edin.
  4. 400 hataları bulursanız ve X-Apigee-fault-code, messaging.adaptors.http.flow.DecompressionFailureAtRequest değ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.DecompressionFailureAtRequest
    X-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

  1. 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.
  2. Hata Kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest ise ve Hata Kaynağı policy veya proxy değerine sahipse bu durum, istemci uygulaması tarafından gönderilen isteğin, istek başlığında Content-Encoding belirtilen desteklenen kodlamayla eşleşmeyen bir yük içerdiğini gösterir.
  3. 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:

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa faultstring bölümüne bakın.

      Örnek hata mesajı:

      "faultstring":"Decompression failure at request"
    2. Yukarıdaki hata mesajında "Decompression failure at request" ifadesi gösteriliyor. Bu ifade, isteğin Content-Encoding baş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:

    1. 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.
    2. Ö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 Request ve hata kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest ile yanıt verir.

    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:

    1. İstek başlığına Content-Encoding iletilen değeri belirleyin.
    2. İsteğin bir parçası olarak gönderilen yükün biçimini belirleyin.
    3. Content-Encoding başlığının değeri, desteklenen kodlama listesinde yer alıyorsa ancak istek yükünün biçimi, Content-Encoding baş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.zip
      

      Yukarıdaki örnek istek, Apigee Edge'de desteklenen bir kodlama olan Content-Encoding başlığına gzip değerini gönderir. Ancak istek yükü request_payload.zip ZIP biçimindedir. Bu nedenle, bu istek 400 Bad Request durum kodu ve messaging.adaptors.http.flow.DecompressionFailureAtRequest hata 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 400 hatalarıyla ilgili temel bilgileri belirlemek için Mesaj İşleyici günlüklerini kullanabilirsiniz.

    1. 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.
    2. Mesaj İşleyici günlüğünde ileti kimliğini arayın:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Aş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() :
      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 format
      

      Yukarıdaki hata mesajında java.util.zip.ZipException: Not in GZIP format satırı, Content-Encoding gzip 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ına 400 durum koduyla birlikte messaging.adaptors.http.flow.DecompressionFailureAtRequest hata 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 check ve Caused by: java.util.zip.DataFormatException: incorrect header check satırları, istek yükünün deflate biçiminde gönderilmediğini ve deflate'in Content-Encoding başlığında belirtilen kodlamayla eşleşmediğini gösterir. Bu nedenle, Apigee Edge istisna oluşturur ve istemci uygulamalarına 400 durum koduyla birlikte messaging.adaptors.http.flow.DecompressionFailureAtRequest hata kodunu döndürür.

Çözünürlük

  1. 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.
  2. İstemci uygulamasının her zaman aşağıdakileri gönderdiğinden emin olun:
    • İstekteki Content-Encoding başlığının değeri olarak desteklenen kodlamalardan herhangi biri
    • Apigee Edge'e gönderilen, desteklenen biçimdeki istek yükü, Content-Encoding başlığında belirtilen kodlama biçimiyle eşleşiyor.
  3. Yukarıda bahsedilen örnekte, istek yükü ZIP biçimindedir ancak istek başlığı Content-Encoding: gzip değerini belirtir. İsteği Content-Encoding: gzip üstbilgisi ve istek yükü de gzip 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 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ı
  • 400 hatasını yeniden oluşturmak için kullanılan curl komutunun 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_log

    Nerede: 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