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 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.
  • ANCAK

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

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

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 zlib yapısını kullanır.

Bkz. RFC1950 ve RFC1951.

Birden Çok Kodlama

Birden Çok Kodlama

Örneğin, kodlama iki kez yapıldığında şu olabilir:

  • gzip, sıkıştırma
  • gzip, gzip
  • deflate, gzip
  • havayı söndürme, azaltma
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:

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

  3. Analiz > API İzleme > Araştır 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 Kodu'nu Zamana göre çizin.
  7. Aşağıda gösterildiği gibi messaging.adaptors.http.flow.DecompressionFailureAtRequest hata koduna sahip bir hücre seçin:

    ( büyük resmi göster)

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

    ( büyük resmi göster)

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

    ( büyük resmi göster)

  10. 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.
  11. Hata Kaynağı proxy değerine sahipse bu durum, istek yükü biçiminin Content-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:

  1. İzleme oturumunu etkinleştirin ve aşağıdakilerden birini yapın:
    1. 400 Bad Request hatasının oluşmasını bekleyin veya
    2. Sorunu yeniden oluşturabiliyorsanız API çağrısı yapın ve 400 Bad Request işlemini yeniden oluşturun.
  2. Tüm FlowInfo'ları göster seçeneğinin etkin olduğundan emin olun:

  3. Başarısız isteklerden birini seçip izi inceleyin.
  4. İzin farklı aşamaları arasında gezinin ve hatanın nerede gerçekleştiğini bulun.
  5. Hatayı genellikle aşağıda gösterildiği gibi İstemciden Alınan İstek aşamasından hemen sonraki akışta bulursunuz:

    ( büyük resmi göster)

  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 istek yükünün Content-Encoding başlığında belirtildiği gibi GZIP biçiminde olmasını beklediği anlamına gelir.

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

    ( büyük resmi göster)

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

    Yukarıdaki örnek iz, Content-Encoding istek başlığında belirtilen kodlamanın gzip olduğunu ancak istek yükü GZIP biçiminde olmadığını göstermektedir. Bu nedenle Apigee, gzip'i kullanarak yükü çözemez ve Decompression failure at request hatasını döndürür.

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

    ( büyük resmi göster)

    İ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"}}}
  9. İzdeki AX (Analytics Verileri Kaydedilen) aşamasına gidin ve bunu tıklayın.

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

    ( büyük resmi göster)

  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. Private Cloud kullanıcısıysanız HTTP 400 hatalarıyla ilgili önemli 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

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

  3. Belirli bir süre boyunca 400 hatası olup olmadığını (sorun geçmişte olduysa) veya 400 nedeniyle başarısız olan isteklerin olup olmadığını görmek için arama yapın.
  4. X-Apigee-fault-code ile messaging.adaptors.http.flow.DecompressionFailureAtRequest değeriyle eşleşen bir 400 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

  1. 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.
  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, Content-Encoding istek başlığında belirtilen desteklenen kodlamayla eşleşmeyen bir yüke sahip olduğunu gösterir.
  3. 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:

    1. 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"
      
    2. 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:

    1. 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.
    2. Ö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 ve messaging.adaptors.http.flow.DecompressionFailureAtRequest hata koduyla 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. Content-Encoding istek başlığına iletilen değeri belirleyin.
    2. İsteğin bir parçası olarak gönderilen yükün biçimini belirleyin.
    3. Content-Encoding üst bilgisinin değeri desteklenen kodlama listesindeyse ancak istek yükünün biçimi Content-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.zip
      

      Yukarıdaki örnek istek, gzip değerini Apigee Edge'de desteklenen bir kodlama olan Content-Encoding başlığına gönderir. Ancak request_payload.zip istek yükü ZIP biçiminde. Bu nedenle, bu istek bir 400 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.

    1. 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.
    2. İleti İş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ğ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 format
      

      Yukarı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ına messaging.adaptors.http.flow.DecompressionFailureAtRequest hata koduna sahip bir 400 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 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 bu durumu bir kenara koyar ve istemci uygulamalarına messaging.adaptors.http.flow.DecompressionFailureAtRequest hata koduna sahip 400 durum kodu 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 başlığını iletin. İstek yükünü sıkıştırmanız gerekiyorsa 2. adıma gidin.
  2. İ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
  3. Yukarıda açıklanan örnekte, istek yükü ZIP biçimindedir ancak istek başlığı Content-Encoding: gzip değerini belirtir. İstek üst bilgisini Content-Encoding: gzip ve istek yükünü 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 ö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ılan curl 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