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

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Belirti

İstemci uygulaması 400 Bad Request HTTP durum kodunu hata koduyla alıyor API'ye yanıt olarak messaging.adaptors.http.flow.DecompressionFailureAtRequest çağrısının en iyi yoludur.

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 istek başlığında belirtilen kodlama Content-Encoding ve Apigee Edge tarafından destekleniyor,
  • ANCAK

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

Bunun nedeni, Apigee Edge'in yük biçiminin, Content-Encoding üstbilgisi.

Desteklenen Content-Encoding değerler ve Apigee Edge'in bazı örnekleri yük biçiminin aşağıdaki durumlarda olmasını bekler:

Senaryo İçerik-Kodlaması Beklenen yük biçimi
Tek Kodlama gzip

Unix gzip biçimi.

Görüntüleyin RFC1952 GZIP Biçimi'ni tıklayın.

Tek Kodlama söndürmek

Bu biçim, sıkıştırma sıkıştırma algoritmasına sahip zlib yapısını kullanır.

Bkz. RFC1950 ve RFC1951.

Çoklu Kodlama

Çoklu Kodlama

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

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • söndür, söndür
Yüke, başlıkta göründüğü şekilde belirtilen sırada birden fazla kodlama uygulandı.

Bu hatanın olası nedenleri aşağıda açıklanmıştı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 üstbilgisinde belirtilen kodlamayla eşleşmelidir. Edge Herkese Açık ve Private Cloud kullanıcıları

Sık kullanılan 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. Apigee Edge kullanıcı arayüzünde uygun role sahip olur.
  2. Sorunu incelemek istediğiniz kuruluşa geçin.

  3. Analiz > API İzleme > İnceleme sayfası.
  4. Hataları gözlemlediğiniz zaman aralığını seçin.
  5. Proxy filtresinin Tümü olarak ayarlandığından emin olun.
  6. Zaman ile Hata Kodu'nun grafiğini çizin.
  7. messaging.adaptors.http.flow.DecompressionFailureAtRequest hata koduna sahip bir hücre seçin: aşağıda gösterilmiştir:

    ( resmi büyüt)

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

    ( resmi büyüt)

  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.

    ( resmi büyüt)

  10. Günlükler penceresinde aşağıdaki ayrıntılara dikkat edin:
    • 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 desteklenen kodlama Content-Encoding üstbilgisinde belirtilir.

