Mô hình đối tượng JavaScript

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.proxyRequestcontext.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.targetRequestcontext.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 requestresponse 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.proxyRequestcontext.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.targetRequestcontext.targetResponse.

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ử trong cấu hình chính sách, mã JavaScript có thể truy cập vào các giá trị của những thuộc tính đó bằng cách sử dụng biến 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>
Sau đó, trong 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

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

context.flow

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_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_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';
}

context.session

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.proxyRequestcontext.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 là một thuộc tính tiện lợi ở chế độ đọc/ghi, kết hợp các tham số lược đồ, máy chủ lưu trữ, cổng, đường dẫn và truy vấn cho targetRequest.

URL đầy đủ của yêu cầu bao gồm các thuộc tính sau:

  • protocol: Giao thức của URL (ví dụ: HTTP, HTTPS)
  • port: Cổng (ví dụ: :80, :443)
  • host: Máy chủ lưu trữ của URL (ví dụ: www.example.com)
  • path: Đường dẫn của URI (ví dụ: /v1/mocktarget)

Khi nhận url, một URL sẽ được trả về theo định dạng sau:

protocol://host:port/path?queryParams

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 String => List

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
JavaScript sau đây:
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 String => List.

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 (GET, POST, PUT, DELETE, PATCH, v.v.) được liên kết với yêu cầu

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:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

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.proxyResponsecontext.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 String => List.

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.contentcontext.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*.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()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ủ. Mã trạng thái HTTP 4xx5xx dẫn đến isError() false, vì kết nối đã hoàn tất và mã phản hồi hợp lệ đã được trả về. Nếu isError() trả về true, thì lệnh gọi đến getResponse() 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 (thành công hoặc gặp lỗi).
  • getResponse(): (đối tượng) Trả về đối tượng phản hồi nếu httpClient.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 đến httpClient.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

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: