Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến
Tài liệu về Apigee X. thông tin
Chính sách về JavaScript trong Apigee Edge cho phép bạn thêm mã tuỳ chỉnh có thể thực thi trong bối cảnh luồng proxy API. Ví dụ: mã tuỳ chỉnh trong chính sách JavaScript có thể được dùng để:
- Nhận và thiết lập biến luồng
- Thực thi logic tuỳ chỉnh và xử lý lỗi
- Trích xuất dữ liệu từ các yêu cầu hoặc phản hồi
- Chỉnh sửa URL đích phụ trợ một cách linh động
- Tự động thêm hoặc xoá tiêu đề khỏi yêu cầu hoặc phản hồi
- Phân tích cú pháp phản hồi JSON
Ứng dụng khách HTTP
Một tính năng mạnh mẽ của chính sách JavaScript là ứng dụng HTTP. Bạn có thể sử dụng ứng dụng HTTP (hoặc đối tượng httpClient
) để thực hiện một hoặc nhiều lệnh gọi đến phần phụ trợ hoặc dịch vụ bên ngoài. Ứng dụng HTTP đặc biệt hữu ích khi cần thực hiện lệnh gọi đến nhiều dịch vụ bên ngoài và kết hợp các phản hồi trong một API duy nhất.
Mã JavaScript mẫu thực hiện lệnh gọi đến phần phụ trợ bằng đối tượng httpClient
var headers = {'X-SOME-HEADER' : 'some value' }; var myRequest = new Request("http://www.example.com","GET",headers); var exchange = httpClient.send(myRequest);
Đối tượng httpClient
hiển thị 2 phương thức get
và send
(send
dùng trong mã mẫu ở trên) để tạo các yêu cầu HTTP. Cả hai phương thức đều không đồng bộ và trả về đối tượng exchange
trước khi yêu cầu HTTP thực tế hoàn tất.
Các yêu cầu HTTP có thể mất từ vài giây đến vài phút. Sau khi một yêu cầu HTTP được thực hiện, bạn cần phải biết thời điểm hoàn tất để có thể xử lý phản hồi từ yêu cầu đó. Một trong những cách phổ biến nhất để xác định thời điểm hoàn tất yêu cầu HTTP là gọi phương thức waitForComplete()
của đối tượng exchange
.
waitForComplete()
Phương thức waitForComplete()
tạm dừng luồng cho đến khi yêu cầu HTTP hoàn tất và phản hồi (thành công/không thành công) được trả về. Sau đó, hệ thống có thể xử lý phản hồi từ phần phụ trợ hoặc dịch vụ bên ngoài.
Mã JavaScript mẫu với 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()); }
Phản mẫu
Việc sử dụng waitForComplete()
sau khi gửi yêu cầu HTTP trong mã JavaScript sẽ ảnh hưởng đến hiệu suất.
Hãy xem xét mã JavaScript sau đây gọi waitForComplete()
sau khi gửi yêu cầu HTTP.
Mã cho 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', response1.status); } else { error = exchangeObj.getError(); context.setVariable('example.error', 'Woops: ' + error); }
Trong ví dụ này:
- Mã JavaScript sẽ gửi yêu cầu HTTP đến API phụ trợ.
- Sau đó, lệnh gọi
waitForComplete()
để tạm dừng việc thực thi cho đến khi yêu cầu hoàn tất.API
waitForComplete()
khiến luồng đang thực thi mã JavaScript bị chặn cho đến khi phần phụ trợ hoàn tất việc xử lý yêu cầu và phản hồi lại.
Có giới hạn trên về số lượng luồng (30%) có thể thực thi đồng thời mã JavaScript trên Trình xử lý thông báo bất kỳ lúc nào. Sau khi đạt đến giới hạn đó, sẽ không còn luồng nào để thực thi mã JavaScript. Vì vậy, nếu có quá nhiều yêu cầu đồng thời thực thi API waitForComplete()
trong mã JavaScript, thì các yêu cầu tiếp theo sẽ không thành công kèm theo Lỗi máy chủ nội bộ 500 và "Hết thời gian chờ" ngay cả trước khi hết thời gian chờ chính sách JavaScript.
Nhìn chung, trường hợp này có thể xảy ra nếu phần phụ trợ mất nhiều thời gian để xử lý yêu cầu hoặc có lưu lượng truy cập cao.
Tác động
- Các yêu cầu API sẽ không thành công kèm theo Lỗi máy chủ nội bộ 500 và kèm theo thông báo lỗi "Hết thời gian chờ" khi số lượng yêu cầu đồng thời thực thi
waitForComplete()
trong mã JavaScript vượt quá giới hạn đã xác định trước. - Việc chẩn đoán nguyên nhân của vấn đề có thể rất khó khăn vì JavaScript không thành công với "Hết thời gian chờ" mặc dù giới hạn thời gian cho chính sách JavaScript cụ thể chưa trôi qua.
Phương pháp hay nhất
Sử dụng lệnh gọi lại trong ứng dụng HTTP để đơn giản hoá mã chú thích và cải thiện hiệu suất, đồng thời tránh sử dụng waitForComplete()
trong mã JavaScript. Phương thức này đảm bảo rằng luồng thực thi JavaScript sẽ không bị chặn cho đến khi yêu cầu HTTP hoàn tất.
Khi một lệnh gọi lại được sử dụng, luồng sẽ gửi các yêu cầu HTTP trong mã JavaScript và trả về nhóm. Vì luồng không còn bị chặn nữa nên bạn có thể xử lý các yêu cầu khác. Sau khi yêu cầu HTTP hoàn tất và lệnh gọi lại đã sẵn sàng để thực thi, một tác vụ sẽ được tạo và thêm vào hàng đợi tác vụ. Một trong các luồng từ nhóm sẽ thực thi lệnh gọi lại dựa trên mức độ ưu tiên của tác vụ.
Mã JavaScript mẫu bằng cách sử dụng các lệnh gọi lại trong 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);