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 kita pahami apa yang dimaksud dengan data formulir.
Data formulir adalah informasi yang biasanya diberikan oleh pengguna melalui formulir HTML yang memiliki elemen seperti kotak input teks, tombol, atau kotak centang. Data formulir umumnya dikirim sebagai serangkaian key-value pair sebagai bagian dari permintaan atau respons HTTP.
Membentuk transmisi data
- Jenis Konten: application/x-www-form-url mirip
- Jika ukuran data formulir kecil, data akan dikirim sebagai key-value pair dengan:
- Karakter pada kedua kunci dienkode sesuai aturan yang dijelaskan dalam Formulir - 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"
- Semua karakter non-alfanumerik, baik dalam kunci maupun nilai, akan
dienkode persen, artinya, karakter tersebut diwakili sebagai
%HH
triplet karakter, yang terdiri dari tanda persen diikuti dua digit heksadesimal yang merepresentasikan kode ASCII dari karakter tertentu. - Jadi, meskipun tanda persen (
%
) diizinkan dalam data formulir, tanda tersebut ditafsirkan sebagai awal dari urutan escape khusus. Oleh karena itu, jika data formulir harus berisi tanda persen (%
) pada kunci atau nilai, kunci atau nilai tersebut harus ditransmisikan sebagai%25,
yang mewakili kode ASCII untuk karakter tanda persen (%
).
- Jika ukuran data formulir kecil, data akan dikirim sebagai key-value pair dengan:
- Jenis Konten: multibagian/formulir-data
Jika ingin mengirimkan data biner atau teks dalam jumlah besar yang berisi karakter non-ASCII, Anda dapat mengirim data tersebut dengan
Content-Type:
multipart/form-data seperti yang dijelaskan dalam Formulir - Bagian 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 - Pasal 17.13.4.1.
Proxy API di Apigee Edge membaca parameter bentuk tertentu yang berisi karakter apa pun yang tidak diizinkan untuk digunakan dalam alur permintaan menggunakan ExtractVariables atau kebijakan TetapkanMessage.
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, maka Anda akan mendapatkan error ini.Berikut kemungkinan penyebab error ini:
Penyebab Deskripsi Petunjuk pemecahan masalah yang berlaku untuk Parameter Formulir dalam permintaan memiliki karakter yang tidak diizinkan Parameter formulir yang diteruskan sebagai bagian dari permintaan HTTP oleh klien berisi karakter yang tidak diizinkan untuk digunakan. Pengguna Edge Publik dan Private Cloud
Langkah-langkah diagnosis umum
Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:
Pemantauan API
Untuk mendiagnosis error menggunakan API Monitoring:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Menyelidiki.
- Pilih jangka waktu spesifik saat Anda melihat error.
Tempatkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.BadFormData
seperti yang ditunjukkan di bawah ini:Informasi tentang kode kesalahan
protocol.http.BadFormData
ditampilkan seperti yang ditunjukkan di bawah ini:Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
- Dari jendela Logs, perhatikan detail berikut:
- Kode Status:
500
- Sumber Kesalahan:
proxy
- Kode Kesalahan:
protocol.http.BadFormData
- Kebijakan Kerusakan:
extractvariables/EV-ExtractFormParams
- Kode Status:
- Jika Sumber Kesalahan adalah
proxy
, Kode Kesalahan adalahprotocol.http.BadFormData
, dan Kebijakan Kesalahan tidak kosong, maka hal ini menunjukkan bahwa error terjadi saat kebijakan khusus yang ditunjukkan dalam Kebijakan Kesalahan membaca atau mengekstrak data formulir (parameter formulir) yang memiliki karakter apa pun yang tidak diizinkan untuk digunakan. - Dalam contoh ini, X-Apigee-fault-policy adalah
extractvariables/EV- ExtractFormParams,
yang berarti bahwa kebijakan ExtractVariables yang bernama EV-ExtractFormParams gagal saat membaca atau mengekstrak parameter formulir.
Alat pelacak
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi perekaman aktivitas
dan:
- Tunggu hingga error
500 Internal Server Error
terjadi, atau - Jika Anda dapat merekonstruksi masalah, buat panggilan API untuk mereproduksi masalah
500 Internal Server Error
- Tunggu hingga error
Pastikan Show all FlowInfos diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
Anda akan menemukan error tersebut biasanya dalam salah satu kebijakan seperti yang ditunjukkan di bawah ini:
Pada contoh rekaman aktivitas di atas, perhatikan bahwa kegagalan terjadi dalam kebijakan ExtractVariables yang bernama
EV-ExtractFormParams
.Buka alur bernama Error setelah kebijakan tertentu gagal:
- Perhatikan nilai berikut dari rekaman aktivitas:
error:
Bad Form Data
status:
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- Nilai error
Bad Form Data
menunjukkan bahwa parameter formulir memiliki beberapa karakter yang tidak diizinkan untuk digunakan. - Nilai status
PROXY_REQ_FLOW,
menunjukkan bahwa error terjadi dalam alur permintaan proxy API.
- Nilai error
- Buka Fase AX (Data Analytics Dicatat) di trace, lalu klik fase tersebut.
Scroll ke bawah ke bagian Phase Details - Error Headers, lalu tentukan nilai X-Apigee-fault-code, X-Apigee-fault-source, dan X-Apigee-fault-policy seperti yang ditunjukkan di bawah ini:
Perlu diketahui bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source adalah
protocol.http.BadFormData
danpolicy
, sedangkan X-Apigee-fault-policy tidak kosong. Hal ini menunjukkan bahwa error tersebut 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.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- Dalam contoh ini, X-Apigee-fault-policy adalah
extractvariables/EV- ExtractFormParams,
yang berarti kebijakan ExtractVariables yang bernamaEV-ExtractFormParams
gagal 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 kunci tentang HTTP
500 Internal Server Error
. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Telusuri untuk melihat apakah ada error
500
dengan kode errorprotocol.http.BadFormData
selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan500
. Jika Anda menemukan error
500
pada X-Apigee-fault-code yang cocok dengan nilaiprotocol.http.BadFormData
, tentukan nilai X-Apigee-fault-source dan X-Apigee-fault-policy.Contoh error 500 dari log akses NGINX:
Contoh entri 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.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- Perlu diketahui bahwa nilai X-Apigee-fault-code, X-Apigee-fault-source adalah
protocol.http.BadFormData
,policy
masing-masing, dan X-Apigee-fault-policy tidak kosong. Hal ini menunjukkan bahwa error tersebut 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 kebijakan ExtractVariables yang bernamaEV-ExtractFormParams
gagal 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 Error
menggunakan Pemantauan API, alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum. - Jika Fault Code adalah
protocol.http.BadFormData
, Fault Source memiliki nilaiproxy
ataupolicy
, dan Fault Policy tidak kosong, maka 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: Menentukan apakah kebijakan membaca atau mengekstrak data dari permintaan atau respons.
- Parameter formulir: Menentukan parameter formulir tertentu yang sedang dibaca dalam
kebijakan.
Contoh #1
Contoh #1: Kebijakan ExtractVariables 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>
Pada kebijakan ExtractVariables di atas:
Sumber:
request
Hal ini ditunjukkan oleh elemen
<Source>
Parameter formulir:
username
danpassword
Hal ini ditunjukkan oleh elemen
<Pattern>
dalam elemen<FormParam>
Hal ini menunjukkan bahwa parameter bentuk
username
dan/ataupassword
yang diteruskan sebagai bagian dari permintaan HTTP oleh klien ke Apigee Edge berisi karakter yang tidak diizinkan untuk digunakan.Contoh #2
Contoh #2: Kebijakan Tetapkan Pesan 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>
Pada kebijakan ExtractVariables di atas:
Sumber:
request
Hal ini ditunjukkan oleh atribut
source
dalam elemen<Copy>
Parameter formulir:
username
danpassword
Hal ini ditunjukkan oleh atribut
name
dalam elemen<FormParam>
Hal ini menunjukkan bahwa parameter bentuk
username
ataupassword
atau keduanya yang diteruskan sebagai bagian dari permintaan HTTP oleh klien ke Apigee Edge berisi karakter apa pun yang tidak diizinkan untuk digunakan.
Periksa apakah ada karakter yang tidak diizinkan untuk digunakan karakter dalam parameter bentuk yang diidentifikasi di langkah 3 menggunakan salah satu metode berikut:
Alat pelacak
Untuk melakukan validasi menggunakan alat Trace:
- Jika Anda telah merekam pelacakan 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 berisi karakter yang tidak diizinkan untuk digunakan adalah bagian dari permintaan HTTP pada langkah 3 di atas, maka
- Buka fase Request Received from Client.
Scroll ke bawah ke bagian Phase Details, lalu tinjau Request Content.
- Pada contoh di atas, perhatikan bahwa parameter formulir
password
berisi tanda persen (%
). - Karena tanda persen (
%
) juga digunakan untuk encoding persen karakter khusus, tanda tersebut tidak dapat digunakan apa adanya dalam data formulir. - Oleh karena itu, Apigee Edge merespons dengan
500 Internal Server Error
dengan kode errorprotocol.http.BadFormData
.
Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan yang sebenarnya:
- Jika Anda tidak memiliki akses ke permintaan aktual yang dibuat ke server target, buka Resolution.
- Jika Anda memiliki akses ke permintaan aktual yang dibuat ke Apigee Edge, lakukan langkah-langkah berikut:
- Tinjau konten data formulir dan lihat apakah berisi karakter yang tidak diizinkan untuk digunakan seperti tanda persen (
%
) atau tanda persen (%
) 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_secret
berisi tanda persen (%
) diikuti dengan karakter heksadesimal tidak validZY
.Contoh #2
Contoh Permintaan #2: Data formulir yang 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
password
berisi tanda persen (%
), yang tidak boleh diteruskan apa adanya dalam data formulir.
- Tinjau konten data formulir dan lihat apakah 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 Error
dengan kode errorprotocol.http.BadFormData
.
Resolusi
- Pastikan semua karakter khusus, baik dalam kunci maupun nilai data formulir atau parameter yang dikirim sebagai bagian dari permintaan HTTP oleh klien, selalu dienkode seperti yang dijelaskan dalam Data Formulir - application/x-www-form-urlcoded.
- Untuk contoh yang dibahas di atas, Anda dapat memperbaiki masalah sebagai berikut:
Contoh #1
Contoh #1: Data formulir yang diteruskan sebagai bagian dari permintaan:
Gunakan karakter heksadesimal valid yang cocok dengan kode ASCII untuk karakter tertentu. Misalnya, jika Anda ingin mengirim tanda dolar (
$
), gunakan%24
seperti yang ditunjukkan di bawah ini: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 yang 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 persen-encoding untuk tanda persen (
%
), yang mengubah file agar%25
seperti yang ditunjukkan di bawah:xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
Spesifikasi
Apigee Edge mengharuskan data formulir dikirim sesuai dengan spesifikasi berikut:
Spesifikasi |
---|
Data Formulir - application/x-www-form-url encoding |
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.
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
- Selesaikan perintah
curl
yang digunakan untuk mereproduksi500 Internal Server Error
dengan 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_log
Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
Log sistem Pemroses Pesan
/opt/apigee/var/log/edge-message-processor/logs/system.log