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

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

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ử trong cấu hình chính sách, mã JavaScript có thể truy cập vào giá trị của các 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

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

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ồngchí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

context.flow

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';
}

context.session

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

URL hoàn chỉnh 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)
  • cổng: Cổng (ví dụ: :80, :443)
  • máy chủ lưu trữ: 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 được url, URL sẽ được trả về ở đị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 đề của yêu cầu HTTP dưới dạng mục á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:
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 String => List.

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 (GET, POST, PUT, DELETE, PATCH, v.v.) liên quan đến 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:

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:

  • 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/>

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.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 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 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 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.contentcontext.proxyRequest.content.

Ví dụ:

request.content.asXML

hoặc

context.proxyRequest.content.asXML

Cả hai dạng *.content*.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()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 HTTP 4xx5xx dẫn đến isError() 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ế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 (do thành công hoặc 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 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 đến httpClient.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

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: