Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi
Apigee X. info
Gejala
Aplikasi klien mendapatkan kode status HTTP 500 Internal Server Error dengan
kode error protocol.http.BadFormData sebagai respons untuk panggilan API.
Pesan error
Aplikasi klien mendapatkan kode respons berikut:
HTTP/1.1 500 Internal Server Error
Selain itu, Anda mungkin melihat pesan error berikut:
{
"fault":{
"faultstring":"Bad Form Data",
"detail":{
"errorcode":"protocol.http.BadFormData"
}
}
}Data formulir
Sebelum membahas detail pemecahan masalah ini, mari pahami apa itu data formulir.
Data formulir adalah informasi yang diberikan oleh pengguna, biasanya melalui formulir HTML yang memiliki elemen seperti kotak input teks, tombol, atau kotak centang. Data formulir umumnya dikirim sebagai serangkaian pasangan nilai kunci sebagai bagian dari permintaan atau respons HTTP.
Transmisi data formulir
- Content-Type: application/x-www-form-urlencoded
- Jika ukuran data formulir kecil, data akan dikirim sebagai pasangan nilai kunci dengan:
- Karakter dalam kedua kunci dienkode sesuai dengan aturan yang dijelaskan dalam Bentuk - Bagian 17.13.4.1
- Header
Content-Type: application/x-www-form-urlencoded
Contoh permintaan dengan data formulir:
curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
- Karakter non-alfanumerik dalam kunci dan nilai
dienkode persen, yaitu, diwakili sebagai triplet karakter
%HH, yang terdiri dari tanda persen yang diikuti dengan dua digit heksadesimal yang merepresentasikan kode ASCII dari karakter tertentu. - Oleh karena itu, meskipun tanda persen (
%) diizinkan dalam data formulir, tanda tersebut ditafsirkan sebagai awal dari urutan escape khusus. Oleh karena itu, jika data formulir perlu berisi tanda persen (%) di kunci atau nilai, maka data tersebut harus dikirimkan sebagai%25,yang merepresentasikan kode ASCII untuk karakter tanda persen (%).
- Jika ukuran data formulir kecil, data akan dikirim sebagai pasangan nilai kunci dengan:
- Content-Type: multipart/form-data
Jika Anda ingin mengirimkan data biner atau teks dalam jumlah besar yang berisi karakter non-ASCII, Anda dapat mengirimkan data dengan
Content-Type:multipart/form-data seperti yang dijelaskan dalam Forms - Section 17.13.4.2
Kemungkinan penyebab
Error ini terjadi jika dan hanya jika semua kondisi berikut terpenuhi:
- Permintaan HTTP yang dikirim oleh klien ke Apigee Edge berisi:
Content-Type: application/x-www-form-urlencoded, dan- Data formulir dengan tanda persen (
%), atau tanda persen (%) diikuti dengan karakter heksadesimal tidak valid yang tidak diizinkan sesuai dengan Formulir - Bagian 17.13.4.1.
Proxy API di Apigee Edge membaca parameter formulir tertentu yang berisi karakter apa pun yang tidak diizinkan untuk digunakan dalam alur permintaan menggunakan kebijakan ExtractVariables atau AssignMessage.
Misalnya, jika data formulir berisi tanda persen (
%) apa adanya (tanpa encoding) atau tanda persen (%) diikuti dengan karakter heksadesimal yang tidak valid dalam kunci dan/atau nilai, Anda akan mendapatkan error ini.Berikut kemungkinan penyebab error ini:
Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk Parameter Formulir dalam permintaan berisi karakter yang tidak diizinkan Parameter formulir yang diteruskan sebagai bagian dari permintaan HTTP oleh klien berisi karakter yang tidak diizinkan untuk digunakan. Pengguna Edge Public dan Private Cloud
Langkah-langkah diagnosis umum
Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:
Pemantauan API
Untuk mendiagnosis error menggunakan Pemantauan API:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralih ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Investigate.
- Pilih jangka waktu tertentu saat Anda mengamati error.
Petakan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.BadFormDataseperti yang ditunjukkan di bawah:(lihat gambar yang lebih besar)
Informasi tentang kode kesalahan
protocol.http.BadFormDataditampilkan seperti yang ditunjukkan di bawah:(lihat gambar yang lebih besar)
Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
- Dari jendela Logs, catat detail berikut:
- Kode Status:
500 - Sumber Kesalahan:
proxy - Kode Kesalahan:
protocol.http.BadFormData - Kebijakan Kesalahan:
extractvariables/EV-ExtractFormParams
- Kode Status:
- Jika Sumber Kesalahan adalah
proxy, Kode Kesalahan adalahprotocol.http.BadFormDatadan Kebijakan Kesalahan tidak kosong, maka hal ini menunjukkan bahwa error terjadi saat kebijakan tertentu yang ditunjukkan dalam Kebijakan Kesalahan sedang membaca atau mengekstrak data formulir (parameter formulir) yang memiliki karakter yang tidak diizinkan untuk digunakan. - Dalam contoh ini, X-Apigee-fault-policy adalah
extractvariables/EV- ExtractFormParams,, yang berarti kebijakan ExtractVariables bernama EV-ExtractFormParams gagal saat membaca atau mengekstrak parameter formulir.
Alat rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi rekaman aktivitas
dan salah satu opsi berikut:
- Tunggu hingga terjadi error
500 Internal Server Error, atau - Jika Anda dapat mereproduksi masalah, lakukan panggilan API untuk mereproduksi masalah
500 Internal Server Error
- Tunggu hingga terjadi error
Pastikan Show all FlowInfos diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Telusuri berbagai fase rekaman aktivitas dan temukan tempat terjadinya kegagalan.
Anda biasanya akan menemukan error di salah satu kebijakan seperti yang ditunjukkan di bawah:
Dalam rekaman aktivitas contoh di atas, perhatikan bahwa kegagalan terjadi di kebijakan ExtractVariables bernama
EV-ExtractFormParams.Buka alur bernama Error setelah kebijakan tertentu yang gagal:
- Perhatikan nilai berikut dari rekaman aktivitas:
error:
Bad Form Datastate:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- Nilai error
Bad Form Datamenunjukkan bahwa parameter formulir memiliki beberapa karakter yang tidak diizinkan untuk digunakan. - Nilai status
PROXY_REQ_FLOW,menunjukkan bahwa error terjadi di alur permintaan proxy API.
- Nilai error
- Buka Fase AX (Data Analytics Direkam) dalam rekaman aktivitas, lalu klik fase tersebut.
Scroll ke bawah ke bagian Phase Details - Error Headers dan tentukan nilai X-Apigee-fault-code, X-Apigee-fault-source, dan X-Apigee-fault-policy seperti yang ditunjukkan di bawah:
Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source adalah
protocol.http.BadFormDatadanpolicyserta X-Apigee-fault-policy tidak kosong. Hal ini menunjukkan bahwa error terjadi saat kebijakan tertentu yang ditunjukkan dalam X-Apigee-fault-policy sedang membaca atau mengekstrak data formulir (parameter formulir), yang memiliki karakter yang tidak diizinkan untuk digunakan.Header respons Nilai X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Dalam contoh ini, X-Apigee-fault-policy adalah
extractvariables/EV- ExtractFormParams,, yang berarti kebijakan ExtractVariables bernamaEV-ExtractFormParamsgagal saat membaca atau mengekstrak parameter formulir.
NGINX
Untuk mendiagnosis error menggunakan log akses NGINX:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk
menentukan informasi utama tentang HTTP
500 Internal Server Error. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Cari untuk melihat apakah ada error
500dengan kode errorprotocol.http.BadFormDataselama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan500. Jika Anda menemukan error
500dengan X-Apigee-fault-code yang cocok dengan nilaiprotocol.http.BadFormData, maka tentukan nilai X-Apigee-fault-source dan X-Apigee-fault-policy.Contoh error 500 dari log akses NGINX:
Entri contoh di atas dari log akses NGINX memiliki nilai berikut untuk X-Apigee-fault-code dan X-Apigee-fault-source:
Header Nilai X-Apigee-fault-code protocol.http.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- Perhatikan bahwa nilai X-Apigee-fault-code, X-Apigee-fault-source
adalah
protocol.http.BadFormData,policymasing-masing dan X-Apigee-fault-policy tidak kosong. Hal ini menunjukkan bahwa error terjadi saat kebijakan tertentu yang ditunjukkan dalam X-Apigee-fault-policy, sedang membaca atau mengekstrak data formulir (parameter formulir), yang memiliki karakter yang tidak diizinkan untuk digunakan. - Dalam contoh ini, X-Apigee-fault-policy adalah
extractvariables/EV- ExtractFormParams,, yang berarti bahwa kebijakan ExtractVariables bernamaEV-ExtractFormParamsgagal saat membaca parameter formulir.
Penyebab: Parameter formulir dalam permintaan memiliki karakter yang tidak diizinkan
Diagnosis
- Tentukan Kode Kesalahan, Sumber Kesalahan, dan Kebijakan Kesalahan untuk
500 Internal Server Errormenggunakan Pemantauan API, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum. - Jika Fault Code adalah
protocol.http.BadFormData, Fault Source memiliki nilaiproxyataupolicy, dan Fault Policy tidak kosong, maka hal ini menunjukkan bahwa kebijakan yang ditentukan dalam Fault Policy gagal saat membaca atau mengekstrak data formulir (parameter formulir). - Periksa kebijakan yang ditunjukkan dalam Kebijakan Kesalahan dan tentukan informasi berikut:
- Sumber: Tentukan apakah kebijakan membaca atau mengekstrak data dari permintaan atau respons.
- Parameter formulir: Tentukan parameter formulir tertentu yang dibaca dalam
kebijakan.
Contoh #1
Contoh #1: Kebijakan ExtractVariables yang mengekstrak parameter formulir:
<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>Dalam kebijakan ExtractVariables di atas:
Sumber:
requestHal ini ditunjukkan oleh elemen
<Source>Parameter formulir:
usernamedanpasswordHal ini ditunjukkan oleh elemen
<Pattern>dalam elemen<FormParam>
Hal ini menunjukkan bahwa parameter formulir
usernamedan/ataupasswordyang diteruskan sebagai bagian dari permintaan HTTP oleh klien ke Apigee Edge berisi karakter yang tidak boleh digunakan.Contoh #2
Contoh #2: Kebijakan AssignMessage yang menyalin parameter formulir:
<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>
Dalam kebijakan ExtractVariables di atas:
Sumber:
requestHal ini ditunjukkan oleh atribut
sourcedalam elemen<Copy>Parameter formulir:
usernamedanpasswordHal ini ditunjukkan oleh atribut
namedi elemen<FormParam>
Hal ini menunjukkan bahwa parameter formulir
usernameataupasswordatau keduanya diteruskan sebagai bagian dari permintaan HTTP oleh klien ke Apigee Edge berisi karakter yang tidak diizinkan untuk digunakan.
Periksa apakah ada karakter yang tidak diizinkan untuk digunakan dalam parameter formulir yang diidentifikasi di langkah 3 menggunakan salah satu metode berikut:
Alat rekaman aktivitas
Untuk memvalidasi menggunakan alat Trace:
- Jika Anda telah merekam aktivitas untuk permintaan yang gagal seperti yang dijelaskan dalam Langkah-langkah diagnosis umum, pilih salah satu permintaan yang gagal.
- Jika Anda telah menentukan bahwa parameter formulir yang berisi karakter yang tidak diizinkan untuk digunakan adalah bagian dari permintaan HTTP di langkah 3 di atas, maka
- Buka fase Permintaan Diterima dari Klien.
Scroll ke bawah ke bagian Detail Fase dan tinjau Minta Konten.
( lihat gambar yang lebih besar)
- Pada contoh di atas, perhatikan bahwa parameter formulir
passwordberisi tanda persen (%). - Karena tanda persen (
%) juga digunakan untuk encoding persen karakter khusus, tanda ini tidak dapat digunakan apa adanya dalam data formulir. - Oleh karena itu, Apigee Edge merespons dengan
500 Internal Server Errordengan kode errorprotocol.http.BadFormData.
Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan sebenarnya:
- Jika Anda tidak memiliki akses ke permintaan sebenarnya yang dibuat ke server target, buka Penyelesaian.
- Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke Apigee Edge, lakukan
langkah-langkah berikut:
- Tinjau konten data formulir dan lihat apakah data tersebut berisi karakter yang tidak diizinkan untuk digunakan seperti tanda persen (
%) atau tanda persen (%) yang diikuti dengan karakter heksadesimal yang tidak valid.Contoh #1
Contoh Permintaan #1: Data formulir sebagai bagian dari permintaan
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
Dalam contoh ini, perhatikan bahwa elemen
client_secretberisi tanda persen (%) yang diikuti dengan karakter heksadesimal tidak validZY.Contoh #2
Contoh Permintaan #2: Data formulir diteruskan dalam file:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Isi form_data.xml:
xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
Dalam contoh ini, perhatikan bahwa elemen
passwordberisi tanda persen (%), yang tidak boleh diteruskan apa adanya dalam data formulir.
- Tinjau konten data formulir dan lihat apakah data tersebut berisi karakter yang tidak diizinkan untuk digunakan seperti tanda persen (
- Dalam dua contoh di atas, data formulir yang dikirim sebagai bagian dari permintaan HTTP ke Apigee Edge berisi karakter yang tidak diizinkan untuk digunakan.
- Oleh karena itu, Apigee Edge merespons dengan
500 Internal Server Errordengan kode errorprotocol.http.BadFormData.
Resolusi
- Pastikan bahwa karakter khusus dalam kunci dan nilai data atau parameter formulir yang dikirim sebagai bagian dari permintaan HTTP oleh klien selalu dienkode seperti yang dijelaskan dalam Data Formulir - application/x-www-form-urlencoded.
- Untuk contoh yang dibahas di atas, Anda dapat memperbaiki masalahnya sebagai berikut:
Contoh #1
Contoh 1: Data formulir diteruskan sebagai bagian dari permintaan:
Gunakan karakter heksadesimal yang valid dan cocok dengan kode ASCII untuk karakter tertentu. Misalnya, jika Anda ingin mengirim tanda dolar (
$), gunakan%24seperti yang ditunjukkan di bawah:curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
Contoh #2
Contoh Permintaan #2: Data formulir diteruskan dalam file:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
Isi form_data.xml:
Gunakan percent-encoding untuk tanda persen (
%), yaitu ubah file agar memiliki%25seperti yang ditunjukkan di bawah:xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
Spesifikasi
Apigee Edge mengharapkan data formulir dikirim sesuai dengan spesifikasi berikut:
| Spesifikasi |
|---|
| Data Formulir - application/x-www-form-urlencoded |
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Mengumpulkan informasi diagnostik yang diperlukan.
Harus mengumpulkan informasi diagnostik
Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee Edge:
Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:
- Nama organisasi
- Nama lingkungan
- Nama proxy API
- Perintah
curllengkap yang digunakan untuk mereproduksi500 Internal Server Errordengan kode errorprotocol.http.BadFormData - File rekaman aktivitas untuk permintaan API
Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:
- Pesan error lengkap yang diamati untuk permintaan yang gagal
- Nama lingkungan
- Paket proxy API
- File rekaman aktivitas untuk permintaan API
Log akses NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logTempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
Log sistem Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log