Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Lihat dokumentasi
Apigee Edge.
Kebijakan JavaScript memungkinkan Anda menambahkan kode kustom yang dijalankan dalam konteks alur proxy API. Misalnya, kode kustom dalam kebijakan JavaScript dapat digunakan untuk:
- Mendapatkan dan menyetel 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 secara dinamis dari permintaan atau respons
- 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 saat ada kebutuhan untuk 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 contoh kode di atas) untuk membuat permintaan HTTP. Kedua metode ini bersifat asinkron dan menampilkan objek exchange sebelum permintaan HTTP yang sebenarnya selesai.
Permintaan HTTP mungkin memerlukan waktu beberapa detik hingga beberapa menit. Setelah permintaan HTTP dibuat, penting untuk mengetahui kapan permintaan tersebut selesai, sehingga respons dari permintaan dapat diproses.
Salah satu cara paling umum untuk menentukan kapan permintaan HTTP selesai adalah dengan memanggil
metode waitForComplete() objek exchange.
waitForComplete()
Metode waitForComplete() akan 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());
}
Antipola
Menggunakan waitForComplete() setelah mengirim permintaan HTTP dalam kode JavaScript akan
berdampak pada performa.
Pertimbangkan kode JavaScript berikut yang memanggil waitForComplete() setelah mengirim
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 mengirimkan permintaan HTTP ke API backend.
- Kemudian, fungsi ini memanggil
waitForComplete()untuk menjeda eksekusi hingga permintaan selesai.waitForComplete()API menyebabkan thread yang menjalankan kode JavaScript diblokir hingga backend selesai memproses permintaan dan merespons kembali.
Ada batas atas pada jumlah thread (30%) yang dapat menjalankan kode JavaScript secara serentak di Pemroses Pesan kapan saja. Setelah batas tersebut tercapai, tidak akan ada
thread yang tersedia untuk menjalankan kode JavaScript. Jadi, jika ada terlalu banyak permintaan serentak yang menjalankan API waitForComplete() dalam kode JavaScript, permintaan berikutnya akan gagal dengan pesan error 500 Internal Server Error dan Timed out bahkan sebelum kebijakan JavaScript kehabisan waktu.
Secara umum, skenario ini dapat terjadi jika backend membutuhkan waktu lama untuk memproses permintaan atau ada traffic tinggi.
Dampak
- Permintaan API akan gagal dengan
500 Internal Server Errordan dengan pesan errorTimed outjika jumlah permintaan serentak yang menjalankanwaitForComplete()dalam kode JavaScript melebihi batas yang telah ditentukan sebelumnya. - Mendiagnosis penyebab masalah ini bisa jadi sulit karena JavaScript gagal dengan error
Timed outmeskipun batas waktu untuk kebijakan JavaScript tertentu belum berlalu.
Praktik Terbaik
Gunakan callback di klien HTTP untuk menyederhanakan kode panggilan dan meningkatkan performa, serta hindari penggunaan waitForComplete() dalam kode JavaScript. Metode ini memastikan bahwa
thread yang menjalankan JavaScript tidak diblokir hingga permintaan HTTP selesai.
Saat callback digunakan, thread akan mengirim permintaan HTTP dalam kode JavaScript dan kembali ke pool. Karena tidak lagi diblokir, thread tersedia untuk menangani permintaan lain. Setelah permintaan HTTP selesai dan callback siap dieksekusi, tugas akan dibuat dan ditambahkan ke antrean tugas. Salah satu thread dari kumpulan akan mengeksekusi 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);