500 Dahili Sunucu Hatası - BadFormData

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Belirti

İstemci uygulaması, API çağrılarına yanıt olarak 500 Internal Server Error HTTP durum kodunu ve protocol.http.BadFormData hata kodunu alır.

Hata mesajı

İstemci uygulaması aşağıdaki yanıt kodunu alır:

HTTP/1.1 500 Internal Server Error

Ayrıca aşağıdaki hata mesajını da görebilirsiniz:

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

Form verileri

Bu sorunu gidermeyle ilgili ayrıntılara girmeden önce form verilerinin ne olduğunu anlayalım.

Form verileri, kullanıcının genellikle bir HTML formu aracılığıyla sağladığı bilgilerdir. Bu formda metin girişi kutusu, düğme veya onay kutusu gibi öğeler bulunur. Form verileri genellikle HTTP isteklerinin veya yanıtlarının bir parçası olarak bir dizi anahtar/değer çifti şeklinde gönderilir.

Form verilerinin iletilmesi

  1. Content-Type: application/x-www-form-urlencoded
    • Form verilerinin boyutu küçükse veriler aşağıdaki anahtar/değer çiftleri olarak gönderilir:
      • Her iki anahtardaki karakterler, Formlar - Bölüm 17.13.4.1'de açıklanan kurallara göre kodlanmıştır.
      • Başlık Content-Type: application/x-www-form-urlencoded

      Form verileri içeren örnek istek:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • Hem anahtarlardaki hem de değerlerdeki alfanümerik olmayan karakterler yüzde kodlamalıdır. Yani, belirli karakterin ASCII kodunu temsil eden iki onaltılık basamaktan sonra gelen bir yüzde işaretiyle oluşan bir karakter üçlüsü %HH olarak gösterilirler.
    • Bu nedenle, yüzde işaretine (%) form verilerinde izin verilse de özel bir kaçış dizisinin başlangıcı olarak yorumlanır. Bu nedenle, form verilerinin anahtar veya değerde yüzde işareti (%) içermesi gerekiyorsa yüzde işareti (%) karakterinin ASCII kodunu temsil eden %25, olarak iletilmelidir.
  2. Content-Type: multipart/form-data

    Büyük miktarda ikili veri veya ASCII olmayan karakterler içeren metin iletmek istiyorsanız verileri Content-Type: multipart/form-data ile gönderebilirsiniz. Bu konu, Forms - Section 17.13.4.2 bölümünde açıklanmıştır.

Olası nedenler

Bu hata yalnızca aşağıdaki koşulların tümü karşılandığında ortaya çıkar:

  1. İstemci tarafından Apigee Edge'e gönderilen HTTP isteği şunları içerir:
    1. Content-Type: application/x-www-form-urlencoded ve
    2. Yüzde işareti (%) içeren veya yüzde işaretinden (%) sonra Formlar - Bölüm 17.13.4.1'e göre izin verilmeyen geçersiz onaltılık karakterler içeren form verileri.
  2. Apigee Edge'deki API proxy'si, ExtractVariables veya AssignMessage politikası kullanılarak istek akışında kullanılmasına izin verilmeyen karakterleri içeren belirli form parametrelerini okur.

    Örneğin, form verileri yüzde işaretini (%) olduğu gibi (kodlama olmadan) veya anahtar ve/veya değerde yüzde işareti (%) ile birlikte geçersiz onaltılık karakterler içeriyorsa bu hatayı alırsınız.

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

    Neden Açıklama Aşağıdaki ürünler için geçerli sorun giderme talimatları
    İstekteki Form Parametreleri, izin verilmeyen karakterler içeriyor İstemci tarafından HTTP isteğinin bir parçası olarak iletilen form parametreleri, kullanılmasına izin verilmeyen karakterler 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. Hata Kodunu Zaman ile karşılaştırın.

  6. Aşağıda gösterildiği gibi, hata kodunun protocol.http.BadFormData bulunduğu bir hücreyi seçin:

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

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

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

  8. Günlükleri görüntüle'yi tıklayın ve başarısız olan isteğin satırını genişletin.

  9. Günlükler penceresinde aşağıdaki ayrıntıları not edin:
    • Durum Kodu: 500
    • Hata Kaynağı: proxy
    • Hata Kodu: protocol.http.BadFormData
    • Hata Politikası: extractvariables/EV-ExtractFormParams
  10. Hata Kaynağı proxy ise, Hata Kodu protocol.http.BadFormData ise ve Hata Politikası boş değilse bu, Hata Politikası'nda belirtilen politika form verilerini (form parametreleri) okurken veya ayıklarken izin verilmeyen karakterlerin kullanıldığı bir hata oluştuğunu gösterir.
  11. Bu örnekte X-Apigee-fault-policy, extractvariables/EV- ExtractFormParams, değerine sahip. Bu, EV-ExtractFormParams adlı ExtractVariables politikasının, form parametrelerini okurken veya ayıklarken başarısız olduğu anlamına geliyor.

