Anda sedang melihat dokumentasi Apigee dan Apigee hybrid.
Lihat
Dokumentasi Apigee Edge.
Header HTTP adalah pasangan nilai nama yang memungkinkan aplikasi klien dan layanan backend untuk meneruskan informasi tambahan tentang permintaan dan respons. Beberapa contoh sederhananya adalah:
- Header permintaan otorisasi meneruskan kredensial pengguna ke server:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- Header
Content-Type
menunjukkan jenis konten permintaan/respons yang dikirim:Content-Type: application/json
Header HTTP dapat memiliki satu atau beberapa nilai bergantung pada definisi kolom header. {i>Header<i} multi-nilai akan memiliki nilai yang dipisahkan koma. Berikut adalah beberapa contoh header yang berisi beberapa nilai:
Cache-Control: no-cache, no-store, must-revalidate
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
X-Forwarded-For: 10.125.5.30, 10.125.9.125
Apigee memungkinkan developer mengakses header dengan mudah menggunakan variabel flow dalam setiap kebijakan atau alur kondisional. Berikut adalah daftar variabel yang dapat digunakan mengakses header permintaan atau respons tertentu di Apigee:
Variabel alur:
message.header.header-name
request.header.header-name
response.header.header-name
message.header.header-name.N
request.header.header-name.N
response.header.header-name.N
Objek JavaScript:
context.proxyRequest.headers.header-name
context.targetRequest.headers.header-name
context.proxyResponse.headers.header-name
context.targetResponse.headers.header-name
Berikut adalah contoh kebijakan MenetapkanMessage yang menunjukkan cara membaca nilai header permintaan dan penyimpanan menjadi variabel:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Anti-pola
Mengakses nilai header HTTP di kebijakan Apigee dengan cara yang hanya menampilkan nilai pertama salah dan dapat menyebabkan masalah jika header HTTP tertentu memiliki lebih dari satu nilai.
Bagian berikut berisi contoh akses {i>header<i}.
Contoh 1: Membaca header Accept multi-nilai menggunakan kode JavaScript
Perhatikan bahwa header Accept
memiliki beberapa nilai seperti yang ditunjukkan di bawah ini:
Accept: text/html, application/xhtml+xml, application/xml
Berikut adalah kode JavaScript yang membaca nilai dari header Accept
:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
Kode JavaScript di atas hanya menampilkan nilai pertama dari header Accept
,
seperti text/html
.
Contoh 2: Membaca header Access-Control-Allow-Headers multi-nilai dalam kebijakan PrepareMessage atau RaiseFault
Perhatikan bahwa header Access-Control-Allow-Headers
memiliki beberapa nilai seperti yang ditunjukkan di bawah ini:
Access-Control-Allow-Headers: content-type, authorization
Berikut adalah bagian kode dari kebijakan MenetapkanMessage atau RaiseFault yang menyetel header Access-Control-Allow-Headers
:
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header> </Headers> </Set>
Kode di atas menetapkan Access-Control-Allow-Headers
Header hanya dengan nilai pertama dari
header permintaan Access-Control-Allow-Headers
, dalam contoh ini content-type
.
Dampak
- Pada kedua contoh di atas, perhatikan bahwa hanya nilai pertama dari header multinilai yang ditampilkan. Jika nilai ini selanjutnya digunakan oleh kebijakan lain dalam alur Proxy API atau oleh layanan backend menjalankan fungsi atau logika tertentu, maka hal itu dapat mengarah pada suatu hasil atau hasil yang tidak diharapkan.
- Saat nilai header permintaan diakses dan diteruskan ke server target, permintaan API dapat tidak diproses oleh backend dengan benar dan karenanya mungkin memberikan hasil yang salah.
- Jika aplikasi klien bergantung pada nilai header tertentu dari respons Apigee, aplikasi tersebut juga dapat memproses dengan tidak benar dan memberikan hasil yang salah.
Praktik Terbaik
Mereferensikan
request.header.header_name.values.string
bentuk variabel {i>flow<i} untuk membaca semua nilai {i>header<i} tertentu.Contoh: Contoh fragmen yang dapat digunakan di RaiseFault atau MenetapkanMessage untuk membaca header multi-nilai
<Set> <Headers> <Header name="Inbound-Headers">{request.header.Accept.values.string}</Header> </Headers> </Set>
Jika Anda ingin akses individual ke setiap nilai yang berbeda, Anda dapat menggunakan atribut variabel flow bawaan:
request.header.header_name.values.count
,request.header.header_name.N
,response.header.header_name.values.count
,response.header.header_name.N
.Kemudian, lakukan iterasi untuk mengambil semua nilai dari header tertentu dalam kebijakan pemanggilan JavaScript atau Java.
Contoh: Contoh kode JavaScript untuk membaca header multi-nilai
for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
Misalnya,
application/xml;q=0.9, */*;q=0.8
akan muncul sebagai dua nilai dengan kode di atas. Nilai pertama adalahapplication/xml;q=0.9
, dan yang kedua adalah*/*;q=0.8
.Jika nilai header perlu dipisahkan menggunakan titik koma sebagai pemisah, Anda dapat menggunakan
string.split(";")
dalam info JavaScript untuk memisahkan nilai yang berbeda.Sebagai alternatif, Anda dapat menggunakan fungsi
substring()
yang tersedia dalam template pesan pada variabel alurrequest.header.header_name.values
untuk membaca semua nilai dari {i>header<i} tertentu.Contoh: Gunakan
substring()
dalam template pesan untuk membaca header multi-nilai lengkap<Set> <Headers> <Header name="Inbound-Headers">{substring(request.header.Accept.values,1,-1)}</Header> </Headers> </Set>
Bacaan lebih lanjut
- Bagaimana cara menangani header multi-nilai dalam JavaScript?
- Komentar IETF RFC 7230 tentang penggunaan daftar yang dipisahkan koma untuk kolom header HTTP multi-nilai
- Variabel permintaan dan respons
- Referensi variabel flow