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 luồng proxy API. 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 lấy, đặt và xoá các biến trong ngữ cảnh luồng proxy. Bạn cũng có thể sử dụng các hàm mã hoá cơ bản được cung cấp kèm theo 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à đặt các biến luồng, 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 linh động URL đích phụ trợ và làm nhiều việc 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 giống như được triển khai bởi các chính sách khác, như AttributionMessage và ExtractVariable.

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 là ghi nhật ký. Chính sách Ghi nhật ký thông báo phù hợp hơn nhiều để 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, đồng thời giúp 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ý thông báo trong PostClientFlow. Chính sách này thực thi sau khi phản hồi được gửi lại cho ứng dụng khách.

Chính sách JavaScript cho phép bạn chỉ định một 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 phần tử <Source>. Dù theo cách nào thì mã JavaScript cũng sẽ thực thi khi bước đính kèm chính sách được thực thi. Đối với tuỳ chọn tệp nguồn, mã nguồn luôn được lưu trữ ở một vị trí tiêu 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. Để được hướng dẫn, hãy xem phần Tệp tài nguyên. Bạn cũng có thể tải JavaScript 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ó phần mở rộng .js.

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

Video

Hãy xem video ngắn để tìm hiểu cách tạo phần mở rộng về chính sách tuỳ chỉnh bằng chính sách 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 biến 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 trong đó người dùng nhập tên của họ vào biểu mẫu HTML và gửi ứng dụng đó. Bạn muốn proxy API trích xuất dữ liệu biểu mẫu và tự động thêm dữ liệu đó vào URL dùng để gọi dịch vụ phụ trợ. Bạn sẽ thực hiện việc này như thế nào trong chính sách JavsScript?

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

  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, hãy chọn JavaScript và đặt tên cho tập lệnh, chẳng hạn 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 chú ý là đối tượng context. Đối tượng này có sẵn cho mã JavaScript ở bất kỳ vị trí nào trong luồng proxy. Hàm này được dùng để nhận các hằng số cụ thể theo luồng, để gọi các phương thức get/set hữu ích và cho nhiều thao tác khác. Phần đối tượng này thuộc mô hình đối tượng JavaScript của Edge. Ngoài ra, xin lưu ý rằng biến luồng target.url là biến tích hợp, đọc/ghi có thể truy cập được trong quy trình Yêu cầu mục tiêu. Khi chúng ta đặt biến đó bằng URL API, Edge sẽ 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. Đây là URL mà 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. Trong 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 giá trị mặc định và lưu chính sách.
  8. Nếu chọn Quy trình trước điểm cuối proxy trong Trình điều hướng, bạn sẽ thấy chính sách này đã đượ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 PreFlow).
  10. Trên 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 Điểm cuối mục tiêu trong trình chỉnh sửa quy trình.
  11. Lưu.
  12. Hãy gọi API như sau, thay thế tên tổ chức và tên proxy chính xác của bạn nếu thích hợp:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example

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à phần tử <ResourceURL> được dùng để chỉ định tệp nguồn JavaScript cần thực thi. Mẫu này cũng được dùng cho mọi tệp nguồn JavaScript: jsc://filename.js. Nếu cần mã JavaScript, bạn có thể sử dụng một hoặc nhiều phần tử <IncludeURL> để thực hiện việc đó, như mô tả ở phần sau của 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 một phần tử <Property> vào cấu hình, sau đó truy xuất giá trị của 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 truy cập vào thuộc tính trong mã JavaScript. Giá trị của phần tử <Property> (giá trị giữa các thẻ mở và đóng) là giá trị cố định mà JavaScript sẽ nhận được.

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 đối tượng Properties, như sau:

  • Định cấu hình tài sản. Ở đâ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) sẽ được hàm getVariable sử 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 ví dụ và nội dung thảo luận về các 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. Các đề xuất trong Cộng đồng Apigee chỉ nhằm cung cấp thông tin và không nhất thiết đại diện cho các phương pháp hay nhất mà Apigee đề xuất.


Tham chiếu phần tử

Tham chiếu 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>

Thuộc tính <Javascript>

