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

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 protocol.http.DuplicateHeader API çağrılarına yanıt olarak kullanılı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'de kopyası olmasına izin verilmeyen belirli bir HTTP üstbilgisinde ortaya çıkar. Edge, tarafından gönderilen HTTP isteğinin parçası olarak aynı veya farklı değerlerle birden fazla kez görünür istemciyi Apigee Edge'e bağlayabilirsiniz.

uyarınca RFC 7230, bölüm 3.2.2: Alan Sırası, bir gönderen birden çok üstbilgi OLUŞTURMAMALIDIR bir iletide aynı alan adına sahip alanları oluşturmadığı sürece, üstbilgi alanı virgülle ayrılmış bir liste olarak tanımlanır, [ör. #(values)] ya da başlık alanı bir iyi bilinen bir istisnadır. Apigee Edge belirli bir başlık bulursa ona yinelemeleri, istemci tarafından gönderilen HTTP isteğinde birden fazla kez içeriyorsa, 400 Bad Request ve hata koduyla yanıt verir protocol.http.DuplicateHeader.

Bu hatanın olası nedenleri aşağıda açıklanmıştır:

Neden Açıklama Şunun için geçerli sorun giderme talimatları:
İstekte yinelenen başlık İstemci uygulamasından Apigee'ye gönderilen HTTP isteğinde yinelenen başlıklar var. 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 bir role sahip olmalıdır.
  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. protocol.http.DuplicateHeader hata koduna sahip bir hücre seçin aşağıdaki gibidir:

  8. protocol.http.DuplicateHeader hata koduyla ilgili bilgi: 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 isteğin bulunduğu satırı genişletin.
  10. Günlükler penceresinde aşağıdaki ayrıntılara dikkat edin:
    1. Durum Kodu: 400
    2. Hata Kaynağı: apigee
    3. Hata Kodu: protocol.http.DuplicateHeader.
  11. Hata Kaynağı apigee veya MP değerine ve Hata Kodu değerine sahipse protocol.http.DuplicateHeader değerine ayarlanırsa bu, istemci yinelenen başlıklar içeriyordur.

İzleme aracı

NGINX

NGINX erişim günlüklerini kullanarak hatayı teşhis etmek için:

  1. Private Cloud kullanıcısıysanız aşağıdakileri belirlemek için NGINX erişim günlüklerini kullanabilirsiniz: HTTP 400 hatalarıyla ilgili önemli bilgiler.
  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# şununla değiştirilir: gerçek değerler.

  3. Belirli bir sürede herhangi bir 400 hatası olup olmadığını görmek için arama yapın ( olup olmadığını kontrol edin) veya hâlâ başarısız olan bir istek varsa 400
  4. X-Apigee-fault-code ile herhangi bir 400 hatası bulursanız protocol.http.DuplicateHeader değeriyle aynı olduğunda, X-Apigee-fault-source.'un değerini belirleyin.

    NGINX erişim günlüğünden örnek 400 hatası:

    NGINX Erişim günlüğünden alınan yukarıdaki örnek giriş, X-Apigee- hata kodu ve X-Apigee-fault-source:

    Yanıt Başlıkları Değer
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source MP

Neden: İstekte yinelenen başlık

Teşhis

  1. API kullanılarak gözlemlenen hatanın Hata Kodu ve Hata Kaynağı'nı belirleme Yaygın teşhis adımlarında açıklandığı şekilde izleme veya NGINX erişim günlükleri.
  2. Hata Kaynağı apigee veya MP değerine sahipse bu İstemci uygulaması tarafından Apigee'ye gönderilen isteğin yinelenen bir istek içerdiğini gösterir başlıklar.
  3. İsteğin bir parçası olarak birden çok kez gönderilen asıl başlığı belirlemek için aşağıdaki yöntemlerden birini kullanabilirsiniz:

    Hata mesajı

    Hata mesajını kullanma

    1. Apigee Edge'den alınan hata mesajının tamamına erişiminiz varsa faultstring inceleyin. faultstring, birden fazla kez gönderilmiş olan üstbilgi adını içerir.

      Örnek hata mesajı:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. Yukarıdaki hata iletisinde Expires üstbilgisinin faultstring adresinde görüldüğü gibi birden fazla kez gönderildi.

    Gerçek istek

    Asıl isteği kullanma

    1. İstemci uygulamanın yaptığı asıl isteğe erişiminiz varsa şu adımları uygulayın:

      1. İstekte iletilen üstbilgilerin listesini doğrulayın.
      2. Belirli bir başlığın aynı zamanda birden fazla kez aynı değere sahip veya farklı değerlerle istekliyse bunun nedeni budur. bu hata için.

      Ö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ığı, şu değerden daha fazla gönderildi: bir kez. Bu nedenle bu istek 400 Bad Request hatasıyla başarısız olur ve hata kodu: protocol.http.DuplicateHeader.

    2. Alternatif olarak, istemci günlüklerine erişiminiz varsa, veya Apigee Edge'e gönderilen gerçek istek hakkında bilgi verir birden fazla kez gönderilir.

Çözünürlük

Kopyayı düzeltin

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

  1. İlgili istemcinin yinelenen üstbilgi gönderme nedenini analiz edin. Örneğin, Yukarıdaki örnekte Expires. API proxy'lerinin kabul edebileceğini doğrulayın tekrarlandığından emin olun. Genellikle, HTTP spesifikasyonuna göre bu istenmemektedir RFC7230.
  2. İstenmiyorsa istemci uygulamanızı yinelenen başlıklar göndermeyecek şekilde değiştirin.

    Yukarıda açıklanan örnekte Expires başlığının gönderildiği fark edilmiştir. 2 katına çıkar. Bu da istenen bir durumdur. Sorunu, Expires başlığı, aşağıda gösterildiği gibi yalnızca bir kez gösterilir:

    curl https://HOST_ALIAS/duplicateheadertest -v -H "Expires: Mon, 21 June 2021 07:28:00 GMT"
    
  3. İsterseniz ve yinelenen başlıklara izin vermek istiyorsanız 2. Seçenek: CwC özelliğini kullanma.

CwC

2. seçenek CwC özelliğini kullanma

Apigee, CwC mülkü olan HTTPHeader.<HeaderName> uygulamaların ve hedef sunucuların Apigee Edge'deki API proxy'lerine yinelenen üstbilgiler göndermesine izin verir.

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

Örneğin, aşağıdaki özellik Mesaj İşleyicileri üzerinde yinelenenlere ve Expires başlığı için birden fazla değer.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Private Cloud kullanıcısıysanız mülkü yapılandırarak Apigee Edge'in 400 Bad Request hatası vermesini (istekte bulunsa bile) yinelenen üstbilgiler içeriyorsa İleti işlemcilerini yinelenen üstbilgileri kullanacak şekilde yapılandırma "nasıl yapılır?" kılavuzu.
  2. Herkese Açık Bulut kullanıcısıysanız bu özelliği yapılandırmak için Apigee Edge Destek Ekibi ile iletişime geçin kuruluşunuz için hazırlar.

Spesifikasyon

Apigee, istemci uygulamasının istek kapsamında yinelenen başlıklar göndermemesini bekler aşağıdaki RFC spesifikasyonlarına göre:

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

Hâlâ Apigee Destek Ekibi'nden yardım almak istiyorsanız şu sayfaya 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
  • 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

    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.