Anda sedang melihat dokumentasi Apigee dan Apigee hybrid.
Lihat
Dokumentasi Apigee Edge.
Kebijakan JavaScript memungkinkan Anda menambahkan kode khusus yang dieksekusi dalam konteks alur proxy API. Misalnya, kode kustom dalam kebijakan JavaScript dapat digunakan untuk:
- Mendapatkan dan menetapkan variabel alur
- Menjalankan logika kustom dan melakukan penanganan kesalahan
- Mengekstrak data dari permintaan atau respons
- Mengedit URL target backend secara dinamis
- Menambahkan atau menghapus header dari permintaan atau respons secara dinamis
- Mengurai respons JSON
Klien HTTP
Fitur canggih dari kebijakan JavaScript adalah
Klien HTTP.
Klien HTTP (atau objek httpClient
) dapat digunakan untuk melakukan satu atau beberapa panggilan
ke layanan backend atau eksternal. Klien HTTP sangat berguna
ketika ada kebutuhan
melakukan panggilan ke beberapa layanan eksternal dan menggabungkan respons dalam satu API.
Contoh Kode JavaScript yang melakukan panggilan ke backend dengan objek httpClient
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest);
Objek httpClient
mengekspos dua metode get
dan send
(send
digunakan dalam kode contoh di atas) untuk membuat permintaan HTTP. Kedua metode tersebut adalah
asinkron dan menampilkan objek exchange
sebelum permintaan HTTP yang sebenarnya diselesaikan.
Permintaan HTTP mungkin perlu waktu beberapa detik hingga beberapa menit. Setelah permintaan HTTP dibuat,
penting untuk mengetahui kapan penyelesaiannya, sehingga respons dari permintaan dapat diproses.
Salah satu cara paling umum untuk menentukan kapan permintaan HTTP selesai adalah dengan memanggil metode
metode waitForComplete()
objek exchange
.
waitForComplete()
Metode waitForComplete()
menjeda thread hingga permintaan HTTP selesai dan
respons (berhasil/gagal) ditampilkan. Kemudian, respons dari backend atau layanan eksternal
dapat diproses.
Contoh kode JavaScript dengan waitForComplete()
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest); // Wait for the asynchronous GET request to finish exchange.waitForComplete(); // Get and Process the response if (exchange.isSuccess()) { var responseObj = exchange.getResponse().content.asJSON; return responseObj.access_token; } else if (exchange.isError()) { throw new Error(exchange.getError()); }
Anti-pola
Menggunakan waitForComplete()
setelah mengirim permintaan HTTP dalam kode JavaScript akan
memiliki implikasi performa.
Pertimbangkan kode JavaScript berikut yang memanggil waitForComplete()
setelah mengirim
atau permintaan HTTP.
Kode untuk sample.js
// Send the HTTP request var exchangeObj = httpClient.get("http://example.com"); // Wait until the request is completed exchangeObj.waitForComplete(); // Check if the request was successful if (exchangeObj.isSuccess()) { response = exchangeObj.getResponse(); context.setVariable('example.status', response.status); } else { error = exchangeObj.getError(); context.setVariable('example.error', 'Woops: ' + error); }
Dalam contoh ini:
- Kode JavaScript mengirim permintaan HTTP ke API backend.
- Kemudian, aplikasi akan memanggil
waitForComplete()
untuk menjeda eksekusi hingga permintaan selesai.waitForComplete()
API menyebabkan thread yang mengeksekusi kode JavaScript diblokir hingga backend selesai memproses permintaan dan merespons kembali.
Ada batas atas jumlah thread (30%) yang dapat mengeksekusi JavaScript secara serentak
kode pada Pemroses Pesan kapan saja. Setelah batas tersebut tercapai, tidak akan ada
yang tersedia untuk mengeksekusi kode JavaScript. Jadi, jika ada terlalu banyak permintaan serentak
mengeksekusi waitForComplete()
API dalam kode JavaScript, lalu permintaan berikutnya
akan gagal dengan pesan error 500 Internal Server Error
dan Timed out
bahkan sebelum
Waktu kebijakan JavaScript habis.
Secara umum, skenario ini dapat terjadi jika backend membutuhkan waktu lama untuk memproses permintaan atau ada adalah traffic yang tinggi.
Dampak
- Permintaan API akan gagal dengan
500 Internal Server Error
dan disertai pesan errorTimed out
jika jumlah permintaan serentak yang mengeksekusiwaitForComplete()
dalam kode JavaScript melebihi batas yang telah ditentukan. - Mendiagnosis penyebab masalah bisa jadi rumit karena JavaScript gagal dengan
Timed out
meskipun batas waktu untuk kebijakan JavaScript tertentu belum berlalu.
Praktik Terbaik
Gunakan callback di klien HTTP untuk menyederhanakan kode info dan meningkatkan performa serta
hindari penggunaan waitForComplete()
dalam kode JavaScript. Metode ini memastikan bahwa
thread yang mengeksekusi JavaScript tidak diblokir hingga permintaan HTTP selesai.
Saat callback digunakan, thread akan mengirimkan permintaan HTTP dalam kode JavaScript dan menampilkan kembali ke kolam. Karena tidak lagi diblokir, thread tersedia untuk menangani permintaan lain. Setelah permintaan HTTP selesai dan callback siap untuk dieksekusi, tugas akan dibuat dan ditambahkan ke task queue. Salah satu thread dari kumpulan akan menjalankan callback berdasarkan prioritas tugas.
Contoh kode JavaScript menggunakan Callback di httpClient
function onComplete(response,error) { // Check if the HTTP request was successful if (response) { context.setVariable('example.status', response.status); } else { context.setVariable('example.error', 'Woops: ' + error); } } // Specify the callback Function as an argument httpClient.get("http://example.com", onComplete);