Anda sedang melihat dokumentasi Apigee Edge.
Buka
dokumentasi Apigee X. info
Header HTTP adalah pasangan nilai nama yang memungkinkan aplikasi klien dan layanan backend meneruskan informasi tambahan tentang permintaan dan respons masing-masing. 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 {i>header<i} 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
Dengan Apigee Edge, developer dapat mengakses header dengan mudah menggunakan variabel flow dalam kebijakan Edge atau alur bersyarat. Berikut adalah daftar variabel yang dapat digunakan untuk mengakses header permintaan atau respons tertentu di Edge:
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 BiddingMessage yang menunjukkan cara membaca nilai header permintaan dan menyimpannya ke dalam variabel:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Antipola
Mengakses nilai header HTTP dalam kebijakan Edge dengan cara yang hanya menampilkan nilai pertama adalah salah dan dapat menyebabkan masalah jika Header HTTP tertentu memiliki lebih dari satu nilai.
Bagian berikut berisi contoh akses header.
Contoh 1: Membaca header Accept multi-nilai menggunakan kode JavaScript
Pertimbangkan 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 MenetapkanMessage atau RaiseFault
Pertimbangkan 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 dari kode dari setelan kebijakan BiddingMessage atau RaiseFault untuk 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 Header Access-Control-Allow-Headers
dengan hanya nilai pertama dari header permintaan Access-Control-Allow-Headers
, dalam contoh ini content-type
.
Dampak
- Dalam kedua contoh di atas, perhatikan bahwa hanya nilai pertama dari header multinilai yang ditampilkan. Jika nilai ini kemudian digunakan oleh kebijakan lain di alur Proxy API atau oleh layanan backend untuk menjalankan beberapa fungsi atau logika, hal tersebut dapat menyebabkan hasil atau hasil yang tidak diharapkan.
- Saat nilai header permintaan diakses dan diteruskan ke server target, permintaan API dapat salah diproses oleh backend sehingga dapat memberikan hasil yang salah.
- Jika aplikasi klien bergantung pada nilai header tertentu dari respons Edge, aplikasi tersebut mungkin juga tidak akan memproses dengan benar dan memberikan hasil yang salah.
Praktik Terbaik
Gunakan variabel flow bawaan yang sesuai:
request.header.header_name.values.count
,request.header.header_name.N
,response.header.header_name.values.count
,response.header.header_name.N
.Kemudian, iterasi untuk mengambil semua nilai dari header tertentu dalam kebijakan info 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 satu nilai dengan kode di atas.Jika nilai header perlu dipisahkan menggunakan titik koma sebagai pembatas, gunakan
string.split(";")
untuk memisahkannya menjadi nilai.Gunakan fungsi
substring()
pada variabel alurrequest.header.header_name.values
di kebijakan RaiseFault atau TetapkanMessage untuk membaca semua nilai dari header tertentu.Contoh: Sample RaiseFault atauAssignMessage Policy untuk membaca header multi-nilai
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>