İzleme aracı

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

  1. İzleme oturumunu etkinleştir ve şunlardan 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ını oluşturun ve 400 Bad Request
  2. Show all FlowInfos (Tüm Akış Bilgilerini Göster) seçeneğinin etkin olduğundan emin olun:

  3. Başarısız isteklerden birini seçin ve izini inceleyin.
  4. İzlemenin farklı aşamalarından yararlanın ve hatanın nerede olduğunu bulun meydana geldi.
  5. Hatayı genellikle Aşağıda gösterildiği gibi İstek Müşteriden Alındı aşaması:

    ( resmi büyüt)

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

  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:

    ( resmi büyüt)

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

    Yukarıdaki örnek iz, istek başlığında belirtilen kodlamanın, Content-Encoding gzip; ancak istek yükü GZIP biçiminde değil. Bu nedenle Apigee, gzip olarak kaydeder ve Decompression failure at request hatasını döndürür.

  8. Apigee Edge'in döndürdüğü hata mesajını ve durum kodunu not edin.

    aşağıdaki gibi izlemedeki İstemciye Gönderildi aşamasına

    ( resmi büyüt)

    İ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. İzlemede AX (Kayıtlı Analytics Verileri) aşamasına gidin ve düğmeyi tıklayın.

  10. Aşama Ayrıntıları, Hata Başlıkları bölümüne gidin ve X-Apigee-fault-code ve X-Apigee-fault-source değerlerini belirleme aşağıdaki gibidir:

    ( resmi büyüt)

  11. X-Apigee-fault-code ve X-Apigee-fault-source değerlerini görürsünüz. messaging.adaptors.http.flow.DecompressionFailureAtRequest ve policy (istek yük biçiminin Content-Encoding üstbilgisinde belirtilen kodlama.
    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 NGINX erişim günlüklerini kullanarak şunları yapabilirsiniz: HTTP 400 hatalarıyla ilgili önemli bilgileri belirler.
  2. NGINX erişim günlüklerini kontrol edin:

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

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

  3. Belirli bir sürede 400 hatası olup olmadığını görmek için arama yapın (sorun geçmişte oluşmuşsa) veya hâlâ başarısız olan bir istek varsa 400
  4. X-Apigee-fault-code ile herhangi bir 400 hatası bulursanız messaging.adaptors.http.flow.DecompressionFailureAtRequest değeriyle eşleşiyorsa ve X-Apigee-fault-source. değerinin 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-source:

    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, belirtilen kodlamayla eşleşmiyor Content-Encoding üstbilgisindeki

Varsayılan olarak Apigee Edge, istek başlığı Content-Encoding, geçerli ve desteklenen kodlamayı kullanın. Bu nedenle, istek yükünün biçiminin Content-Encoding istek başlığında belirtilen kodlamayla eşleşmelidir. Uyuşmazlık varsa bu hatayı alırsınız.

Teşhis

  1. API kullanılarak gözlemlenen hatanın Hata Kodu ve Hata Kaynağı'nı belirleme Aşağıdaki bölümde açıklandığı şekilde İzleme, İzleme aracı veya NGINX erişim günlükleri Yaygın teşhis adımları.
  2. Hata kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest ve Hata Kaynağı policy veya proxy değerine sahipse bu istemci uygulaması tarafından gönderilen isteğin, desteklenen kodlama istek başlığında Content-Encoding belirtilir.
  3. HTTP isteğinin bir parçası olarak eşleşmeyi aşağıdakilerden birini kullanarak belirleyebilirsiniz: yöntemleri:

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

      Örnek hata mesajı:

      "faultstring":"Decompression failure at request"
      
    2. Yukarıdaki hata mesajında "Decompression failure at request", isteğin Content-Encoding başlığı.

    Trace

    Trace kullanarak doğrulamak için:

    1. Content-Encoding istek başlığının ve error.cause mülkündeki Trace hizmeti Yaygın teşhis adımları bölümünde açıklandığı gibi.
    2. Örnek izdeki değerler aşağıdaki gibidir:

      • İçerik Kodlaması: gzip
      • error.cause: Not in GZIP format

      Content-Encoding istek başlığındaki değer gzip şeklindedir; ancak, istek yükü GZIP biçiminde değil (error.cause tarafından belirtildiği gibi). Bu nedenle Apigee Edge, 400 Bad Request ve hata kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    Gerçek istek

    Gerçek isteği kullanarak doğrulamak için:

    İstemci tarafından gönderilen asıl isteğe erişiminiz varsa aşağıdaki adımları uygulayın:

    1. Content-Encoding istek başlığına iletilen değeri belirleyin.
    2. İstek kapsamında gönderilen yükün biçimini belirleyin.
    3. Content-Encoding üstbilgisinin değeri desteklenmemeli, ancak istek yükünün biçimi Content-Encoding başlığında belirtilen kodlamayla eşleşir, 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 Content-Encoding üstbilgisi desteklenen kodlamayı kullanıma sunuyoruz. Ancak istek yükü request_payload.zip, ZIP biçiminde. Dolayısıyla, bu istek 400 Bad Request durum kodu ve hata koduyla başarısız oluyor: messaging.adaptors.http.flow.DecompressionFailureAtRequest.

    İleti işleyen günlükleri

    İleti İşleyici günlüklerini kullanarak doğrulamak için:

    Private Cloud kullanıcısıysanız Mesaj İşleyici günlüklerini kullanabilirsiniz HTTP 400 hatalarıyla ilgili önemli bilgileri belirlemek için.

    1. API Monitoring, Trace aracını kullanarak başarısız isteğin mesaj kimliğini belirleyin. Sık kullanılan teşhis adımları bölümünde açıklandığı şekilde NGINX erişim günlükleri.
    2. İleti İşleyen 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ı, isteğin Content-Encoding olsa bile yük GZIP biçiminde gönderilmez. gzip olarak belirtilir. Bu nedenle, Apigee Edge istisnayı hata koduyla birlikte bir 400 durum kodu döndürür messaging.adaptors.http.flow.DecompressionFailureAtRequest özellikler sunar.

      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)
      

      Çizgiler java.util.zip.ZipException: incorrect header check. ve Caused by: java.util.zip.DataFormatException: incorrect header check yukarıdaki hata mesajı, istek yükünün kodlamayla eşleşmediğinden emin olun, Content-Encoding deflate başlığı. Bu nedenle Apigee Edge istisnayı bildirir ve şunu içeren bir 400 durum kodu döndürür: hata kodu messaging.adaptors.http.flow.DecompressionFailureAtRequest özellikler sunar.

Çözünürlük

  1. Apigee Edge'deki API proxy akışında sıkıştırılmış istek yüküne gerek kalmıyorsa arka uç sunucusunda geçirmeyin Content-Encoding. İ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:
    • Şunlardan herhangi biri: desteklenen kodlamayı Content-Encoding üstbilgisi için istek
    • Desteklenen biçimde Apigee Edge'e gönderilen istek yükü, kodlamayla eşleşir Content-Encoding üstbilgisinde biçim belirtildi
  3. Yukarıda açıklanan örnekte, istek yükü ZIP biçimindedir ancak istek başlığı Content-Encoding: gzip belirtir. İsteği göndererek sorunu düzeltebilirsiniz Content-Encoding: gzip olarak başlığı ve istek yükü gzip içinde de biçim:
    curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
    

Spesifikasyon

Apigee Edge, 400 Bad Request durum koduyla hata mesajı veriyor Aşağıdaki RFC'ye göre messaging.adaptors.http.flow.DecompressionFailureAtRequest özellikler:

Spesifikasyon
RFC 7231, bölüm 6.5.1
RFC 7231, bölüm 3.1.2.2

Hâlâ Apigee Destek Ekibi'nden yardım almak istiyorsanız adresine gidin. Teşhis bilgileri toplanmalıdır.

Teşhis bilgileri toplanmalıdır

Aşağıdaki teşhis bilgilerini toplayın, ardından Apigee Edge Destek Ekibi ile iletişime geçin:

Herkese açık Cloud 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 tam hata mesajı gözlemlendi
  • 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# şununla değiştirilir: gerçek değerler.

  • Mesaj İşleyici sistem günlükleri /opt/apigee/var/log/edge-message-processor/logs/system.log