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
- 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ü
%HHolarak 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.
- Form verilerinin boyutu küçükse veriler aşağıdaki anahtar/değer çiftleri olarak gönderilir:
- 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:
- İstemci tarafından Apigee Edge'e gönderilen HTTP isteği şunları içerir:
Content-Type: application/x-www-form-urlencodedve- 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.
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:
- Apigee Edge kullanıcı arayüzünde oturum açın. Uygun bir role sahip bir kullanıcı olarak.
Sorunu incelemek istediğiniz kuruluşa geçin.
- Analyze > API Monitoring > Investigate (Analiz > API İzleme > İnceleme) sayfasına gidin.
- Hataları gözlemlediğiniz belirli zaman aralığını seçin.
Hata Kodunu Zaman ile karşılaştırın.
Aşağıda gösterildiği gibi, hata kodunun
protocol.http.BadFormDatabulunduğu bir hücreyi seçin:
protocol.http.BadFormDatahata koduyla ilgili bilgiler aşağıda gösterildiği gibi görüntülenir:
Günlükleri görüntüle'yi tıklayın ve başarısız olan isteğin satırını genişletin.
- 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
- Durum Kodu:
- Hata Kaynağı
proxyise, Hata Koduprotocol.http.BadFormDataise 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. - 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:
- İzleme oturumunu ve aşağıdakilerden birini etkinleştirin:
500 Internal Server Errorhatası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
Tüm FlowInfo'ları göster'in etkinleştirildiğinden emin olun:
- Başarısız olan isteklerden birini seçip izlemeyi inceleyin.
- İzlemenin farklı aşamalarında gezinin ve hatanın nerede oluştuğunu bulun.
Hatayı genellikle aşağıdaki politikalardan birinde görürsünüz:
Yukarıdaki örnek izlemede, hatanın
EV-ExtractFormParamsadlı ExtractVariables politikasında gerçekleştiğini unutmayın.Başarısız olan belirli politikanın ardından Error (Hata) adlı akışa gidin:
- İzleme kaydındaki aşağıdaki değerleri not edin:
hata:
Bad Form Datastate:
PROXY_REQ_FLOWerror.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.
- Hata değeri
- İzleme işleminde AX (Analytics Verileri Kaydedildi) aşamasına gidin ve tıklayın.
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:
X-Apigee-fault-code ve X-Apigee-fault-source değerlerinin sırasıyla
protocol.http.BadFormDatavepolicyolduğ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.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Bu örnekte X-Apigee-fault-policy,
extractvariables/EV- ExtractFormParams,yaniEV-ExtractFormParamsadlı 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:
- Özel bulut kullanıcısıysanız HTTP
500 Internal Server Errorile ilgili temel bilgileri belirlemek için NGINX erişim günlüklerini kullanabilirsiniz. NGINX erişim günlüklerini kontrol edin:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Belirli bir süre boyunca (sorun geçmişte yaşandıysa)
500hata koduyla hata olup olmadığını veya500ile başarısız olan isteklerin olup olmadığını arayın.protocol.http.BadFormData protocol.http.BadFormDatadeğeriyle eşleşen X-Apigee-fault-code ile ilgili500hataları 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.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- X-Apigee-fault-code, X-Apigee-fault-source değerlerinin sırasıyla
protocol.http.BadFormData,policyolduğ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. - Bu örnekte X-Apigee-fault-policy,
extractvariables/EV- ExtractFormParams,yaniEV-ExtractFormParamsadlı ExtractVariables politikası, form parametreleri okunurken başarısız oldu.
Neden: İstekteki form parametrelerinde izin verilmeyen karakterler var
Teşhis
500 Internal Server Erroriç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.- Hata Kodu
protocol.http.BadFormDataise, Hata Kaynağıproxyveyapolicydeğ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. - Hata Politikası'nda belirtilen politikayı inceleyin ve aşağıdaki bilgileri belirleyin:
- Kaynak: Politikanın verileri istekten mi yoksa yanıttan mı okuduğunu veya çıkardığını belirleyin.
- 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:
requestBu,
<Source>öğesiyle belirtilir.Form parametreleri:
usernamevepasswordBu,
<FormParam>öğesi içindeki<Pattern>öğesiyle belirtilir.
Bu, istemci tarafından Apigee Edge'e HTTP isteği kapsamında iletilen
usernameve/veyapasswordform 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:
requestBu durum,
<Copy>öğesindekisourceözelliğiyle belirtilir.Form parametreleri:
usernamevepasswordBu durum,
<FormParam>öğesindekinameözelliğiyle belirtilir.
Bu, istemci tarafından Apigee Edge'e HTTP isteğinin bir parçası olarak iletilen
usernameveyapasswordform parametrelerinin ya da her ikisinin de kullanılmasına izin verilmeyen karakterler içerdiğini gösterir.
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:
- 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.
- Kullanılmasına izin verilmeyen karakterler içeren form parametrelerinin yukarıdaki 3. adımda HTTP isteğinin bir parçası olduğunu belirlediyseniz
- Müşteriden İstek Alındı aşamasına gidin.
Aşağı kaydırarak Aşama Ayrıntıları bölümüne gidin ve İçerik İste'yi inceleyin.
- Yukarıdaki örnekte, form parametresi
passwordiçinde yüzde işareti (%) olduğunu unutmayın. - Yüzde işareti (
%) özel karakterlerin yüzde kodlaması için de kullanıldığından form verilerinde olduğu gibi kullanılamaz. - Bu nedenle, Apigee Edge,
500 Internal Server Errorileprotocol.http.BadFormDatahata koduyla yanıt verir.
Gerçek istek
Gerçek isteği kullanarak doğrulamak için:
- Hedef sunucuya yapılan gerçek isteğe erişiminiz yoksa Çözüm bölümüne gidin.
- Apigee Edge'e yapılan gerçek isteğe erişiminiz varsa aşağıdaki adımları uygulayın:
- 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 karakterlerZYiç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.
- Form verilerinin içeriğini inceleyin ve yüzde işareti (
- Yukarıdaki iki örnekte, Apigee Edge'e HTTP isteği kapsamında gönderilen form verileri, kullanılmasına izin verilmeyen karakterler içeriyor.
- Bu nedenle, Apigee Edge
500 Internal Server Errorileprotocol.http.BadFormDatahata koduyla yanıt verir.
Çözünürlük
- İ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.
- 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%24iş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%25olacak ş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ı
curlkomutunun tamamı,500 Internal Server Erroröğesiniprotocol.http.BadFormDatahata 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_logNerede: 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