İzleme aracı

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

  1. İzleme oturumunu ve aşağıdakilerden birini etkinleştirin:
    • 500 Internal Server Error hatasının oluşmasını bekleyin veya
    • Sorunu yeniden oluşturabiliyorsanız sorunu yeniden oluşturmak için API çağrısı yapın. 500 Internal Server Error
  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 politikalardan birinde görürsünüz:

    Yukarıdaki örnek izlemede, hatanın EV-ExtractFormParams adlı ExtractVariables politikasında gerçekleştiğini unutmayın.

  6. Başarısız olan belirli politikanın ardından Error (Hata) adlı akışa gidin:

  7. İzleme kaydındaki aşağıdaki değerleri not edin:

    hata: Bad Form Data

    state: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • Hata değeri Bad Form Data, form parametrelerinde kullanılmasına izin verilmeyen bazı karakterler olduğunu gösterir.
    • Durumun PROXY_REQ_FLOW, değeri, hatanın API proxy'sinin istek akışında oluştuğunu gösterir.
  8. İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve tıklayın.
  9. Aşağı kaydırarak Phase Details - Error Headers (Aşama Ayrıntıları - Hata Başlıkları) bölümüne gidin ve X-Apigee-fault-code, X-Apigee-fault-source ve X-Apigee-fault-policy değerlerini aşağıdaki gibi belirleyin:

  10. X-Apigee-fault-code ve X-Apigee-fault-source değerlerinin sırasıyla protocol.http.BadFormData ve policy olduğunu, X-Apigee-fault-policy değerinin ise boş olmadığını unutmayın. Bu, X-Apigee-fault-policy içinde belirtilen politika, form verilerini (form parametreleri) okurken veya ayıklarken izin verilmeyen karakterler içeren bir hata oluştuğunu gösterir.

    Yanıt başlıkları Değer
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. Bu örnekte X-Apigee-fault-policy, extractvariables/EV- ExtractFormParams, yani EV-ExtractFormParams adlı ExtractVariables politikası, form parametrelerini okurken veya ayıklarken başarısız oldu.

NGINX

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

  1. Özel bulut kullanıcısıysanız HTTP 500 Internal Server Error ile 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

  3. Belirli bir süre boyunca (sorun geçmişte yaşandıysa) 500 hata koduyla hata olup olmadığını veya 500 ile başarısız olan isteklerin olup olmadığını arayın.protocol.http.BadFormData
  4. protocol.http.BadFormData değeriyle eşleşen X-Apigee-fault-code ile ilgili 500 hataları bulursanız X-Apigee-fault-source ve X-Apigee-fault-policy değerini belirleyin.

    NGINX erişim günlüğünden örnek 500 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:

    Üst bilgiler Değer
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. X-Apigee-fault-code, X-Apigee-fault-source değerlerinin sırasıyla protocol.http.BadFormData, policy olduğunu ve X-Apigee-fault-policy'nin boş olmadığını unutmayın. Bu,X-Apigee-fault-policy içinde belirtilen politika, izin verilmeyen karakterler içeren form verilerini (form parametreleri) okurken veya ayıklarken hatanın oluştuğunu gösterir.
  6. Bu örnekte X-Apigee-fault-policy, extractvariables/EV- ExtractFormParams, yani EV-ExtractFormParams adlı ExtractVariables politikası, form parametreleri okunurken başarısız oldu.

Neden: İstekteki form parametrelerinde izin verilmeyen karakterler var

Teşhis

  1. 500 Internal Server Error için Hata Kodunu, Hata Kaynağını ve Hata Politikasını, Genel teşhis adımları bölümünde açıklandığı gibi API İzleme, İzleme aracı veya NGINX erişim günlüklerini kullanarak belirleyin.
  2. Hata Kodu protocol.http.BadFormData ise, Hata Kaynağı proxy veya policy değerine sahipse ve Hata Politikası boş değilse, bu durum,form verileri (form parametreleri) okunurken veya ayıklanırken Hata Politikası'nda belirtilen politikanın başarısız olduğunu gösterir.
  3. Hata Politikası'nda belirtilen politikayı inceleyin ve aşağıdaki bilgileri belirleyin:
    1. Kaynak: Politikanın verileri istekten mi yoksa yanıttan mı okuduğunu veya çıkardığını belirleyin.
    2. Form parametreleri: Politikada okunan belirli form parametrelerini belirleyin.

      1. örnek

      1. örnek: ExtractVariables politikası, form parametrelerini ayıklıyor:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      Yukarıdaki ExtractVariables politikasında:

      • Kaynak: request

        Bu, <Source> öğesiyle belirtilir.

      • Form parametreleri: username ve password

        Bu, <FormParam> öğesi içindeki <Pattern> öğesiyle belirtilir.

      Bu, istemci tarafından Apigee Edge'e HTTP isteği kapsamında iletilen username ve/veya password form parametrelerinin, kullanılmasına izin verilmeyen karakterler içerdiğini gösterir.

      2. örnek

      2. örnek: AssignMessage politikası, form parametrelerini kopyalıyor:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      Yukarıdaki ExtractVariables politikasında:

      • Kaynak: request

        Bu durum, <Copy> öğesindeki source özelliğiyle belirtilir.

      • Form parametreleri: username ve password

        Bu durum, <FormParam> öğesindeki name özelliğiyle belirtilir.

      Bu, istemci tarafından Apigee Edge'e HTTP isteğinin bir parçası olarak iletilen username veya password form parametrelerinin ya da her ikisinin de kullanılmasına izin verilmeyen karakterler içerdiğini gösterir.

  4. Aşağıdaki yöntemlerden birini kullanarak 3. adımda belirtilen form parametrelerinde izin verilmeyen karakterler olup olmadığını kontrol edin:

    İzleme aracı

    İzleme aracını kullanarak doğrulamak için:

    1. Başarısız olan isteğin izini Genel teşhis adımları bölümünde açıklandığı şekilde yakaladıysanız başarısız olan isteklerden birini seçin.
    2. Kullanılmasına izin verilmeyen karakterler içeren form parametrelerinin yukarıdaki 3. adımda HTTP isteğinin bir parçası olduğunu belirlediyseniz
      1. Müşteriden İstek Alındı aşamasına gidin.
      2. Aşağı kaydırarak Aşama Ayrıntıları bölümüne gidin ve İçerik İste'yi inceleyin.

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

      3. Yukarıdaki örnekte, form parametresi password içinde yüzde işareti (%) olduğunu unutmayın.
      4. Yüzde işareti (%) özel karakterlerin yüzde kodlaması için de kullanıldığından form verilerinde olduğu gibi kullanılamaz.
      5. Bu nedenle, Apigee Edge, 500 Internal Server Error ile protocol.http.BadFormData hata koduyla yanıt verir.

    Gerçek istek

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

    1. Hedef sunucuya yapılan gerçek isteğe erişiminiz yoksa Çözüm bölümüne gidin.
    2. Apigee Edge'e yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:
      1. Form verilerinin içeriğini inceleyin ve yüzde işareti (%) veya geçersiz onaltılık karakterlerle birlikte kullanılan yüzde işareti (%) gibi izin verilmeyen karakterler içerip içermediğini kontrol edin.

        1. örnek

        1. örnek istek: İstek kapsamında form verileri

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        Bu örnekte, client_secret öğesinin yüzde işareti (%) ve ardından geçersiz onaltılık karakterler ZY içerdiğini unutmayın.

        2. örnek

        2. örnek istek: Dosyada iletilen form verileri:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        form_data.xml dosyasının içeriği:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>

        Bu örnekte, password öğesinin yüzde işareti (%) içerdiğini ve bunun form verilerinde olduğu gibi iletilmemesi gerektiğini unutmayın.

    3. Yukarıdaki iki örnekte, Apigee Edge'e HTTP isteği kapsamında gönderilen form verileri, kullanılmasına izin verilmeyen karakterler içeriyor.
    4. Bu nedenle, Apigee Edge 500 Internal Server Error ile protocol.http.BadFormData hata koduyla yanıt verir.

Çözünürlük

  1. İstemci tarafından HTTP isteğinin bir parçası olarak gönderilen form verilerinin veya parametrelerin hem anahtarlarında hem de değerlerinde bulunan özel karakterlerin her zaman Form Verileri - application/x-www-form-urlencoded bölümünde açıklandığı şekilde kodlandığından emin olun.
  2. Yukarıda bahsedilen örneklerde sorunları aşağıdaki gibi düzeltebilirsiniz:

    1. örnek

    1. örnek: Form verileri, isteğin bir parçası olarak iletiliyor:

    Belirli bir karakterin ASCII koduyla eşleşen geçerli onaltılık karakterler kullanın. Örneğin, dolar işareti ($) göndermek istiyorsanız %24 işaretini aşağıdaki gibi kullanın:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    2. örnek

    2. örnek istek: Dosyada iletilen form verileri:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    form_data.xml dosyasının içeriği:

    Yüzde (%) işareti için yüzde kodlaması kullanın. Yani dosyayı aşağıdaki gibi %25 olacak şekilde değiştirin:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>

Spesifikasyon

Apigee Edge, form verilerinin aşağıdaki spesifikasyonlara göre gönderilmesini bekler:

Spesifikasyon
Form Verileri - application/x-www-form-urlencoded

Hâlâ Apigee Destek Ekibi'nden yardıma ihtiyacınız varsa Toplanması gereken teşhis bilgileri başlıklı makaleyi inceleyin.

Teşhis bilgilerini toplamalıdır

Yukarıdaki talimatları uyguladıktan sonra sorun devam ederse aşağıdaki teşhis bilgilerini toplayın ve 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'sinin adı
  • curl komutunun tamamı, 500 Internal Server Error öğesini protocol.http.BadFormData hata koduyla yeniden oluşturmak için kullanıldı.
  • 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 işleyici sistem günlükleri

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

Referanslar