Anda 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. Beberapa contoh sederhananya adalah:
- Header permintaan otorisasi meneruskan kredensial pengguna ke server:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- Header
Content-Typemenunjukkan jenis konten permintaan/respons yang dikirim:Content-Type: application/json
Header HTTP dapat memiliki satu atau beberapa nilai, bergantung pada definisi kolom header. Header multinilai akan memiliki nilai yang dipisahkan koma. Berikut beberapa contoh header yang berisi beberapa nilai:
Cache-Control: no-cache, no-store, must-revalidateAccept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8X-Forwarded-For: 10.125.5.30, 10.125.9.125
Apigee Edge memungkinkan developer mengakses header dengan mudah menggunakan flow variable di salah satu kebijakan Edge atau aliran bersyarat. Berikut daftar variabel yang dapat digunakan untuk mengakses header permintaan atau header respons tertentu di Edge:
Flow variable:
message.header.header-namerequest.header.header-nameresponse.header.header-namemessage.header.header-name.Nrequest.header.header-name.Nresponse.header.header-name.N
Objek JavaScript:
context.proxyRequest.headers.header-namecontext.targetRequest.headers.header-namecontext.proxyResponse.headers.header-namecontext.targetResponse.headers.header-name
Berikut adalah contoh kebijakan AssignMessage 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 tidak benar dan dapat menyebabkan masalah jika Header HTTP tertentu memiliki lebih dari satu nilai.
Bagian berikut berisi contoh akses header.
Contoh 1: Membaca header Accept multinilai menggunakan kode JavaScript
Pertimbangkan bahwa header Accept memiliki beberapa nilai seperti yang ditunjukkan di bawah:
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 multinilai dalam kebijakan AssignMessage atau RaiseFault
Pertimbangkan bahwa header Access-Control-Allow-Headers memiliki beberapa nilai seperti yang ditunjukkan di bawah:
Access-Control-Allow-Headers: content-type, authorization
Berikut adalah bagian kode dari kebijakan AssignMessage atau RaiseFault yang menetapkan 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 hanya dengan 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 dalam aliran Proxy API atau oleh layanan backend untuk melakukan beberapa fungsi atau logika, hal ini dapat menyebabkan hasil yang tidak terduga.
- Saat nilai header permintaan diakses dan diteruskan ke server target, permintaan API dapat di proses oleh backend dengan tidak benar sehingga dapat memberikan hasil yang salah.
- Jika aplikasi klien bergantung pada nilai header tertentu dari respons Edge, aplikasi tersebut juga dapat diproses dengan tidak benar dan memberikan hasil yang salah.
Praktik Terbaik
Gunakan flow variable 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, lakukan iterasi untuk mengambil semua nilai dari header tertentu dalam kebijakan panggilan JavaScript atau Java.
Contoh: Contoh kode JavaScript untuk membaca header multinilai
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.8akan 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 flow variablerequest.header.header_name.valuesdalam kebijakan RaiseFault atau AssignMessage untuk membaca semua nilai header tertentu.Contoh: Contoh Kebijakan RaiseFault atau AssignMessage untuk membaca header multinilai
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>