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ủ đề này thảo luận về Mô hình đối tượng JavaScript của Apigee Edge. Bạn cần nắm rõ mô hình này nếu có ý định sử dụng chính sách JavaScript để thêm JavaScript tuỳ chỉnh vào một proxy API.
Giới thiệu về mô hình đối tượng JavaScript của Edge
Mô hình đối tượng JavaScript của Apigee Edge xác định các đối tượng có thuộc tính liên kết mà có thể thực thi mã JavaScript trong luồng proxy Apigee Edge. Bạn sử dụng chính sách JavaScript để đính kèm mã tuỳ chỉnh này vào quy trình proxy API.
Các đối tượng mà mô hình này xác định có phạm vi trong luồng proxy API, nghĩa là một số đối tượng và thuộc tính chỉ có sẵn tại các điểm cụ thể trong luồng. Khi JavaScript được thực thi, một phạm vi sẽ được tạo để thực thi. Trong phạm vi đó, các tệp tham chiếu đối tượng sau sẽ được tạo:
- ngữ cảnh: Một đối tượng cung cấp quyền truy cập vào ngữ cảnh của thông báo
- yêu cầu: Viết tắt cho phép truy cập vào đối tượng yêu cầu
- phản hồi: Là cách viết tắt cho phép truy cập vào đối tượng yêu cầu
- crypto: Cung cấp nhiều hàm băm
- print: Hàm để phát dữ liệu đầu ra
- thuộc tính: Cho phép đọc đối với các thuộc tính cấu hình trong chính sách
Đối tượng ngữ cảnh
Đối tượng context
có phạm vi toàn cục. API này có sẵn ở mọi nơi trong luồng proxy API. Lớp này có 4 đối tượng con: proxyRequest
, proxyResponse
, targetRequest
, targetResponse
. Các đối tượng con này nằm trong phạm vi của yêu cầu và phản hồi môi trường xung quanh, tức là yêu cầu và phản hồi proxy hoặc yêu cầu mục tiêu và phản hồi. Ví dụ: nếu chính sách JavaScript thực thi trong phần điểm cuối proxy của luồng, thì các đối tượng context.proxyRequest
và context.proxyResponse
sẽ nằm trong phạm vi. Nếu JavaScript chạy trong một luồng mục tiêu, thì các đối tượng context.targetRequest
và context.targetResponse
nằm trong phạm vi.
Đối tượng context
cũng có các thuộc tính và phương thức được mô tả chi tiết trong chủ đề này. Ví dụ: mã JavaScript trong ví dụ sau đây sử dụng thuộc tính context.flow
và gọi các phương thức get/setVariable()
trên context
.
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("USER.name", username); }
Các phương thức này tương tác trực tiếp với các biến luồng.
Giá trị thuộc tính context.flow
là phạm vi luồng hiện tại. Trong luồng yêu cầu proxy, nó được đặt thành PROXY_REQ_FLOW
không đổi. Nếu trong quy trình phản hồi mục tiêu, giá trị này được đặt thành TARGET_RESP_FLOW
. Hằng số này rất hữu ích để thực thi mã theo phạm vi cụ thể. Phương thức getter cho phép bạn nhận các biến luồng và phương thức setter cho phép bạn đặt các biến luồng. Các biến này thường có sẵn trong luồng proxy và có thể được các chính sách khác sử dụng.
Hãy xem tài liệu tham khảo về đối tượng ngữ cảnh bên dưới để biết thêm thông tin chi tiết và ví dụ.
Đối tượng mã hoá
Đối tượng mã hoá thêm tính năng hỗ trợ mật mã hiệu suất cao cơ bản cho Mô hình đối tượng JavaScript. Hãy xem tài liệu tham khảo về đối tượng tiền mã hoá bên dưới để biết thêm thông tin và ví dụ.
Đối tượng yêu cầu và phản hồi
Các đối tượng request
và response
là các tham chiếu viết tắt đến yêu cầu và phản hồi môi trường xung quanh, tức là yêu cầu và phản hồi proxy hoặc yêu cầu mục tiêu và phản hồi. Các đối tượng mà các biến này tham chiếu đến phụ thuộc vào bối cảnh thực thi chính sách JavaScript. Nếu JavaScript chạy trong luồng của một điểm cuối proxy, thì các biến yêu cầu và phản hồi sẽ tham chiếu đến context.proxyRequest
và context.proxyResponse
. Nếu JavaScript chạy trong luồng mục tiêu, thì các biến này sẽ tham chiếu đến context.targetRequest
và context.targetResponse
.
Hàm print()
Mô hình đối tượng JavaScript bao gồm một hàm print()
mà bạn có thể sử dụng để xuất thông tin gỡ lỗi sang công cụ Edge Trace. Hãy xem phần Gỡ lỗi bằng câu lệnh print() của JavaScript.
Đối tượng thuộc tính
Khi sử dụng một phần tử properties
.
Ví dụ: nếu cấu hình JavaScript của bạn chứa:
<Javascript name='JS-1' > <Properties> <Property name="number">8675309</Property> <Property name="firstname">Jenny</Property> </Properties> <ResourceURL>jsc://my-code.js</ResourceURL> </Javascript>
Sau đó, trong my-code.js
, bạn có thể:
print(properties.firstname); // prints Jenny print(properties.number); // 8675309
Thực tế hơn, cấu hình có thể cho phép mã hoạt động theo cách khác khi chạy trong nhiều môi trường, tại các thời điểm khác nhau hoặc vì bất kỳ lý do gì.
Ví dụ: nội dung sau đây chỉ định "tên biến" và kiểu đầu ra mà JavaScript sẽ chuyển phát thông tin vào:
<Javascript name='JS-2' > <Properties> <Property name="output">my_output_variable</Property> <Property name="prettyPrint">true</Property> </Properties> <ResourceURL>jsc://emit-results.js</ResourceURL> </Javascript>Sau đó, trong
emit-results.js
, mã có thể thực hiện việc này:
var result = { prop1: "something", prop2 : "something else" } ; if (properties.prettyPrint == "true") { context.setVariable(properties.output, JSON.stringify(result, null, 2)); } else { context.setVariable(properties.output, JSON.stringify(result)); }
tham chiếu đối tượng mật mã
Đối tượng mật mã cho phép bạn thực hiện các hàm băm mã hoá cơ bản trong JavaScript.
Đối tượng tiền mã hoá có phạm vi trên toàn cầu. API này có sẵn ở mọi nơi trong luồng proxy API. Crypto cho phép bạn làm việc với các đối tượng băm sau:
- SHA-1
- SHA256
- SHA512
- MD5
Làm việc với đối tượng SHA-1
Bạn có thể tạo đối tượng SHA-1, cập nhật và chuyển đổi chúng thành giá trị hex và base64.
Tạo đối tượng SHA-1 mới
var _sha1 = crypto.getSHA1();
Cập nhật đối tượng SHA-1
Cú pháp
_sha1.update(value);
Thông số
- value – (Chuỗi) Giá trị chuỗi bất kỳ.
Ví dụ
Cập nhật đối tượng SHA-1:
_sha1.update("salt_value"); _sha1.update("some text");
Trả về đối tượng SHA-1 dưới dạng một chuỗi hex
var _hashed_token = _sha1.digest();
Trả về đối tượng SHA-1 dưới dạng chuỗi base64
var _hashed_token = _sha1.digest64();
Làm việc với đối tượng SHA-256
Bạn có thể tạo đối tượng SHA-256, cập nhật và chuyển đổi chúng thành giá trị hex và base64.
Tạo đối tượng SHA-256 mới
var _sha256 = crypto.getSHA256();
Cập nhật đối tượng SHA-256
Cú pháp
_sha256.update(value);
Thông số
- value – (Chuỗi) Giá trị chuỗi bất kỳ.
Ví dụ
Cập nhật đối tượng SHA-256:
_sha256.update("salt_value"); _sha256.update("some text");
Trả về đối tượng SHA-256 dưới dạng chuỗi hex
var _hashed_token = _sha256.digest();
Trả về đối tượng SHA-256 dưới dạng chuỗi base64
var _hashed_token = _sha256.digest64();
Làm việc với đối tượng SHA-512
Bạn có thể tạo đối tượng SHA-512, cập nhật và chuyển đổi chúng thành giá trị hex và base64.
Tạo đối tượng SHA-512 mới
var _sha512 = crypto.getSHA512();
Cập nhật đối tượng SHA-512
Cú pháp
_sha512.update(value);
Thông số
- value – (Chuỗi) Giá trị chuỗi bất kỳ.
Ví dụ
Cập nhật đối tượng SHA-512:
_sha512.update("salt_value"); _sha512.update("some text");
Trả về đối tượng SHA-512 dưới dạng chuỗi hex
var _hashed_token = _sha512.digest();
Trả về đối tượng SHA-512 dưới dạng chuỗi base64
var _hashed_token = _sha512.digest64();
Làm việc với đối tượng MD5
Bạn có thể tạo các đối tượng MD5, cập nhật và chuyển đổi chúng thành các giá trị hex và base64.
Tạo đối tượng MD5 mới
var _md5 = crypto.getMD5();
Cập nhật đối tượng MD5
Cú pháp
_md5.update(value);
Thông số
- value – (Chuỗi) Giá trị chuỗi bất kỳ.
Ví dụ
Cập nhật đối tượng MD5:
_md5.update("salt_value"); _md5.update("some text");
Trả về đối tượng MD5 dưới dạng một chuỗi hex
var _hashed_token = _md5.digest();
Trả về đối tượng MD5 dưới dạng chuỗi base64
var _hashed_token = _md5.digest64();
Hỗ trợ ngày/giờ mã hoá
Đối tượng mật mã hỗ trợ các mẫu định dạng ngày/giờ.
crypto.dateFormat()
Trả về ngày ở định dạng chuỗi.
Cú pháp
crypto.dateFormat(format, [timezone], [time])
Thông số
- format – (Chuỗi) Phương thức triển khai cơ bản cho tham số này là java.text.SimpleDateFormat. Ví dụ: "yyyy-MM-DD HH:mm:ss.SSS"
- timezone – (Chuỗi, không bắt buộc) Cách triển khai cơ bản cho thông số này là java.util.TimeZone. Tham số này là sameDefault: UTC
- time - (Số, không bắt buộc) Một giá trị dấu thời gian Unix để định dạng. Mặc định: thời gian hiện tại
Ví dụ
Xem thời gian hiện tại, tính bằng mili giây:
var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');
Xem giờ hiện tại theo múi giờ Thái Bình Dương:
var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');
Nhận giá trị của 10 giây kể từ bây giờ:
var _timeNow = Number(context.getVariable('system.timestamp')); var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);
Các ví dụ khác. Xem thêm tài liệu về java.text.SimpleDateFormat.
var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Dùng getHash() để lấy mọi đối tượng băm được hỗ trợ
Ví dụ
var _hash1 = crypto.getHash('MD5'); var _hash2 = crypto.getHash('SHA-1'); var _hash3 = crypto.getHash('SHA-256'); var _hash4 = crypto.getHash('SHA-512');
Ví dụ về tiền mã hoá
try { // get values to use with hash functions var salt = context.getVariable("salt") || 'SomeHardCodedSalt'; var host = context.getVariable("request.header.Host"); var unhashed_token = ""; var _timeNow = Number(context.getVariable('system.timestamp')); var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow); unhashed_token = "|" + now + "|" + host // generate a hash with the unhashedToken: var sha512 = crypto.getSHA512(); sha512.update(salt); sha512.update(unhashed_token); // convert to base64 var base64_token = sha512.digest64(); // set headers context.setVariable("request.header.now", now); context.setVariable("request.header.token", base64_token); } catch(e) { throw 'Error in Javascript'; }
tham chiếu đối tượng theo ngữ cảnh
- tóm tắt đối tượng theo ngữ cảnh
- phương thức của đối tượng ngữ cảnh
- thuộc tính đối tượng theo bối cảnh
- đối tượng theo bối cảnh con
Một đối tượng context
được tạo cho mỗi giao dịch yêu cầu/phản hồi do một proxy API thực thi. Đối tượng context
hiển thị các phương thức để lấy, đặt và xoá biến liên quan đến từng giao dịch.
Biến xác định các thuộc tính dành riêng cho một giao dịch. Thời gian trong ngày, ngôn ngữ của ứng dụng đưa ra yêu cầu, tác nhân người dùng của ứng dụng đưa ra yêu cầu và URL của dịch vụ mục tiêu đều là ví dụ về các biến có trong context
. Do đó, context
rất hữu ích cho việc xây dựng logic dựa trên các thuộc tính này để thực thi hành vi tuỳ chỉnh.
Vui lòng xem Tài liệu tham khảo về biến luồng và chính sách Trích xuất biến.
tóm tắt đối tượng theo ngữ cảnh
Bảng này mô tả ngắn gọn đối tượng ngữ cảnh và các phần tử con của đối tượng đó, đồng thời liệt kê các thuộc tính liên kết với mỗi đối tượng.
Tên | Nội dung mô tả | Thuộc tính |
---|---|---|
context |
Một trình bao bọc cho ngữ cảnh quy trình xử lý thông báo cũng như Luồng yêu cầu và phản hồi được ProxyEndpoint và TargetEndpoint thực thi. | luồng, phiên |
context. proxyRequest |
Một đối tượng đại diện cho thông báo yêu cầu đến đến ProxyEndpoint (từ ứng dụng yêu cầu đến proxy API) | tiêu đề, tham số truy vấn, phương thức, nội dung, url |
context. targetRequest |
Một đối tượng đại diện cho thông báo yêu cầu gửi đi từ TargetEndpoint (từ proxy API đến dịch vụ phụ trợ). | tiêu đề, tham số truy vấn, phương thức, nội dung, url |
context. targetResponse |
Một đối tượng đại diện cho thông báo phản hồi mục tiêu đến (từ dịch vụ phụ trợ đến proxy API) | tiêu đề, nội dung, trạng thái |
context. proxyResponse |
Một đối tượng đại diện cho thông báo phản hồi của proxy đi (từ proxy API đến ứng dụng yêu cầu) | tiêu đề, nội dung, trạng thái |
context.flow |
Tên của luồng hiện tại. | Hãy xem context.flow ở bên dưới. |
context.session |
Bản đồ các cặp tên/giá trị mà bạn có thể dùng để chuyển các đối tượng giữa hai bước khác nhau được thực thi trong cùng một ngữ cảnh. Ví dụ: context.session['key'] = 123 . |
Để biết thêm thông tin về những trường hợp và trường hợp không nên sử dụng đối tượng này, hãy tham khảo cuộc thảo luận tại cộng đồng Apigee. |
phương thức của đối tượng ngữ cảnh
context.getVariable()
Truy xuất giá trị của biến tuỳ chỉnh hoặc được xác định trước.
Cú pháp
context.getVariable("variable-name");
Ví dụ
Cách nhận giá trị của năm hiện tại:
var year = context.getVariable('system.time.year');
context.setVariable()
Đặt giá trị cho một biến tuỳ chỉnh hoặc cho bất kỳ biến được xác định trước có thể ghi nào.
Cú pháp
context.setVariable("variable-name", value);
Ví dụ
Một trường hợp phổ biến để đặt biến là khi proxy API phải tự động ghi URL mục tiêu. JavaScript sau đây lấy giá trị của biến tên là USER.name
, thêm giá trị đó vào URL http://mocktarget.apigee.net?user=
dưới dạng tham số truy vấn, sau đó đặt target.url
được xác định trước thành giá trị đó.
context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));
context.removeVariable()
Xoá một biến khỏi ngữ cảnh.
Cú pháp
context.removeVariable('variable-name');
thuộc tính đối tượng theo bối cảnh
Thuộc tính flow
là một chuỗi xác định luồng proxy API hiện tại. Thuộc tính này được dùng để cho biết Flow đính kèm JavaScript. Sau đây là các giá trị được hỗ trợ:
PROXY_REQ_FLOW
PROXY_RESP_FLOW
TARGET_REQ_FLOW
TARGET_RESP_FLOW
Mỗi tên Flow bao gồm PreFlow, PostFlow và mọi Flow có điều kiện được xác định trong ProxyEndpoints hoặc TargetEndpoints.
Thuộc tính không bắt buộc này hữu ích khi JavaScript phổ biến được thực thi trong nhiều Flow, nhưng có thể thay đổi hành vi của nó tuỳ thuộc vào Flow mà nó thực thi. Sử dụng thuộc tính Flow cho các mô-đun JavaScript sẽ được dùng lại trong nhiều proxy API, trong đó, bạn phải có mã để kiểm tra Flow hiện tại trước khi thực thi logic.
Ví dụ
Chỉ thiết lập tiêu đề HTTP trên Luồng targetRequest:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
Chỉ đặt nội dung trên Luồng proxyResponse:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
Bản đồ các cặp tên/giá trị có thể dùng để truyền các đối tượng giữa hai chính sách được thực thi trong cùng một ngữ cảnh thông báo.
Ví dụ
Đặt một giá trị trong phiên hoạt động:
context.session['key'] = 123;
Nhận giá trị từ phiên:
var value = context.session['key']; // 123
đối tượng theo bối cảnh con
Như minh hoạ bên dưới, một Luồng proxy API hoàn chỉnh bao gồm 4 giai đoạn riêng biệt, mỗi giai đoạn có một đối tượng thông báo liên kết là phần tử con của đối tượng ngữ cảnh:
context.proxyRequest
: Tin nhắn yêu cầu đến nhận được từ ứng dụng đưa ra yêu cầu.context.targetRequest
: Thông báo yêu cầu đi được gửi đến dịch vụ phụ trợ.context.proxyResponse
: Tin nhắn phản hồi đi được trả về ứng dụng yêu cầu.context.targetResponse
: Thông báo yêu cầu đến nhận được từ dịch vụ phụ trợ.
Các phần sau đây mô tả phương thức và thuộc tính của các đối tượng này:
Ngữ cảnh.*Yêu cầu đối tượng con
Đối với mỗi giao dịch HTTP được thực thi trong proxy API, hệ thống sẽ tạo 2 đối tượng thông báo yêu cầu: một inbound (yêu cầu từ ứng dụng) và một inbound (yêu cầu do proxy API tạo ra và được gửi tới mục tiêu phụ trợ).
Đối tượng context
có các đối tượng con đại diện cho các thông báo yêu cầu sau đây: context.proxyRequest
và context.targetRequest
. Những đối tượng này cho phép bạn truy cập vào các thuộc tính trong luồng yêu cầu thuộc phạm vi áp dụng khi mã JavaScript của bạn thực thi.
Lưu ý: Bạn cũng có thể sử dụng đối tượng viết tắt request
để truy cập vào những thuộc tính này trong một luồng yêu cầu. Đối tượng request
tham chiếu đến context.proxyRequest
hoặc context.targetRequest
, tuỳ thuộc vào vị trí trong luồng mà mã JavaScript của bạn thực thi.
ngữ cảnh.*Yêu cầu thuộc tính của đối tượng con
Tên tài sản | Nội dung mô tả |
---|---|
url |
Thuộc tính URL hoàn chỉnh của yêu cầu bao gồm các thuộc tính sau:
Khi nhận được
|
Ví dụ: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; |
|
headers |
Tiêu đề của yêu cầu HTTP dưới dạng mục ánh xạ của |
Ví dụ: Đối với yêu cầu HTTP này: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5ZJavaScript sau: context.proxyRequest.headers['Content-Type']; context.proxyRequest.headers['Authorization']; sẽ trả về các giá trị sau application/json Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z |
|
queryParams |
Tham số truy vấn của thông báo yêu cầu dưới dạng liên kết của |
Ví dụ: "?city=PaloAlto&city=NewYork" có thể truy cập bằng: context.proxyRequest.queryParams['city']; // == 'PaloAlto' context.proxyRequest.queryParams['city'][0] // == 'PaloAlto' context.proxyRequest.queryParams['city'][1]; // == 'NewYork' context.proxyRequest.queryParams['city'].length(); // == 2 |
|
method |
Động từ HTTP ( |
Ví dụ: Đối với yêu cầu này: POST /v1/blogs HTTP/1.1 Host: api.example.com Content-Type: application/json Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z JavaScript sau: context.proxyRequest.method; sẽ trả về giá trị sau POST |
|
body |
Nội dung thông báo (trọng tải) của yêu cầu HTTP. Nội dung yêu cầu có các thành viên sau:
|
Ví dụ: Đối với nội dung XML: <customer number='1'> <name>Fred<name/> <customer/> Cách truy cập vào các phần tử của đối tượng XML như sau: var name = context.targetRequest.body.asXML.name; Để truy cập vào các thuộc tính XML, hãy sử dụng ký hiệu var number = context.targetRequest.body.asXML.@number; Đối với nội dung yêu cầu JSON: { "a": 1 , "b" : "2" } var a = context.proxyRequest.body.asJSON.a; // == 1 var b = context.proxyRequest.body.asJSON.b; // == 2 Để đọc các thông số biểu mẫu, hãy làm như sau: "vehicle=Car&vehicle=Truck" v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
Ngữ cảnh.*Đối tượng con phản hồi
Đối với mỗi giao dịch HTTP thực thi trong proxy API, hệ thống sẽ tạo 2 đối tượng thông báo phản hồi: một inbound (phản hồi từ dịch vụ phụ trợ) và một inbound (phản hồi được gửi lại cho máy khách).
Đối tượng ngữ cảnh có các đối tượng con đại diện cho các thông báo phản hồi sau: context.proxyResponse
và context.targetResponse
. Các đối tượng này cho phép bạn truy cập vào các thuộc tính trong luồng phản hồi trong phạm vi khi mã JavaScript của bạn thực thi.
Lưu ý: Bạn cũng có thể dùng đối tượng viết tắt response
để truy cập vào những thuộc tính này trong một luồng phản hồi. Đối tượng response
tham chiếu đến context.proxyResponse
hoặc context.targetResponse
, tuỳ thuộc vào vị trí trong luồng mà mã JavaScript của bạn thực thi.
ngữ cảnh.*Phản hồi thuộc tính của đối tượng
Tên tài sản | Nội dung mô tả |
---|---|
headers |
Tiêu đề HTTP của thông báo phản hồi dưới dạng một mục ánh xạ của |
Ví dụ: var cookie = context.targetResponse.headers['Set-Cookie']; |
|
status |
Mã trạng thái có thông báo trạng thái dưới dạng thuộc tính. Cả mã trạng thái và thông báo trạng thái đều có sẵn dưới dạng thuộc tính. |
Ví dụ: var status = context.targetResponse.status.code; // 200 var msg = context.targetResponse.status.message; // "OK" |
|
content |
Nội dung HTTP (nội dung trọng tải) của thông báo phản hồi. Nội dung phản hồi có các thành phần sau: context.targetResponse.content.asXML; context.targetResponse.content.asJSON; |
Dùng ký hiệu .asXML
Có một cách thuận tiện để xem tài liệu XML bằng ký hiệu .asXML
.
Phần này mô tả cách sử dụng ký hiệu này, sự khác biệt giữa ký hiệu này và request.content
và context.proxyRequest.content
.
Ví dụ:
request.content.asXML
hoặc
context.proxyRequest.content.asXML
Cả hai dạng *.content
và *.content.asXML
đều có thể được dùng trong ngữ cảnh chuỗi, và JavaScript sẽ chuyển đổi các dạng này thành chuỗi. Trong trường hợp trước đây (*.content
), chuỗi bao gồm tất cả nội dung khai báo cũng như nhận xét XML. Trong trường hợp sau (*.content.asXML
), giá trị chuỗi của kết quả sẽ bị xoá các nội dung khai báo và nhận xét.
Ví dụ:
msg.content:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error> <!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->
msg.content.asXML:
<?xml version="1.0" encoding="UTF-8"?> <yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US"> <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com" </yahoo:description> </yahoo:error>
Hơn nữa, bạn có thể sử dụng biểu mẫu .asXML
để truyền tải hệ phân cấp XML bằng cách chỉ định tên của các phần tử và thuộc tính. Bạn không thể truyền tải hệ phân cấp bằng cú pháp khác.
Gỡ lỗi bằng câu lệnh print() của JavaScript
Nếu bạn đang sử dụng chính sách JavaScript để thực thi mã JavaScript tuỳ chỉnh, hãy lưu ý rằng bạn có thể sử dụng hàm print() để xuất thông tin gỡ lỗi sang Công cụ theo dõi. Hàm này có sẵn trực tiếp thông qua mô hình đối tượng JavaScript. Ví dụ:
if (context.flow=="PROXY_REQ_FLOW") { print("In proxy request flow"); var username = context.getVariable("request.queryparam.user"); print("Got query param: " + username); context.setVariable("USER.name", username); print("Set query param: " + context.getVariable("USER.name")); } if (context.flow=="TARGET_REQ_FLOW") { print("In target request flow"); var username = context.getVariable("USER.name"); var url = "http://mocktarget.apigee.net/user?" context.setVariable("target.url", url + "user=" + username); print("callout to URL: ", context.getVariable("target.url")); }
Để xem kết quả, hãy chọn Output from all transaction (Kết quả từ tất cả giao dịch) ở cuối cửa sổ Trace (Theo dõi). Bạn cũng có thể tìm thấy kết quả trong thuộc tính Theo dõi có tên là stepExecution-stdout
.
Tạo chú thích JavaScript bằng httpClient
Sử dụng httpClient
để tạo nhiều yêu cầu HTTP song song, không đồng bộ cho bất kỳ URL nào từ bên trong mã JavaScript tuỳ chỉnh thực thi trong luồng proxy API.
Đối tượng httpClient
được mô hình đối tượng JavaScript API API hiển thị.
Giới thiệu về httpClient
Đối tượng httpClient
hiển thị với mã JavaScript tuỳ chỉnh chạy trên Apigee Edge thông qua mô hình đối tượng JavaScript. Để đính kèm JavaScript tuỳ chỉnh vào một proxy API, bạn nên sử dụng chính sách về JavaScript. Khi chính sách này chạy, mã JavaScript tuỳ chỉnh sẽ thực thi.
Đối tượng httpClient
rất hữu ích cho việc phát triển các dịch vụ tổng hợp hoặc ứng dụng kết hợp dữ liệu. Ví dụ: bạn có thể hợp nhất nhiều lệnh gọi phụ trợ thành một phương thức API duy nhất.
Đối tượng này thường được dùng để thay thế cho chính sách Chú thích dịch vụ.
Dưới đây là một mẫu sử dụng cơ bản. Tạo thực thể cho một đối tượng Yêu cầu, gán cho đối tượng đó một URL (ví dụ: cho một dịch vụ phụ trợ mà bạn muốn gọi) và gọi httpClient.send
bằng đối tượng yêu cầu đó.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
Tham chiếu httpClient
Ứng dụng HTTP cho thấy 2 phương thức: get()
và send()
.
httpClient.get()
Một phương thức thuận tiện cho các yêu cầu HTTP GET
đơn giản, không hỗ trợ tiêu đề HTTP.
Tác dụng
var exchangeObj = httpClient.get(url);
Trả về
Phương thức này trả về một đối tượng exchange
. Đối tượng này không có thuộc tính và hiển thị các phương thức sau:
isError()
: (boolean) Trả vềtrue
nếu httpClient không thể kết nối với máy chủ. Các mã trạng thái HTTP4xx
và5xx
dẫn đếnisError()
false
khi kết nối đã hoàn tất và một mã phản hồi hợp lệ được trả về. NếuisError()
trả vềtrue
, thì lệnh gọi đếngetResponse()
sẽ trả vềundefined
JavaScript.isSuccess()
: (boolean) Trả vềtrue
nếu quá trình gửi hoàn tất và thành công.isComplete()
: (boolean) Trả vềtrue
nếu yêu cầu hoàn tất.waitForComplete()
: Tạm dừng luồng cho đến khi yêu cầu hoàn tất (do thành công hoặc lỗi).getResponse()
: (đối tượng) Trả về đối tượng phản hồi nếuhttpClient.send()
đã hoàn tất và thành công. Đối tượng được trả về có các phương thức và thuộc tính giống hệt như đối tượng Contextual.proxyResponse. Xem thông tin tóm tắt về đối tượng ngữ cảnh.getError()
: (chuỗi) Nếu lệnh gọi đếnhttpClient.send()
dẫn đến lỗi, hệ thống sẽ trả về thông báo lỗi dưới dạng chuỗi.
Ví dụ
Gửi đối tượng Yêu cầu được định cấu hình đầy đủ chứa các thuộc tính của yêu cầu HTTP. Sử dụng lệnh gọi lại không chặn để xử lý phản hồi.
// Add the required the headers for making a specific API request var headers = {'X-SOME-HEADER' : 'some value' }; // Make a GET API request along with headers var myRequest = new Request("http://www.example.com","GET",headers); // Define the callback function and process the response from the GET API request 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(myRequest, onComplete);
Sử dụng chính sách JavaScript
Sử dụng chính sách JavaScript để đính kèm mã JavaScript tuỳ chỉnh vào một luồng proxy. Xem chính sách về JavaScript.
Chủ đề có liên quan
- Chính sách về JavaScript
- Mô hình đối tượng JavaScript
- Để biết các mẫu và hướng dẫn cơ bản, hãy xem phần Lập trình proxy API bằng JavaScript.
- Để biết các mã mẫu JavaScript đang hoạt động, hãy xem mẫu API Edge trên GitHub.
Các bài viết trong Cộng đồng Apigee
Bạn có thể tìm thấy các bài viết liên quan này trên Cộng đồng API: