400 Hatalı İstek - Yinelenen Başlık

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 protocol.http.DuplicateHeader 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":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Olası nedenler

Bu hata, Apigee Edge'de yinelenmesine izin verilmeyen belirli bir HTTP başlığı, istemci tarafından Apigee Edge'e gönderilen HTTP isteğinin bir parçası olarak aynı veya farklı değerlerle birden fazla kez görünürse oluşur.

RFC 7230, bölüm 3.2.2: Alan Sırasıuyarınca, bir gönderen, bir iletide aynı alan adına sahip birden fazla üst bilgi alanı oluşturmamalıdır.Ancak bu üst bilgi alanının tüm alan değeri virgülle ayrılmış bir liste olarak tanımlanmışsa [ör. #(values)] veya başlık alanı iyi bilinen bir istisnadır. Apigee Edge, istemci tarafından gönderilen HTTP isteğinde birden fazla kez yinelenmesine izin verilmeyen belirli bir başlık bulursa 400 Bad Request ve hata kodu protocol.http.DuplicateHeader ile yanıt verir.

Bu hatanın olası nedenleri şunlardır:

Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
İstek başlığında yinelenen başlık İstemci uygulamasından Apigee'ye gönderilen HTTP isteği, yinelenen başlıklar içeriyor. 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.
  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 kodunu içeren bir hücre seçin protocol.http.DuplicateHeader:

  8. protocol.http.DuplicateHeader hata koduyla ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:

  9. Günlükleri görüntüle'yi tıklayın ve başarısız olan isteğin satırını genişletin.
  10. Günlükler penceresinde aşağıdaki ayrıntıları not edin:
    1. Durum Kodu: 400
    2. Hata Kaynağı: apigee
    3. Hata Kodu: protocol.http.DuplicateHeader.
  11. Hata Kaynağı değeri apigee veya MP , Hata Kodu değeri ise protocol.http.DuplicateHeader ise bu, istemciden gelen HTTP isteğinin yinelenen üstbilgiler içerdiğini gösterir.

İzleme aracı

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 (sorun geçmişte yaşandıysa) 400 hataları olup olmadığını veya 400 ile hâlâ başarısız olan istekler olup olmadığını kontrol etmek için arama yapın.
  4. X-Apigee-fault-code'un protocol.http.DuplicateHeader değeriyle eşleşen 400 hataları bulursanız 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 protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Nedeni: İstekte yinelenen başlık var

Teşhis

  1. API izleme veya NGINX erişim günlükleri kullanılarak gözlemlenen hatanın Hata Kodunu ve Hata Kaynağını belirleyin. Bu işlem, Yaygın teşhis adımları bölümünde açıklanmıştır.
  2. Hata Kaynağı apigee veya MP değerine sahipse bu, istemci uygulaması tarafından Apigee'ye gönderilen isteğin yinelenen üstbilgiler içerdiğini gösterir.
  3. İsteğin bir parçası olarak birden fazla kez gönderilen gerçek başlığı aşağıdaki yöntemlerden birini kullanarak belirleyebilirsiniz:

    Hata mesajı

    Hata mesajını kullanma

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa faultstring bölümüne bakın. faultstring, birden fazla kez gönderilen üstbilgi adını içeriyor.

      Örnek hata mesajı:

      "faultstring":"Duplicate Header \"Expires\""
    2. Yukarıdaki hata mesajında, Expires üstbilgisinin faultstring içinde görüldüğü gibi birden fazla kez gönderildiği görülmektedir.

    Gerçek istek

    Gerçek isteği kullanma

    1. İstemci uygulaması tarafından yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:

      1. İstekte iletilen başlıkların listesini doğrulayın.
      2. Belirli bir başlığın , aynı değerle veya farklı değerlerle birlikte istekte birden fazla kez göründüğünü tespit ederseniz bu hatanın nedeni budur.

      Örnek İstek:

      curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT" -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
      

      Yukarıdaki örnek istekte Expires başlığı birden fazla kez gönderiliyor. Bu nedenle, bu istek 400 Bad Request hatası ve protocol.http.DuplicateHeader hata koduyla başarısız olur.

    2. Alternatif olarak, istemci günlüklerine erişiminiz varsa Apigee Edge'e yapılan gerçek istek hakkında bilgi olup olmadığını görebilir ve birden fazla kez gönderilen başlığı belirleyebilirsiniz.

Çözünürlük

Kopyalama sorununu düzeltme

1. seçenek [Önerilen seçenek]: İstemci uygulamasını, yinelenen başlıkları içermeyecek şekilde düzeltin

  1. Belirli bir istemcinin neden yinelenen üstbilgi gönderdiğini analiz edin. Örneğin, yukarıdaki durumda Expires. API proxy'lerinin yinelenen üst bilgiyi kabul etmesinin sorun olmadığını doğrulayın. Genellikle HTTP spesifikasyonu RFC7230 uyarınca istenmez.
  2. Bu durum istenmiyorsa istemci uygulamanızı, yinelenen başlıklar göndermeyecek şekilde değiştirin.

    Yukarıda bahsedilen örnekte, Expires başlığının aynı değerle iki kez gönderildiği görülmektedir. Bu durum istenmeyen bir durumdur. Bu sorunu, aşağıdaki örnekte gösterildiği gibi Expires üstbilgisini yalnızca bir kez ileterek düzeltebilirsiniz:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. İsteniyorsa ve yinelenen üstbilgilere izin vermek istiyorsanız 2. seçenek: CwC mülkünü kullanma bölümüne gidin.

CwC

2. seçenek: CwC mülkünü kullanma

Apigee ,istemci uygulamalarının ve hedef sunucuların Apigee Edge'deki API proxy'lerine yinelenen başlıklar göndermesine olanak tanıyan bir CwC özelliği HTTPHeader.<HeaderName> sunar.

CwC mülkü Değerler
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Örneğin, aşağıdaki özellik, ileti işlemcilerinde ayarlanarak Expires başlığı için yinelenenlere ve birden fazla değere izin verilebilir.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Özel bulut kullanıcısıysanız, istekte yinelenen üstbilgiler olsa bile 400 Bad Request hatası oluşturmasını engellemek için mülkü yapılandırabilirsiniz. Bu işlem için Configuring Message Processors to use duplicate headers (Yinelenen üstbilgileri kullanmak üzere mesaj işlemcilerini yapılandırma) başlıklı nasıl yapılır kılavuzundan yararlanabilirsiniz.
  2. Herkese açık bulut kullanıcısıysanız bu özelliği kuruluşunuz için yapılandırmak üzere Apigee Edge Destek Ekibi ile iletişime geçin.

Spesifikasyon

Apigee, istemci uygulamasının aşağıdaki RFC spesifikasyonlarına göre isteğin bir parçası olarak yinelenen başlıklar göndermemesini bekler:

Spesifikasyon
RFC 7230, bölüm 3.2.2: Alan Sırası
RFC 7230, bölüm 3.2 Üst Bilgi Alanları

Apigee Destek Ekibi'nden hâlâ yardıma ihtiyacınız varsa Toplanması gereken teşhis bilgileri 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
  • 400 hatasını yeniden oluşturmak için kullandığınız curl komutunu tamamlayın.
  • 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# değerlerinin yerine gerçek değerler girilir.

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