<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 Nội dung 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ẽ hiển thị 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 giới hạn là 200 mili giây.

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

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

Thuộc tính Nội dung 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ự.

Nếu muốn, bạn có thể sử dụng phần tử <DisplayName> để gắn nhãn cho chính sách này 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 một chính sách không hoạt động. Đây là hành vi dự kiến đối với hầu hết các chính sách.

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

false Không bắt buộc
enabled

Đặt thành true để thực thi chính sách.

Đặ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 chính sách vẫn được đính kèm vào một quy trình.

đú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

Phần tử <DisplayName>

Sử dụng cùng với thuộc tính name để gắn nhãn cho 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 khác theo ngôn ngữ tự nhiên.

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

Không áp dụng

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

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

Phần tử <IncludeURL>

Chỉ định một tệp thư viện JavaScript cần được tải dưới dạng phần phụ thuộc cho 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á theo thứ tự được nêu 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à thuộc tính của mô hình đối tượng JavaScript.

Cung cấp nhiều tài nguyên phần phụ thuộc JavaScript với các phần tử <IncludeURL> bổ sung.

<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.

Phần tử <Property>

Chỉ định một thuộc tính mà bạn có thể truy cập từ 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 Nội dung 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.

Phần tử <ResourceURL>

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 mục Tập lệnh của ngăn Trình điều hướng của trình điều hướng API) hoặc tại phạm vi tổ chức hoặc môi trường để sử dụng lại trên nhiều proxy API, như mô tả trong phần 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 nhập <ResourceURL> hoặc <Source>. Nếu <ResourceURL><Source> đều xuất hiện, thì <ResourceURL> sẽ bị bỏ qua.
Loại: Chuỗi

Ví dụ:

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

Phần tử <Source>

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. Mã JavaScript được chèn sẽ 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 nhập <ResourceURL> hoặc <Source>. Nếu <ResourceURL><Source> đều xuất hiện, thì <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>

Phần tử <SSLInfo>

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 được tạo theo 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 bạn sử dụng để định cấu hình TLS cho một TargetEndpoint/TargetServer. Hãy xem bài viết Định cấu hình TLS từ Edge đến 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 một "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 lên thông qua trình chỉnh sửa proxy giao diện người dùng quản lý hoặc đưa tập lệnh này 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 sang bảng điều khiển đầu ra của giao dịch trong Công cụ theo dõi. Để biết thông tin chi tiết và ví dụ, hãy xem phần Gỡ lỗi bằng câu lệnh print() JavaScript.

Cách xem các câu lệnh in trong Trace:

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

  4. Báo cáo 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 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. Để biết thông tin chi tiết, hãy xem phần "Gỡ lỗi JavaScript bằng câu lệnh print()".

Biến luồng

Theo mặc định, chính sách này không điền bất kỳ biến nào. Tuy nhiên, bạn có thể đặt (và nhận) các biến luồng trong mã JavaScript 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 thuộc 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. Bạn cần nắm được thông tin này nếu đ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 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 thực thi chính sách.

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. Các loại lỗi thường gặp 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. Hãy xem chuỗi lỗi để biết thông tin 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 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 không hợp lệ, thì proxy API sẽ không triển khai được.
InvalidResourceUrlReference Nếu các phần tử <ResourceURL> hoặc <IncludeURL> tham chiếu đến một tệp JavaScript không tồn tại, thì nghĩa là không triển khai được proxy API. Tệp nguồn được tham chiếu phải tồn tại ở cấp độ proxy API, môi trường hoặc tổ chức.
WrongResourceType Lỗi này xảy ra trong quá trình triển khai nếu các phần tử <ResourceURL> hoặc <IncludeURL> 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 Lỗi này có thể sẽ khiến quá trình triển khai chính sách JavaScript không thành công nếu phần tử <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à phần tử bắt buộc. Hoặc Phần tử <IncludeURL> được khai báo 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ì 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, hãy xem bài viết Những điều bạn cần biết về 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ư 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 của chính sách báo lỗi do người dùng chỉ định. javascript.JavaScript-1.failed = true

Ví dụ về phản hồi 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 có sẵn trên GitHub để bạn tham khảo.

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: