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 masuk ke detail pemecahan masalah ini, mari kita pahami apa itu data formulir.
Data formulir adalah informasi yang disediakan 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.
Membentuk transmisi data
- Content-Type: application/x-www-form-urlencrypted
- Jika ukuran data formulir kecil, data akan dikirim sebagai pasangan nilai kunci dengan:
- Karakter pada kedua kunci yang dikodekan sesuai dengan 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"
- Karakter non-alfanumerik apa pun di kunci dan nilai
persen dienkodekan, artinya, diwakili sebagai triplet karakter
%HH
, yang terdiri dari tanda persen diikuti dengan dua digit heksadesimal yang mewakili kode ASCII dari karakter tertentu. - Jadi, meskipun tanda persen (
%
) diizinkan dalam data formulir, ditafsirkan sebagai awal dari urutan escape khusus. Oleh karena itu, jika data formulir perlu berisi tanda persen (%
) dalam kunci atau nilai, maka harus dikirimkan sebagai%25,
yang mewakili kode ASCII untuk tanda persen (%
) karakter.
- Jika ukuran data formulir kecil, data akan dikirim sebagai pasangan nilai kunci dengan:
- Jenis-Konten: multibagian/formulir-data
Jika Anda ingin mentransmisikan data biner dalam jumlah besar atau teks yang berisi data non-ASCII karakter, maka Anda dapat mengirim data dengan
Content-Type:
multibagian/formulir-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- Formulir data dengan tanda persen (
%
), atau tanda persen (%
) diikuti dengan karakter heksadesimal tidak valid yang tidak diizinkan sesuai 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 ExtractVariables atau Kebijakan TetapkanMessage.
Misalnya, jika data formulir berisi tanda persen (
%
) apa adanya (tanpa encoding) atau tanda persen (%
) yang diikuti dengan heksadesimal yang tidak valid karakter di kunci dan/atau nilai, maka Anda akan mendapatkan pesan {i>error<i} ini.Berikut adalah kemungkinan penyebab error ini:
Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk Parameter Formulir yang diminta berisi karakter yang tidak diizinkan Parameter formulir yang diteruskan sebagai bagian 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.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah tersebut.
- Buka Analyze > Pemantauan API > Investigasi.
- Pilih jangka waktu tertentu saat Anda melihat error.
Gambarkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.BadFormData
sebagai yang ditampilkan di bawah ini:Informasi tentang kode kesalahan
protocol.http.BadFormData
adalah ditampilkan seperti yang ditunjukkan di bawah ini:Klik View logs, lalu luaskan baris untuk permintaan yang gagal.
- Dari jendela Logs, perhatikan 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.BadFormData
dan Fault Policy tidak kosong, maka menunjukkan bahwa error terjadi saat kebijakan tertentu yang diindikasikan dalam Fault Policy adalah 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 formulir parameter.
Alat rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Mengaktifkan sesi rekaman aktivitas
dan:
- Tunggu hingga error
500 Internal Server Error
terjadi, atau - Jika Anda dapat mereproduksi masalah, lakukan panggilan API untuk mereproduksi masalah
500 Internal Server Error
- Tunggu hingga error
Pastikan Tampilkan semua FlowInfos diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitasnya.
- Menavigasi melalui berbagai fase pelacakan dan menemukan letak kegagalan terjadi.
Anda akan menemukan error ini biasanya di salah satu kebijakan seperti yang ditunjukkan di bawah:
Dalam pelacakan 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 Data
negara bagian:
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- Nilai error
Bad Form Data
menunjukkan bahwa formulir parameter 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 Direkam) di rekaman aktivitas, lalu klik anotasi.
Scroll ke bawah ke bagian Detail Fase - Header Error dan tentukan nilai X-Apigee-fault-code, X-Apigee-fault-source, dan X-Apigee-fault-policy seperti yang ditunjukkan di bawah ini:
Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source masing-masing bernilai
protocol.http.BadFormData
danpolicy
dan X-Apigee-fault-policy tidak kosong. Hal ini menunjukkan bahwa error terjadi saat kebijakan spesifik yang ditunjukkan dalam X-Apigee-fault-policy membaca atau mengekstrak data formulir (parameter formulir), yang memiliki karakter tidak diizinkan 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 bernamaEV-ExtractFormParams
gagal saat membaca atau mengekstrak formulir parameter.
NGINX
Untuk mendiagnosis error menggunakan log akses NGINX:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk
menentukan informasi penting tentang HTTP
500 Internal Server Error
. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Telusuri apakah ada
500
error dengan kode errorprotocol.http.BadFormData
selama durasi tertentu (jika masalahnya terjadi di masa lalu) atau jika ada permintaan yang masih gagal dengan500
. Jika Anda menemukan error
500
dengan X-Apigee-fault-code cocok dengan nilaiprotocol.http.BadFormData
, lalu 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
- Perhatikan bahwa nilai X-Apigee-fault-code dan X-Apigee-fault-source
masing-masing adalah
protocol.http.BadFormData
,policy
dan X-Apigee-fault-policy tidak kosong. Hal ini menunjukkan bahwa error terjadi saat kebijakan spesifik yang ditunjukkan dalam X-Apigee-fault-policy, membaca atau mengekstrak data formulir (parameter formulir), yang memiliki karakter tidak diizinkan digunakan. - Dalam contoh ini, X-Apigee-fault-policy adalah
extractvariables/EV- ExtractFormParams,
, yang berarti kebijakan ExtractVariables bernamaEV-ExtractFormParams
gagal saat membaca formulir parameter.
Penyebab: Parameter formulir yang diminta memiliki karakter yang tidak diizinkan
Diagnosis
- Tentukan Kode Kesalahan, Sumber Kesalahan, dan Kebijakan Kesalahan untuk
500 Internal Server Error
menggunakan Pemantauan API, alat Trace, atau log akses NGINX seperti yang dijelaskan di Langkah-langkah diagnosis umum. - Jika Kode Kesalahan adalah
protocol.http.BadFormData
, Sumber Kesalahan memiliki nilaiproxy
ataupolicy
, dan Kebijakan Kesalahan bukan kosong, berarti kebijakan yang ditentukan dalam Kebijakan Kesalahan gagal saat membaca atau mengekstrak data formulir (parameter formulir). - Periksa kebijakan yang ditunjukkan dalam Kebijakan Kesalahan dan tentukan
informasi:
- Sumber: Tentukan apakah kebijakan membaca atau mengekstrak data dari permintaan atau respons.
- Parameter formulir: Menentukan parameter formulir tertentu yang sedang dibaca dalam
lebih lanjut.
Contoh #1
Contoh #1: Parameter formulir ekstraksi kebijakan ExtractVariables:
<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:
request
Hal ini ditunjukkan oleh elemen
<Source>
Parameter formulir:
username
danpassword
Hal ini ditunjukkan oleh elemen
<Pattern>
dalam Elemen<FormParam>
Ini menunjukkan bahwa parameter formulir
username
dan/ataupassword
diteruskan sebagai bagian dari permintaan HTTP oleh klien ke Apigee Edge berisi karakter yang tidak diizinkan untuk digunakan.Contoh #2
Contoh #2: Parameter formulir penyalinan kebijakan TetapkanMessage:
<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:
request
Hal ini ditunjukkan dengan atribut
source
di Elemen<Copy>
Parameter formulir:
username
danpassword
Hal ini ditunjukkan dengan atribut
name
di Elemen<FormParam>
Ini menunjukkan bahwa parameter formulir
username
ataupassword
atau keduanya diteruskan sebagai bagian dari permintaan HTTP oleh klien ke Apigee Edge berisi karakter yang tidak diizinkan untuk digunakan.
Periksa untuk melihat apakah ada karakter yang tidak diizinkan untuk digunakan menggunakan karakter dalam parameter formulir yang diidentifikasi pada langkah 3 menggunakan salah satu metode berikut:
Alat rekaman aktivitas
Untuk memvalidasi menggunakan alat Trace:
- Jika Anda telah merekam pelacakan permintaan yang gagal seperti yang dijelaskan dalam Langkah-langkah diagnosis umum, lalu pilih salah satu permintaan yang gagal.
- Jika Anda telah menentukan bahwa parameter formulir yang berisi karakter apa pun
yang tidak diizinkan untuk digunakan adalah bagian dari permintaan HTTP di
langkah 3 di atas, lalu
- Buka fase Permintaan Diterima dari Klien.
Scroll ke bawah ke bagian Detail Fase dan tinjau Minta Konten.
- Pada contoh di atas, perhatikan bahwa parameter formulir
password
berisi tanda persen (%
). - Karena tanda persen (
%
) juga digunakan untuk encoding persen karakter khusus, karakter khusus ini tidak dapat digunakan apa adanya 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 sebenarnya yang dibuat ke server target, lalu 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 oleh tanda tidak valid karakter heksadesimal.Contoh #1
Contoh Permintaan #1: Formulir data 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 oleh 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
Konten 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 seharusnya tidak yang 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 ada karakter khusus pada kunci dan nilai data formulir atau parameter dikirim sebagai bagian dari permintaan HTTP oleh klien selalu dikodekan 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 yang valid karakter heksadesimal yang cocok dengan kode ASCII untuk karakter tertentu. Misalnya, jika Anda ingin mengirim tanda dolar (
$
), gunakan%24
sebagaimana 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
Konten form_data.xml:
Gunakan encoding persen untuk tanda persen (
%
), yaitu mengubah file menjadi%25
seperti yang ditunjukkan di bawah ini: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-urlencoding |
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan diagnostik.
Harus mengumpulkan informasi diagnostik
Jika masalah berlanjut bahkan setelah mengikuti instruksi di atas, kumpulkan informasi diagnostik, lalu hubungi Dukungan Apigee Edge:
Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:
- Nama organisasi
- Nama lingkungan
- Nama proxy API
- Menyelesaikan 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
Di mana: ORG, ENV, dan PORT# diganti dengan nilai aktual.
Log sistem Pemroses Pesan
/opt/apigee/var/log/edge-message-processor/logs/system.log