Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào
tài liệu 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 hiểu rõ mô hình này nếu dự đị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 Apigee Edge xác định các đối tượng có các thuộc tính được liên kết có sẵn cho mã JavaScript thực thi trong một 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 một quy trình proxy API.
Các đối tượng do mô hình này xác định có phạm vi trong luồng proxy API, tức là một số đối tượng và thuộc tính chỉ có ở những điểm cụ thể trong luồng. Khi JavaScript của bạn được thực thi, một phạm vi sẽ được tạo cho quá trình thực thi. Trong phạm vi đó, các tham chiếu đối tượng này sẽ được tạo:
- context: Một đối tượng cung cấp quyền truy cập vào bối cảnh của thông báo
- request: Một đoạn mã cho phép truy cập vào đối tượng yêu cầu
- response: Một đoạn mã 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 ra đầu ra
- properties: Cho phép quyền đọ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. Tính năng này có ở mọi nơi trong quy trình proxy API. Đối tượng này có 4 đối tượng con: proxyRequest, proxyResponse, targetRequest, targetResponse. Các đối tượng con này được giới hạn trong yêu cầu và phản hồi xung quanh, có thể là yêu cầu và phản hồi của proxy hoặc yêu cầu và phản hồi của mục tiêu. Ví dụ: nếu chính sách JavaScript thực thi trong phần điểm cuối proxy của quy trình, 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 sẽ 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ụ: ví dụ về mã JavaScript 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 quy trình yêu cầu proxy, giá trị này được đặt thành hằng số PROXY_REQ_FLOW. Nếu trong luồng 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 khi thực thi mã dành riêng cho phạm vi. Phương thức getter cho phép bạn lấy 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ó trong luồng proxy và có thể được các chính sách khác sử dụng.
Hãy xem phần tài liệu tham khảo về đối tượng theo bối 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 crypto thêm tính năng hỗ trợ mã hoá cơ bản, hiệu suất cao vào Mô hình đối tượng JavaScript. Hãy xem tài liệu tham khảo về đối tượng mã hoá bên dưới để biết thêm thông tin chi tiết và ví dụ.
Các đố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 cho yêu cầu và phản hồi xung quanh, có thể là yêu cầu và phản hồi của proxy hoặc yêu cầu và phản hồi của mục tiêu. Các đối tượng mà những biến này đề cập đến phụ thuộc vào bối cảnh mà chính sách JavaScript thực thi. 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 một luồng mục tiêu, thì các biến sẽ đề cập đế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ể dùng để xuất thông tin gỡ lỗi sang công cụ Edge Trace. Xem phần Gỡ lỗi bằng câu lệnh print() trong JavaScript.
Đối tượng thuộc tính
Khi sử dụng 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
Trên thực tế, cấu hình có thể cho phép mã hoạt động khác đi khi chạy trong các môi trường khác nhau, tại các thời điểm khác nhau hoặc vì bất kỳ lý do nào.
Ví dụ: sau đây chỉ định "tên biến" và kiểu đầu ra mà JavaScript sẽ 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>
emit-results.js, mã có thể làm như sau:
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 tiền mã hoá
Đối tượng crypto cho phép bạn thực hiện các hàm băm mật mã cơ bản trong JavaScript.
Đối tượng mã hoá có phạm vi toàn cục. Bạn có thể sử dụng tính năng này ở 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 các đối tượng SHA-1
Bạn có thể tạo các đối tượng SHA-1, cập nhật các đối tượng đó và chuyển đổi chúng thành các 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);
Tham số
- giá_trị – (Chuỗi) Giá trị bất kỳ dạng chuỗi.
Ví dụ
Cập nhật mộ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 một chuỗi base64
var _hashed_token = _sha1.digest64();
Làm việc với các đối tượng SHA-256
Bạn có thể tạo các đối tượng SHA-256, cập nhật các đối tượng đó và chuyển đổi chúng thành các giá trị hex và base64.
Tạo đối tượng SHA-256 mới
var _sha256 = crypto.getSHA256();
Cập nhật một đối tượng SHA-256
Cú pháp
_sha256.update(value);
Tham số
- giá_trị – (Chuỗi) Giá trị bất kỳ dạng chuỗi.
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 một chuỗi hex
var _hashed_token = _sha256.digest();
Trả về đối tượng SHA-256 dưới dạng một chuỗi base64
var _hashed_token = _sha256.digest64();
Làm việc với các đối tượng SHA-512
Bạn có thể tạo các đối tượng SHA-512, cập nhật các đối tượng đó và chuyển đổi chúng thành các giá trị thập lục phân và base64.
Tạo một đố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);
Tham số
- giá_trị – (Chuỗi) Giá trị bất kỳ dạng chuỗi.
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 một chuỗi thập lục phân
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 các đối tượng MD5
Bạn có thể tạo các đối tượng MD5, cập nhật các đối tượng đó 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);
Tham số
- giá_trị – (Chuỗi) Giá trị bất kỳ dạng chuỗi.
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 một chuỗi base64
var _hashed_token = _md5.digest64();
Hỗ trợ ngày/giờ mã hoá
Đối tượng mã hoá hỗ trợ các mẫu định dạng ngày/giờ.
crypto.dateFormat()
Trả về một ngày ở định dạng chuỗi.
Cú pháp
crypto.dateFormat(format, [timezone], [time])
Tham số
- format – (Chuỗi) Cách 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) Việc triển khai cơ bản cho tham số này là java.util.TimeZone. Tham số này giống với Default: UTC
- time – (Số, không bắt buộc) Giá trị dấu thời gian Unix cần định dạng. Mặc định: thời gian hiện tại
Ví dụ
Lấy 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');
Lấy thời gian 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');
Lấy 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. Bạn cũng có thể xem tài liệu 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");
Sử dụng getHash() để lấy bất kỳ đối tượng băm nào đượ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');
Mẫu có 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 ngữ cảnh
- tóm tắt đối tượng ngữ cảnh
- phương thức đối tượng ngữ cảnh
- thuộc tính đối tượng ngữ cảnh
- context object children
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 cung cấp các phương thức để nhận, đặt và xoá các biến liên quan đến từng giao dịch.
Các biến xác định những 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 khách yêu cầu, tác nhân người dùng của ứng dụng khách yêu cầu và URL của dịch vụ mục tiêu đều là các ví dụ về những biến có trong context. Do đó, context rất hữu ích khi 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.
Xem Tài liệu tham khảo về các 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 về đối tượng bối cảnh và các đối tượng con của đối tượng đó, đồng thời liệt kê các thuộc tính được liên kết với từng đối tượng.
| Tên | Mô tả | Thuộc tính |
|---|---|---|
context |
Một trình bao bọc cho ngữ cảnh của quy trình xử lý thông báo và các Luồng yêu cầu và phản hồi do ProxyEndpoint và TargetEndpoint thực thi. | flow, session |
context.proxyRequest |
Một đối tượng đại diện cho thông báo yêu cầu đế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ừ API proxy đế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 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 quy trình hiện tại. | Hãy xem context.flow bên dưới. |
context.session |
Một bản đồ gồm các cặp tên/giá trị mà bạn có thể dùng để truyền các đối tượng giữa 2 bước khác nhau đang thực thi trong cùng một bối cảnh. Ví dụ: context.session['key'] = 123. |
Để biết thêm thông tin về thời điểm nên và không nên sử dụng đối tượng này, hãy xem cuộc thảo luận này trên Cộng đồng Apigee. |
các phương thức đối tượng ngữ cảnh
context.getVariable()
Truy xuất giá trị của một biến được xác định trước hoặc biến tuỳ chỉnh.
Cú pháp
context.getVariable("variable-name");
Ví dụ
Cách lấy giá trị cho 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ó thể ghi được xác định trước nào.
Cú pháp
context.setVariable("variable-name", value);
Ví dụ
Một trường hợp phổ biến để thiết lập biến là khi một proxy API phải ghi URL đích một cách linh động. JavaScript sau đây sẽ lấy giá trị của một biến có tên là USER.name, thêm giá trị đó làm tham số truy vấn vào URL http://mocktarget.apigee.net?user=, rồi đặ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 context
Thuộc tính flow là một chuỗi xác định quy trình proxy API hiện tại. Thuộc tính này dùng để cho biết Flow mà JavaScript được đính kèm. Sau đây là các giá trị được hỗ trợ:
PROXY_REQ_FLOWPROXY_RESP_FLOWTARGET_REQ_FLOWTARGET_RESP_FLOW
Mỗi tên Luồng bao gồm PreFlow, PostFlow và mọi Luồng 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 rất hữu ích khi JavaScript chung được thực thi trong nhiều Luồng, nhưng có thể thay đổi hành vi tuỳ thuộc vào Luồng mà nó thực thi. Sử dụng thuộc tính Flow cho các mô-đun JavaScript dự kiến sẽ được dùng lại trong nhiều proxy API, trong đó mã cần kiểm tra Flow hiện tại trước khi thực thi logic.
Ví dụ
Chỉ đặt tiêu đề HTTP trên targetRequest Flow:
if (context.flow=="TARGET_REQ_FLOW") { context.targetRequest.headers['TARGET-HEADER-X']='foo'; }
Đặt nội dung chỉ trên proxyResponse Flow:
if (context.flow=="PROXY_RESP_FLOW") { context.proxyResponse.content='bar'; }
Bản đồ gồm 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 đang 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:
context.session['key'] = 123;
Nhận giá trị từ phiên:
var value = context.session['key']; // 123
các đối tượng con trong ngữ cảnh
Như minh hoạ dưới đây, 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 được liên kết là đối tượng con của đối tượng ngữ cảnh:
context.proxyRequest: Thông báo yêu cầu đến nhận được từ ứng dụng khách yêu cầu.context.targetRequest: Thông báo yêu cầu gửi đi được gửi đến dịch vụ phụ trợ.context.proxyResponse: Thông báo phản hồi gửi đi được trả về cho ứng dụng khách 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ả các phương thức và thuộc tính của những đối tượng này:
context.*Request child objects
Đối với mỗi giao dịch HTTP thực thi trong một proxy API, hai đối tượng thông báo yêu cầu sẽ được tạo: một đến (yêu cầu từ ứng dụng) và một đi (yêu cầu do proxy API tạo và gửi đến mục tiêu phụ trợ).
Đối tượng context có các đối tượng con đại diện cho những thông báo yêu cầu này: context.proxyRequest và context.targetRequest. 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 yêu cầu nằm trong phạm vi 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 các thuộc tính này trong một luồng yêu cầu. Đối tượng request đề cập đến context.proxyRequest hoặc context.targetRequest, tuỳ thuộc vào vị trí mà mã JavaScript của bạn thực thi trong luồng.
context.*Request child object properties
| Tên tài sản | Mô tả |
|---|---|
url |
Thuộc tính URL đầy đủ của yêu cầu bao gồm các thuộc tính sau:
Khi nhận
|
|
Ví dụ: context.targetRequest.url = 'http://www.example.com/path?q1=1' context.targetRequest.protocol ='https'; |
|
headers |
Tiêu đề yêu cầu HTTP dưới dạng một á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 ylSkZIjbdWybfs4fUQe9BqP0LH5Z 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 một ánh xạ của |
|
Ví dụ: "?city=PaloAlto&city=NewYork"có thể truy cập dưới dạ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 đây: context.proxyRequest.method; sẽ trả về giá trị sau POST |
|
body |
Nội dung thư (tải trọng) của yêu cầu HTTP. Nội dung yêu cầu có các thành phần sau:
|
|
Ví dụ: Đối với nội dung XML: <customer number='1'> <name>Fred<name/> <customer/> Để truy cập vào các phần tử của đối tượng XML, hãy làm 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ách đọc các tham số biểu mẫu: "vehicle=Car&vehicle=Truck"v0 = context.proxyRequest.body.asForm['vehicle'][0]; v1 = context.proxyRequest.body.asForm['vehicle'][1]; |
context.*Response child objects
Đối với mỗi giao dịch HTTP thực thi trong một proxy API, hai đối tượng thông báo phản hồi sẽ được tạo: một đến (phản hồi từ dịch vụ phụ trợ) và một đi (phản hồi được gửi lại cho ứng dụng.)
Đối tượng ngữ cảnh có các đối tượng con đại diện cho những thông báo phản hồi này: 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 nằm trong phạm vi 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 response để truy cập vào các thuộc tính này từ một luồng phản hồi. Đối tượng response đề cập đến context.proxyResponse hoặc context.targetResponse, tuỳ thuộc vào vị trí mà mã JavaScript của bạn thực thi trong luồng.
context.*Thuộc tính đối tượng phản hồi
| Tên tài sản | Mô tả |
|---|---|
headers |
Tiêu đề HTTP của thông báo phản hồi dưới dạng một á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 một 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 của phần nội dung HTTP (nội dung hữu ích) 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; |
Sử dụng ký hiệu .asXML
Có một cách thuận tiện để duyệt qua 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 và điểm khác biệt giữa ký hiệu này với request.content và context.proxyRequest.content.
Ví dụ:
request.content.asXML
hoặc
context.proxyRequest.content.asXML
Bạn có thể dùng cả biểu mẫu *.content và *.content.asXML trong ngữ cảnh chuỗi, đồng thời JavaScript sẽ ép buộc các biểu mẫu này trở thành chuỗi. Trong trường hợp trước (*.content), chuỗi này bao gồm tất cả các 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ẽ được xoá các 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>
Ngoài ra, bạn có thể dùng biểu mẫu .asXML để di chuyển qua 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ể duyệt qua hệ thống phân cấp bằng cú pháp khác.
Gỡ lỗi bằng câu lệnh print() trong JavaScript
Nếu đ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. Bạn có thể sử dụng trực tiếp hàm này 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 đầu ra, hãy chọn Output from all transactions (Đầu ra từ tất cả các giao dịch) ở cuối cửa sổ Trace (Dấu vết). Bạn cũng có thể tìm thấy đầu ra trong thuộc tính Trace (Dấu vết) có tên là stepExecution-stdout.
Tạo chú thích JavaScript bằng httpClient
Sử dụng httpClient để thực hiện nhiều yêu cầu HTTP không đồng bộ, song song đến bất kỳ URL nào từ trong mã JavaScript tuỳ chỉnh đang thực thi trong một luồng proxy API.
Đối tượng httpClient được mô hình đối tượng Javascript Apigee Edge hiển thị.
Giới thiệu về httpClient
Đối tượng httpClient được hiển thị cho 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 dùng chính sách JavaScript. Khi chính sách chạy, mã JavaScript tuỳ chỉnh sẽ thực thi.
Đối tượng httpClient rất hữu ích khi phát triển các dịch vụ tổng hợp hoặc kết hợp. 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 cho chính sách ServiceCallout.
Sau đây là một mẫu sử dụng cơ bản. Khởi tạo một đối tượng Request, chỉ định cho đối tượng đó một URL (ví dụ: đến một dịch vụ phụ trợ mà bạn muốn gọi) và gọi httpClient.send bằng đối tượng request đó.
var myRequest = new Request(); myRequest.url = "http://www.example.com"; var exchangeObj = httpClient.send(myRequest);
httpClient Reference
HTTP Client cung cấp 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ềtruenếu httpClient không thể kết nối với máy chủ. Mã trạng thái HTTP4xxvà5xxdẫn đếnisError()false, vì kết nối đã hoàn tất và 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ềundefinedJavaScript.isSuccess(): (boolean) Trả vềtruenếu quá trình gửi đã hoàn tất và thành công.isComplete(): (boolean) Trả vềtruenế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 (thành công hoặc gặp 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 context.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ãy trả về thông báo lỗi dưới dạng chuỗi.
Ví dụ
Gửi một đố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 một 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
- Để xem các mẫu và hướng dẫn cơ bản, hãy xem phần Lập trình các proxy API bằng JavaScript.
- Để xem các mẫu mã JavaScript đang hoạt động, hãy xem các mẫu Apigee Edge trên GitHub.
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 Apigee: