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. .
- 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.
- Chọn thẻ Phát triển.
- Trong trình đơn New (Mới), hãy chọn New Script (Tập lệnh mới).
- Trong hộp thoại, chọn JavaScript và đặt tên cho tập lệnh, như
js-example
. - 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ồngtarget.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); }
- Trên trình đơn Chính sách mới, hãy chọn JavaScript.
- Đặ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. - 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 đó.
- 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).
- 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.
- Lưu.
- 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>
<Javascript> 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:
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 (Không bắt buộc) Bạn có thể dùng phần tử |
Không áp dụng | Bắt buộc |
continueOnError |
Đặt thành Đặt thành |
false | Không bắt buộc |
enabled |
Hãy đặt thành Đặt thà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 |
<DisplayName> 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 |
---|---|
Sự hiện diện | Không bắt buộc |
Loại | Chuỗi |
<IncludeURL> 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.
<Property> 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.
<ResourceURL> 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> và <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.
<Source> 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> và <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>
<SSLInfo> 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:
- 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 .
- Gọi proxy.
- 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.
- 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ách và Xử 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, TypeError và URIError. | build |
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. |
build |
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. |
build |
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). |
build |
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> . |
build |
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
- Mô hình đối tượng JavaScript
- Để biết hướng dẫn, mẫu chính sách và mẫu JavaScript, hãy xem phần API Programming proxy với JavaScript.
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: