Chính sách 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

Nội dung

Chính sách này cho phép bạn thêm mã JavaScript tuỳ chỉnh thực thi trong ngữ cảnh của một API luồng proxy. Trong mã JavaScript tuỳ chỉnh, bạn có thể sử dụng các đối tượng, phương thức và thuộc tính của mô hình đối tượng JavaScript của Apigee Edge. Mô hình đối tượng cho phép bạn thu thập, thiết lập và xoá biến trong ngữ cảnh luồng proxy. Bạn cũng có thể sử dụng các hàm mật mã cơ bản được cung cấp cùng với mô hình đối tượng.

Giới thiệu

Có nhiều trường hợp sử dụng chính sách JavaScript. Ví dụ: bạn có thể lấy và thiết lập flow biến, thực thi logic tuỳ chỉnh và xử lý lỗi, trích xuất dữ liệu từ các yêu cầu hoặc phản hồi, chỉnh sửa động URL mục tiêu phụ trợ và nhiều chức năng khác. Chính sách này cho phép bạn triển khai hành vi tuỳ chỉnh không thuộc phạm vi điều chỉnh của bất kỳ chính sách tiêu chuẩn nào khác của Edge. Trên thực tế, bạn có thể sử dụng chính sách JavaScript để đạt được nhiều hành vi tương tự được triển khai bởi các chính sách khác, chẳng hạn như AttributionMessage và ExtractVariable.

Ghi nhật ký là một trường hợp sử dụng mà bạn không nên áp dụng cho chính sách JavaScript. Chính sách Ghi nhật ký thư phù hợp hơn với việc ghi nhật ký vào các nền tảng ghi nhật ký của bên thứ ba như Splunk, Sumo và Loggly, và bạn cải thiện hiệu suất của proxy API bằng cách thực thi chính sách Ghi nhật ký tin nhắn trong PostClientFlow, lệnh này sẽ thực thi sau khi phản hồi được gửi lại cho ứng dụng.

Chính sách JavaScript cho phép bạn chỉ định tệp nguồn JavaScript để thực thi hoặc bạn có thể trực tiếp đưa mã JavaScript vào cấu hình của chính sách bằng mã <Source> . Dù bằng cách nào, mã JavaScript cũng sẽ thực thi khi bước đính kèm chính sách. Đối với tuỳ chọn tệp nguồn, mã nguồn luôn được lưu trữ trong một vị trí chuẩn trong gói proxy: apiproxy/resources/jsc. Hoặc bạn cũng có thể lưu trữ mã nguồn trong tệp tài nguyên ở cấp môi trường hoặc tổ chức. Cho hướng dẫn, xem phần Tệp tài nguyên. Bạn có thể bạn cũng có thể tải JavaScript của mình lên thông qua trình chỉnh sửa proxy giao diện người dùng Apigee.

Các tệp nguồn JavaScript phải luôn có đuôi .js.

Xem Phần mềm được hỗ trợ và các phiên bản được hỗ trợ cho phiên bản JavaScript hiện được hỗ trợ.

Video

Xem video ngắn để tìm hiểu cách tạo tiện ích chính sách tuỳ chỉnh bằng JavaScript .

Mẫu

Viết lại URL mục tiêu

Dưới đây là một trường hợp sử dụng phổ biến: trích xuất dữ liệu từ nội dung yêu cầu, lưu trữ dữ liệu đó trong một luồng và sử dụng biến luồng đó ở nơi khác trong luồng proxy. Giả sử bạn có một ứng dụng nơi người dùng nhập tên của mình vào biểu mẫu HTML và gửi biểu mẫu đó. Bạn muốn proxy API trích xuất dữ liệu biểu mẫu rồi tự động thêm dữ liệu đó vào URL dùng để gọi dịch vụ phụ trợ. Cách thức bạn có làm điều này trong chính sách JavsScript không?

Lưu ý: Nếu bạn muốn thử xem ví dụ này, chúng tôi giả định rằng bạn đã tạo một proxy trong trình chỉnh sửa proxy. Khi tạo tài khoản, bạn chỉ cần cung cấp cho URL dịch vụ phụ trợ của: http://www.example.com. Trong ví dụ này, chúng ta sẽ tự động ghi lại URL phụ trợ. Nếu bạn không biết cách tạo proxy mới, hãy tham khảo hướng dẫn bắt đầu. .

  1. Trong giao diện người dùng Edge, hãy mở proxy mà bạn đã tạo trong trình chỉnh sửa proxy.
  2. Chọn thẻ Phát triển.
  3. Trong trình đơn New (Mới), hãy chọn New Script (Tập lệnh mới).
  4. Trong hộp thoại, chọn JavaScript và đặt tên cho tập lệnh, như js-example.
  5. Dán mã sau vào trình soạn thảo mã và lưu proxy. Điều quan trọng cần Lưu ý là đối tượng context. Đối tượng này có sẵn cho mã JavaScript ở bất kỳ đâu trong luồng proxy. Dùng để thu thập các hằng số dành riêng cho luồng, để gọi hàm hữu ích phương thức get/set và các thao tác khác. Phần đối tượng này thuộc về Edge Mô hình đối tượng JavaScript. Xin lưu ý rằng Ngoài ra, biến luồng target.url là biến đọc/ghi được tích hợp sẵn có thể truy cập trong quy trình Yêu cầu mục tiêu. Khi chúng ta đặt biến đó bằng URL API, Edge thực hiện lệnh gọi phụ trợ đến URL đó. Về cơ bản, chúng tôi đã viết lại URL mục tiêu ban đầu, đó là bất kỳ thông tin nào bạn đã chỉ định khi tạo proxy (ví dụ: http://www.example.com).

    if (context.flow=="PROXY_REQ_FLOW") {
         var username = context.getVariable("request.formparam.user");
         context.setVariable("info.username", username);
    }
    
    
    if (context.flow=="TARGET_REQ_FLOW") {
         context.setVariable("request.verb", "GET");
         var name = context.getVariable("info.username");
         var url = "http://mocktarget.apigee.net/"
         context.setVariable("target.url", url + "?user=" + name);
    }
    
  6. Trên trình đơn Chính sách mới, hãy chọn JavaScript.
  7. Đặt tên cho chính sách, chẳng hạn như target-rewrite. Chấp nhận các chế độ mặc định và lưu chính sách.
  8. Nếu chọn Luồng trước điểm cuối proxy trong Trình điều hướng, bạn sẽ thấy chính sách đã được thêm vào quy trình đó.
  9. Trong Trình điều hướng, hãy chọn biểu tượng Target Endpoint PreFlow (Điểm cuối mục tiêu).
  10. Từ Trình điều hướng, hãy kéo chính sách JavaScript vào phía Yêu cầu của Mục tiêu Điểm cuối trong trình chỉnh sửa luồng.
  11. Lưu.
  12. Gọi API như thế này, thay tên tổ chức và tên proxy chính xác của bạn là phù hợp:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

Một điều cuối cùng, hãy xem định nghĩa XML cho chính sách JavaScript được sử dụng trong ví dụ này. Điều quan trọng cần lưu ý là <ResourceURL> được dùng để chỉ định tệp nguồn JavaScript cần thực thi. Mẫu này cũng được sử dụng cho mọi tệp nguồn JavaScript: jsc://filename.js. Nếu bạn đang sử dụng mã JavaScript yêu cầu bao gồm, bạn có thể sử dụng một hoặc nhiều phần tử <IncludeURL> để thực hiện như được mô tả ở phần sau trong tài liệu tham khảo này.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite">
    <DisplayName>target-rewrite</DisplayName>
    <Properties/>
    <ResourceURL>jsc://js-example.js</ResourceURL>
</Javascript>

Truy xuất giá trị thuộc tính từ JavaScript

Bạn có thể thêm phần tử <Property> vào cấu hình, sau đó truy xuất phần tử bằng JavaScript trong thời gian chạy.

Sử dụng thuộc tính name của phần tử để chỉ định tên mà bạn dùng để truy cập vào khỏi mã JavaScript. Giá trị của phần tử <Property> (giá trị giữa thẻ mở và thẻ đóng) là giá trị cố định mà JavaScript.

Trong JavaScript, bạn truy xuất giá trị thuộc tính chính sách bằng cách truy cập giá trị đó dưới dạng một thuộc tính của Properties, như trong phần sau:

  • Định cấu hình thuộc tính. Ở đây, giá trị thuộc tính là tên biến response.status.code.
    <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite">
        <DisplayName>JavascriptURLRewrite</DisplayName>
        <Properties>
            <Property name="source">response.status.code</Property>
        </Properties>
        <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL>
    </Javascript>
    
  • Truy xuất thuộc tính bằng JavaScript. Ở đây, giá trị được truy xuất -- tên biến -- sau đó được hàm getVariable dùng để truy xuất giá trị của biến.
    var responseCode = properties.source; // Returns "response.status.code"
    var value = context.getVariable(responseCode); // Get the value of response.status.code
    context.setVariable("response.header.x-target-response-code", value);
    

Xử lý lỗi

Để xem các ví dụ và nội dung thảo luận về kỹ thuật xử lý lỗi mà bạn có thể sử dụng trong Chú thích JavaScript, hãy xem bài đăng này trong Cộng đồng Apigee. Nội dung đề xuất trong Cộng đồng Apigee là dành cho thông tin và không nhất thiết thể hiện các phương pháp hay nhất do Apigee đề xuất.


Tham chiếu phần tử

Tài liệu tham khảo phần tử mô tả các phần tử và thuộc tính của chính sách JavaScript.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Javascript async="false" 
        continueOnError="false" enabled="true" timeLimit="200" 
        name="JavaScript-1">
    <DisplayName>JavaScript 1</DisplayName>
    <Properties>
        <Property name="propName">propertyValue</Property>
    </Properties>
    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
    <IncludeURL>jsc://a-javascript-library-file</IncludeURL>
    <ResourceURL>jsc://my-javascript-source-file</ResourceURL>
    <Source>insert_js_code_here</Source>

</Javascript>

&lt;Javascript&gt; Thuộc tính

<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">

Sau đây là các thuộc tính dành riêng cho chính sách này.

Thuộc tính Mô tả Mặc định Sự hiện diện
timeLimit

Chỉ định thời gian tối đa (tính bằng mili giây) mà tập lệnh được phép thực thi. Ví dụ: nếu vượt quá giới hạn 200 mili giây, chính sách sẽ gửi lỗi sau: Javascript.policy_name failed with error: Javascript runtime exceeded limit of 200ms.

Lưu ý: Đối với tài khoản dùng thử miễn phí, thời gian thực thi tối đa là 200 mili giây

Không áp dụng Bắt buộc

Bảng sau đây mô tả những thuộc tính chung cho tất cả phần tử mẹ của chính sách:

Thuộc tính Mô tả Mặc định Sự hiện diện
name

Tên nội bộ của chính sách. Giá trị của thuộc tính name có thể chứa chữ cái, số, dấu cách, dấu gạch nối, dấu gạch dưới và dấu chấm. Giá trị này không được vượt quá 255 ký tự.

(Không bắt buộc) Bạn có thể dùng phần tử <DisplayName> để gắn nhãn chính sách trong trình chỉnh sửa proxy giao diện người dùng quản lý bằng tên ngôn ngữ tự nhiên khác.

Không áp dụng Bắt buộc
continueOnError

Đặt thành false để trả về lỗi khi chính sách không thành công. Điều này là dự kiến đối với hầu hết các chính sách.

Đặt thành true để tiếp tục thực thi luồng ngay cả sau khi có chính sách không thành công.

false Không bắt buộc
enabled

Hãy đặt thành true để thực thi chính sách này.

Đặt thành false để tắt chính sách này. Chính sách này sẽ không được thực thi ngay cả khi luồng đó vẫn được liên kết với một luồng.

đúng Không bắt buộc
async

Thuộc tính này không được dùng nữa.

false Không được dùng nữa

&lt;DisplayName&gt; phần tử

Hãy sử dụng cùng với thuộc tính name để gắn nhãn chính sách trong phần trình chỉnh sửa proxy giao diện người dùng quản lý có tên ngôn ngữ tự nhiên khác.

<DisplayName>Policy Display Name</DisplayName>
Mặc định

Không áp dụng

Nếu bạn bỏ qua phần tử này, giá trị của thuộc tính name của chính sách sẽ là đã sử dụng.

Sự hiện diện Không bắt buộc
Loại Chuỗi

&lt;IncludeURL&gt; phần tử

Chỉ định một tệp thư viện JavaScript sẽ được tải dưới dạng phần phụ thuộc vào tệp JavaScript chính được chỉ định bằng phần tử <ResourceURL> hoặc <Source>. Các tập lệnh sẽ được đánh giá trong theo thứ tự liệt kê trong chính sách. Mã của bạn có thể sử dụng các đối tượng, phương thức và các thuộc tính của mô hình đối tượng JavaScript.

Đưa vào nhiều tài nguyên phần phụ thuộc JavaScript cùng với thông tin bổ sung Phần tử <IncludeURL>.

<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
Mặc định: Không có
Sự hiện diện: Không bắt buộc
Loại: Chuỗi

Ví dụ:

Xem Ví dụ cơ bản trong phần Mẫu.

&lt;Property&gt; phần tử

Chỉ định một thuộc tính mà bạn có thể truy cập qua mã JavaScript trong thời gian chạy.

<Properties>
    <Property name="propName">propertyValue</Property>
</Properties>
Mặc định: Không có
Sự hiện diện: Không bắt buộc
Loại: Chuỗi

Thuộc tính

Thuộc tính Mô tả Mặc định Sự hiện diện
tên

Chỉ định tên của thuộc tính.

Không áp dụng Bắt buộc.

Ví dụ:

Xem ví dụ trong phần Mẫu.

&lt;ResourceURL&gt; phần tử

Chỉ định tệp JavaScript chính sẽ thực thi trong luồng API. Bạn có thể lưu trữ tệp này ở phạm vi proxy API (trong /apiproxy/resources/jsc trong gói proxy API hoặc trong phần Script (Tập lệnh) trong ngăn Navigator (Trình điều hướng) của trình chỉnh sửa proxy API) hoặc tại tổ chức hay để sử dụng lại trên nhiều proxy API, như mô tả trong Tệp tài nguyên. Mã của bạn có thể sử dụng các đối tượng, phương thức và thuộc tính của mô hình đối tượng JavaScript.

<ResourceURL>jsc://my-javascript.js</ResourceURL>
Mặc định: Không có
Sự hiện diện: Bạn phải dùng <ResourceURL> hoặc <Source>. Nếu <ResourceURL><Source> đều hiện diện <ResourceURL> sẽ bị bỏ qua.
Loại: Chuỗi

Ví dụ:

Xem Ví dụ cơ bản trong phần Mẫu.

&lt;Source&gt; phần tử

Cho phép bạn chèn JavaScript trực tiếp vào cấu hình XML của chính sách. Đã chèn Mã JavaScript thực thi khi chính sách này thực thi trong luồng API.

Mặc định: Không có
Sự hiện diện: Bạn phải dùng <ResourceURL> hoặc <Source>. Nếu <ResourceURL><Source> đều hiện diện <ResourceURL> sẽ bị bỏ qua.
Loại: Chuỗi

Ví dụ:

<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' >
  <Properties>
    <Property name='inboundHeaderName'>specialheader</Property>
    <Property name='outboundVariableName'>json_stringified</Property>
  </Properties>
  <Source>
var varname = 'request.header.' + properties.inboundHeaderName + '.values.string';
var h = context.getVariable(varname);
if (h) {
  h = JSON.parse(h);
  h.augmented = (new Date()).valueOf();
  var v = JSON.stringify(h, null, 2) + '\n';
  // further indent
  var r = new RegExp('^(\S*)','mg');
  v= v.replace(r,'    $1');
  context.setVariable(properties.outboundVariableName, v);
}
  </Source>
</Javascript>

&lt;SSLInfo&gt; phần tử

Chỉ định các thuộc tính dùng để định cấu hình TLS cho tất cả các phiên bản ứng dụng HTTP do Chính sách JavaScript.

    <SSLInfo>
        <Enabled>trueFalse</Enabled>
        <ClientAuthEnabled>trueFalse</ClientAuthEnabled>
        <KeyStore>ref://keystoreRef</KeyStore>
        <KeyAlias>keyAlias</KeyAlias>
        <TrustStore>ref://truststoreRef</TrustStore>
    </SSLInfo>
Mặc định: Không có
Sự hiện diện: Không bắt buộc
Loại: Chuỗi

Quy trình định cấu hình TLS cho ứng dụng HTTP cũng giống như quy trình mà bạn dùng để định cấu hình TLS cho TargetEndpoint/TargetServer. Xem bài viết Định cấu hình TLS từ Edge vào phần phụ trợ để biết thêm thông tin.

Lưu ý về cách sử dụng

Chính sách JavaScript không chứa mã thực. Thay vào đó, chính sách JavaScript sẽ tham chiếu đến "Tài nguyên" JavaScript và xác định Bước trong luồng API nơi JavaScript thực thi. Bạn có thể tải tập lệnh của bạn lên thông qua trình chỉnh sửa proxy giao diện người dùng quản lý hoặc bạn có thể đưa tập lệnh đó vào Thư mục /resources/jsc trong các proxy API mà bạn phát triển cục bộ.

Gỡ lỗi mã chính sách JavaScript

Sử dụng hàm print() để xuất thông tin gỡ lỗi cho giao dịch trong công cụ Theo dõi. Để biết thông tin chi tiết và ví dụ, hãy xem mục Gỡ lỗi bằng JavaScript print().

Cách xem câu lệnh in trong Theo dõi:

  1. Mở Công cụ theo dõi và bắt đầu phiên theo dõi cho proxy chứa JavaScript của bạn .
  2. Gọi proxy.
  3. Trong Công cụ theo dõi, hãy nhấp vào Đầu ra từ tất cả giao dịch để mở kết quả bảng điều khiển.

  4. Bảng sao kê in của bạn sẽ xuất hiện trong bảng điều khiển này.

Bạn có thể sử dụng hàm print() để xuất thông tin gỡ lỗi cho Công cụ theo dõi. Chức năng này có thể dùng trực tiếp thông qua mô hình đối tượng JavaScript. Để biết thông tin chi tiết, hãy xem phần "Gỡ lỗi JavaScript bằng print() tuyên bố".

Biến luồng

Theo mặc định, chính sách này không điền sẵn bất kỳ biến nào; tuy nhiên, bạn có thể thiết lập (và nhận) luồng các biến trong mã JavaScript của bạn bằng cách gọi các phương thức trên đối tượng ngữ cảnh. Mẫu thông thường sẽ có dạng như sau:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))

Đối tượng ngữ cảnh là một phần của mô hình đối tượng JavaScript của Apigee Edge.

Tham chiếu lỗi

Phần này mô tả các mã lỗi và thông báo lỗi được trả về cũng như các biến lỗi do Edge đặt khi chính sách này kích hoạt lỗi. Đây là thông tin quan trọng bạn cần biết nếu bạn đang phát triển các quy tắc lỗi để xử lý lỗi. Để tìm hiểu thêm, hãy xem bài viết Những điều bạn cần biết về lỗi chính sáchXử lý lỗi.

Lỗi thời gian chạy

Những lỗi này có thể xảy ra khi chính sách này thực thi.

Mã lỗi Trạng thái HTTP Nguyên nhân Khắc phục
steps.javascript.ScriptExecutionFailed 500 Chính sách JavaScript có thể gửi nhiều loại lỗi ScriptExecutionFailed. Thường gặp các loại lỗi mà bạn gặp phải bao gồm RangeError, ReferenceError, SyntaxError, TypeErrorURIError.
steps.javascript.ScriptExecutionFailedLineNumber 500 Đã xảy ra lỗi trong mã JavaScript. Hãy xem chuỗi lỗi để biết thông tin chi tiết. Không áp dụng
steps.javascript.ScriptSecurityError 500 Đã xảy ra lỗi bảo mật khi thực thi JavaScript. Xem chuỗi lỗi cho chi tiết. Không áp dụng

Lỗi triển khai

Những lỗi này có thể xảy ra khi bạn triển khai proxy có chứa chính sách này.

Tên lỗi Nguyên nhân Khắc phục
InvalidResourceUrlFormat Nếu định dạng của URL tài nguyên được chỉ định trong phần tử <ResourceURL> hoặc <IncludeURL> của chính sách JavaScript là không hợp lệ, thì bạn sẽ không triển khai proxy API được.
InvalidResourceUrlReference Nếu phần tử <ResourceURL> hoặc <IncludeURL> tham chiếu đến tệp JavaScript không tồn tại thì việc triển khai proxy API không thành công. Tệp nguồn được tham chiếu phải tồn tại proxy API, môi trường hoặc cấp tổ chức.
WrongResourceType Lỗi này xảy ra trong quá trình triển khai nếu <ResourceURL> hoặc <IncludeURL> các phần tử của chính sách JavaScript tham chiếu đến bất kỳ loại tài nguyên nào khác ngoài jsc (tệp JavaScript).
NoResourceURLOrSource Bạn có thể không triển khai được chính sách JavaScript kèm theo lỗi này nếu <ResourceURL> không được khai báo hoặc nếu URL tài nguyên không được xác định trong phần tử này. Phần tử <ResourceURL> là một phần tử bắt buộc. Hoặc khai báo Phần tử <IncludeURL> nhưng URL tài nguyên không được xác định trong phần tử này. Phần tử <IncludeURL> là không bắt buộc nhưng nếu được khai báo thì bạn phải chỉ định URL tài nguyên trong phần tử <IncludeURL>.

Biến lỗi

Các biến này được đặt khi chính sách này kích hoạt lỗi trong thời gian chạy. Để biết thêm thông tin, xem phần Bạn cần biết về các lỗi chính sách.

Biến Trong đó Ví dụ:
fault.name="fault_name" fault_name là tên của lỗi, như được liệt kê trong bảng Lỗi thời gian chạy ở trên. Tên lỗi là phần cuối cùng của mã lỗi. fault.name Matches "ScriptExecutionFailed"
javascript.policy_name.failed policy_name là tên do người dùng chỉ định của chính sách gây ra lỗi. javascript.JavaScript-1.failed = true

Ví dụ về phản hồi khi gặp lỗi

{
  "fault": {
    "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"",
    "detail": {
      "errorcode": "steps.javascript.ScriptExecutionFailed"
    }
  }
}

Ví dụ về quy tắc lỗi

<FaultRule name="JavaScript Policy Faults">
    <Step>
        <Name>AM-CustomErrorResponse</Name>
        <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition>
    </Step>
    <Condition>(javascript.JavaScript-1.failed = true) </Condition>
</FaultRule>

Lược đồ

Mỗi loại chính sách được xác định bằng một giản đồ XML (.xsd). Giản đồ chính sách để tham khảo đều có trên GitHub.

Chủ đề có liên quan

Bài viết trên thẻ 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 Apigee Cộng đồng: