500 Dahili Sunucu Hatası - BadFormData

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

Belirti

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

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 gidermenin ayrıntılarına geçmeden önce form verilerinin ne olduğunu görelim.

Form verileri, kullanıcı tarafından genellikle öğeler içeren bir HTML formu aracılığıyla sağlanan bilgilerdir bir metin giriş kutusu, düğme veya onay kutusu gibi. Form verileri genellikle bir dizi anahtar/değer çiftlerinin bir parçası olarak kullanabilirsiniz.

Form veri aktarımı

  1. İçerik Türü: application/x-www-form-urlcoding
    • Form verilerinin boyutu küçükse veriler şunları içeren anahtar/değer çiftleri olarak gönderilir:

      Form verilerini içeren örnek istek:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • Anahtarlar ve değerlerdeki alfanümerik olmayan karakterler kodlanan yüzde, yani bir karakter üçlüceği olarak temsil edilir Yüzde işareti ve ardından iki on altılı basamaktan oluşan %HH belirli bir karakterin ASCII kodunu temsil eder.
    • Bu nedenle, form verilerinde yüzde işaretine (%) izin verilse de özel bir kaçış dizisinin başlangıcı olarak yorumlanır. Bu nedenle, form verilerinin anahtar veya değerde yüzde işaretini (%) içeriyorsa bu işaret iletilmelidir %25, , yüzde işareti için ASCII kodunu temsil eder (%) karakter.
  2. İçerik Türü: çok parçalı/form-veriler

    Büyük miktarlarda ikili verileri veya ASCII olmayan içeren metinler iletmek istiyorsanız kullanıyorsanız verileri Content-Type: çok parçalı/form-veri: Formlar - Bölüm 17.13.4.2

Olası nedenler

Bu hata yalnızca aşağıdaki koşulların tamamı 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 (%) veya yüzde işareti olan form verileri (%) ve ardından şu nedenle izin verilmeyen geçersiz onaltılık karakterler gelir: Formlar - Bölüm 17.13.4.1.
  2. Apigee Edge'deki API proxy'si, karakter içeren belirli form parametrelerini okur veya AttributionMessage politikası.

    Örneğin, form verileri yüzde işaretini (%) olduğu gibi ( kodlaması) veya yüzde işareti (%) ve ardından geçersiz onaltılık anahtar ve/veya değerde yer alıyorsa bu hatayı alırsınız.

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

    Neden Açıklama Şunun için geçerli sorun giderme talimatları:
    İstekteki form parametrelerinde izin verilmeyen karakterler var İstemci tarafından HTTP isteğinin bir parçası olarak iletilen form parametreleri kullanılmasına izin verilmeyen karakterler bulunmalıdır. 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. Zaman ile Hata Kodu'nun grafiğini çizin.

  6. protocol.http.BadFormData hata koduna sahip bir hücre seçin: aşağıda gösterilmiştir:

    (resmi büyüt)

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

    (resmi büyüt)

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

  9. Günlükler penceresinde aşağıdaki ayrıntılara dikkat 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 ve Hata Politikası boş olmamalıdır. Hata bölümünde belirtilen politika kullanılırken hatanın oluştuğunu gösterir Politika, kullanılmasına izin verilmeyen karakterler bulunmalıdır.
  11. Bu örnekte X-Apigee-fault-policy extractvariables/EV- ExtractFormParams, şeklindedir. Bu durum, EV-ExtractFormParams, formu okurken veya ayıklarken başarısız oldu parametreleridir.

İzleme aracı

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

  1. İzleme oturumunu etkinleştir ve şunlardan birini yapın:
    • 500 Internal Server Error hatasının oluşmasını bekleyin veya
    • Sorunu yeniden oluşturabiliyorsanız API çağrısını yaparak sorunu yeniden oluşturun 500 Internal Server Error.
  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 politikalardan birinde bulursunuz:

    Yukarıdaki örnek izlemede hatanın EV-ExtractFormParams adlı ExtractDeğişkenler politikası.

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

  7. İzdeki aşağıdaki değerleri not edin:

    hata: Bad Form Data

    eyalet: PROXY_REQ_FLOW

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

    • Bad Form Data hatasının değeri, formun parametreleri, kullanılmasına izin verilmeyen bazı karakterler içeriyordu.
    • Eyaletin değeri PROXY_REQ_FLOW, , hata, API proxy'sinin istek akışında oluşmuştur.
  8. İzlemedeki AX (Analytics Verilerinin Kaydedilen) Aşamasına gidin ve şunu tıklayın: somut olarak ortaya koyar.
  9. Aşama Ayrıntıları - Hata Başlıkları bölümüne ilerleyin ve X-Apigee-fault-code, X-Apigee-fault-source değerlerini belirleyerek ve X-Apigee-fault-policy bölümünü aşağıda görebilirsiniz:

  10. X-Apigee-fault-code ve X-Apigee-fault-source değerlerinin aynısı sırasıyla protocol.http.BadFormData ve policy ve X-Apigee-fault-policy sayfası boş değildir. Bu, hatanın X-Apigee-fault-policy bölümünde belirtilen ilgili politika, herhangi bir karakter içeren form verilerini (form parametreleri) okuma veya ayıklama kullanılmasına izin verilmez.

    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 ExtractVariables politikası şu ada sahiptir) Formu okurken veya ayıklarken EV-ExtractFormParams başarısız oldu parametreleridir.

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 500 Internal Server Error ile 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

  3. Hata kodu içeren 500 hatası olup olmadığını görmek için arama yapın Belirli bir süre boyunca protocol.http.BadFormData (sorun varsa olup olmadığını kontrol edin) veya hâlâ başarısız olan talepler 500
  4. X-Apigee-fault-code ile herhangi bir 500 hatası bulursanız protocol.http.BadFormData değeriyle eşleşiyorsa X-Apigee-fault-source'un değerini tespit edip X-Apigee-fault-policy.

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

    NGINX erişim günlüğünden yukarıdaki örnek giriş, X-Apigee-fault-code ve X-Apigee-fault-source:

    Ü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 sırasıyla protocol.http.BadFormData, policy ve X-Apigee-fault-policy sayfası boş değildir. Bu, hatanın X-Apigee-fault-policy, bölümünde belirtilen ilgili politikanın herhangi bir karakter içeren form verilerini (form parametreleri) okuma veya ayıklama kullanılmasına izin verilmez.
  6. Bu örnekte X-Apigee-fault-policy extractvariables/EV- ExtractFormParams, (yani ExtractVariables politikası şu ada sahiptir) Form okunurken EV-ExtractFormParams başarısız oldu parametreleridir.

Neden: İstekteki form parametrelerinde izin verilmeyen karakterler var

Teşhis

  1. Açıklanan şekilde API İzleme, İzleme aracı veya NGINX erişim günlüklerini kullanarak 500 Internal Server Error için Hata Kodu, Hata Kaynağı ve Hata Politikası'nı belirleyin Genel teşhis adımları başlıklı makaleyi inceleyin.
  2. Hata Kodu protocol.http.BadFormData ise Hata Kaynağı proxy veya policy değeri ve Hata Politikası şu değil: boşsa, bu değer,,'nda belirtilen politikanın (form parametreleri) kullanarak form verilerini okuma veya ayıklama.
  3. Hata Politikası'nda belirtilen politikayı inceleyin ve aşağıdakileri belirleyin: bilgi:
    1. Kaynak: Politikanın yanıt verebilmeniz için kritik önem taşır.
    2. Form parametreleri: politikası.

      Örnek 1

      1. örnek: Form parametrelerini çıkaran ExtractVariables politikası:

            <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> öğesi ile gösterilir

      • Form parametreleri: username ve password

        Bu,<Pattern> <FormParam> öğe

      Bu, username ve/veya password, istemci tarafından HTTP isteğinin bir parçası olarak Apigee Edge, kullanılmasına izin verilmeyen karakterler içeriyor.

      Örnek 2

      2. örnek: Form parametrelerini kopyalayan atamayla ilgili politika:

            <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,source <Copy> öğe

      • Form parametreleri: username ve password

        Bu,name <FormParam> öğe

      Bu, username veya password form parametrelerinin Her ikisi de istemci tarafından HTTP isteği olarak Apigee Edge'e iletilen herhangi bir izin verilmeyen karakterlerin kullanılmasına izin verilmez.

  4. İzin verilmeyen karakter olup olmadığını kontrol edin 3. adımda tanımlanan form parametrelerindeki karakterler kullanıldı aşağıdaki yöntemlerden birini kullanın:

    İzleme aracı

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

    1. Başarısız olan isteğin izini aşağıdaki sayfada açıklandığı gibi yakaladıysanız: Yaygın teşhis adımları'nı tıklayın, ardından unutmayın.
    2. Form parametrelerinin herhangi bir karakter içeren kullanılmasına izin verilmeyen veriler, Yukarıdaki 3. adıma ve
      1. Müşteriden İstek Alındı aşamasına gidin.
      2. Aşama Ayrıntıları bölümüne gidin ve İçerik İsteyin.

        ( resmi büyüt)

      3. Yukarıdaki örnekte, password form parametresinin yüzde işaretini (%) içerir.
      4. Yüzde işareti (%) yüzde kodlaması özel karakterler içeriyorsa olduğu gibi kullanılamaz. olduğunu unutmayın.
      5. Bu nedenle Apigee Edge, Hata kodunu içeren 500 Internal Server Error protocol.http.BadFormData.

    Gerçek istek

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

    1. Hedef sunucuya gönderilen gerçek isteğe erişiminiz yoksa ardından Çözünürlük'e gidin.
    2. Apigee Edge'e gönderilen isteğe erişiminiz varsa şu adımları uygulayın:
      1. Form verilerinin içeriğini inceleyin ve yüzde işareti (%) gibi kullanılmasına izin verilmez veya yüzde işareti (%) ve ardından geçersiz onaltılık karakterler yer alır.

        Örnek 1

        1. Örnek İstek: İ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 gelen geçersiz on altılı karakterler: ZY.

        Örnek 2

        2. Örnek İstek: 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şaretini (%) içerdiğine ve olduğu gibi aktarılır.

    3. Yukarıdaki iki örnekte, HTTP isteğinin bir parçası olarak Apigee Edge, kullanılmasına izin verilmeyen karakterler içeriyor.
    4. Bu nedenle Apigee Edge 500 Internal Server Error ile yanıt veriyor protocol.http.BadFormData hata koduyla.

Çözünürlük

  1. Form verilerinin veya parametrelerinin hem anahtarlarındaki hem de değerlerindeki özel karakterlerin bulunduğundan emin olun. HTTP isteğinin bir parçası olarak gönderilen iletiler her zaman bölümünde açıklandığı gibi kodlanır. Form Verileri: application/x-www-form-urlcoding.
  2. Yukarıda açıklanan örnekler için sorunları aşağıdaki şekilde düzeltebilirsiniz:

    Örnek 1

    1. Örnek: İstek kapsamında iletilen form verileri:

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

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

    Örnek 2

    2. Örnek İstek: 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:

    Şunu kullanın: yüzde (%) işareti için yüzdelik kodlaması ise dosyayı %25 aşağıda gösterildiği gibidir:

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

Spesifikasyon

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

Spesifikasyon
Form Verileri: application/x-www-form-urlcoding

Hâlâ Apigee Destek Ekibi'nden yardım almanız gerekiyorsa teşhis bilgileri bölümüne bakın.

Teşhis bilgileri toplanmalıdır

Yukarıdaki talimatları uygulamanıza rağmen sorun devam ederse aşağıdaki 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'si adı
  • Yeniden oluşturmak için kullanılan curl komutunu tamamlayın Hata koduyla 500 Internal Server Error protocol.http.BadFormData
  • 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

Referanslar