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ề cách sử dụng mẫu thông báo trong các proxy API và cung cấp thông tin tham khảo về hàm.
Mẫu tin nhắn là gì?
Mẫu thông báo cho phép bạn thực hiện thay thế chuỗi biến trong một số chính sách và phần tử TargetEndpoint. Tính năng này (nếu được hỗ trợ) cho phép bạn điền chuỗi một cách linh hoạt khi một proxy thực thi.
Bạn có thể kết hợp bất kỳ tổ hợp nào giữa các tham chiếu biến luồng và văn bản cố định trong một mẫu tin nhắn. Tên biến luồng phải được đặt trong dấu ngoặc nhọn, trong khi mọi văn bản không nằm trong dấu ngoặc nhọn sẽ được xuất dưới dạng văn bản nguyên trạng.
Xem thêm phần Bạn có thể sử dụng mẫu tin nhắn ở đâu?
Ví dụ
Ví dụ: chính sách Assign Message (Chỉ định thông báo) cho phép bạn sử dụng một mẫu thông báo trong phần tử <Payload>:
<AssignMessage name="set-dynamic-content"> <AssignTo createNew="false" type="response"></AssignTo> <Set> <Payload contentType="application/json"> {"name":"Alert", "message":"You entered an invalid username: {user.name}"} </Payload> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
Trong ví dụ trên, giá trị của biến luồng user.name (trong dấu ngoặc nhọn) sẽ được đánh giá và thay thế vào chuỗi tải trọng trong thời gian chạy. Ví dụ: nếu user.name=jdoe, thì thông báo đầu ra thu được trong tải trọng sẽ là: You entered an invalid username: jdoe.
Nếu không thể phân giải biến, thì một chuỗi trống sẽ được xuất ra.
Ví dụ
Khi vượt quá hạn mức, bạn nên trả về một thông báo có ý nghĩa cho phương thức gọi. Mẫu này thường được dùng với "quy tắc lỗi" để cung cấp đầu ra nhằm cung cấp cho phương thức gọi thông tin về lỗi vi phạm hạn mức. Trong chính sách Chỉ định thông báo sau đây, các mẫu thông báo được dùng để điền thông tin về hạn mức một cách linh động trong một số phần tử XML:
<AssignMessage name='AM-QuotaViolationMessage'> <Description>message for quota exceeded</Description> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <Set> <Headers> <Header name='X-Quota-Reset'>{ratelimit.Quota-1.expiry.time}</Header> <Header name='X-Quota-Allowed'>{ratelimit.Quota-1.allowed.count}</Header> <Header name='X-Quota-Available'>{ratelimit.Quota-1.available.count}</Header> </Headers> <Payload contentType='application/json'>{ "error" : { "message" : "you have exceeded your quota", "clientId" : "{request.queryparam.apikey}" } } </Payload> <StatusCode>429</StatusCode> <ReasonPhrase>Quota Exceeded</ReasonPhrase> </Set> </AssignMessage>
Trong chính sách AssignMessage, các phần tử sau đây trong phần tử <Set> hỗ trợ việc tạo mẫu thông báo:
- Tiêu đề
- QueryParam
- FormParam
- PayLoad
- Phiên bản
- Động từ
- Đường dẫn
- StatusCode
- ReasonPhrase
Xin lưu ý rằng các biến trong luồng của mẫu tin nhắn phải được đặt trong dấu ngoặc nhọn.
Khi chính sách này thực thi:
- Các phần tử Tiêu đề nhận được giá trị của các biến luồng được chỉ định.
- Tải trọng bao gồm cả văn bản và các biến theo nghĩa đen (
client_idđược điền một cách linh động). - StatusCode và ReasonPhrase chỉ bao gồm văn bản theo nghĩa đen; tuy nhiên, các phần tử này cũng hỗ trợ việc tạo mẫu thông báo nếu bạn muốn sử dụng.
Ví dụ
Trong định nghĩa TargetEndpoint của proxy, các phần tử con của <SSLInfo> hỗ trợ việc tạo mẫu thông báo. Theo cùng một mẫu được dùng trong các chính sách, các biến luồng trong dấu ngoặc nhọn sẽ được thay thế khi proxy thực thi.
<TargetEndpoint name="default"> … <HTTPTargetConnection> <SSLInfo> <Enabled>{myvars.ssl.enabled}</Enabled> <ClientAuthEnabled>{myvars.ssl.client.auth.enabled}</ClientAuthEnabled> <KeyStore>{myvars.ssl.keystore}</KeyStore> <KeyAlias>{myvars.ssl.keyAlias}</KeyAlias> <TrustStore>{myvars.ssl.trustStore}</TrustStore> </SSLInfo> </HTTPTargetConnection> … </TargetEndpoint>
Bạn có thể sử dụng mẫu tin nhắn ở đâu?
Mẫu thông báo được hỗ trợ trong một số chính sách cũng như một số phần tử được dùng trong cấu hình TargetEndpoint.
Các chính sách chấp nhận mẫu tin nhắn
| Policy | Các phần tử và phần tử con hỗ trợ mẫu tin nhắn |
|---|---|
| Chính sách AccessControl | <SourceAddress> cho thuộc tính mask và địa chỉ IP. |
| Chính sách AssignMessage | <Set> phần tử con: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams
Phần tử con |
| Chính sách ExtensionCallout |
<Input> |
| Chính sách ExtractVariables | <JsonPath>
|
| Chính sách GenerateJWS Chính sách VerifyJWS |
<Payload> (Chỉ GenerateJWS policy)
* Các phần tử này chỉ hỗ trợ mẫu tin nhắn khi type=map. |
| Chính sách GenerateJWT Chính sách VerifyJWT |
<AdditionalClaims><Claim>
* Các phần tử này chỉ hỗ trợ mẫu tin nhắn khi type=map. |
| Chính sách về LDAP | <SearchQuery> |
| Chính sách MessageLogging | <Syslog><Message>
|
| Chính sách OASValidation | Phần tử
|
| Chính sách RaiseFault | <Set>các phần tử: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams
|
| Chính sách SAMLAssertion | <Template>
* Chỉ khi chữ ký chính sách là |
| Chính sách về chú thích dịch vụ | Các phần tử <Set>: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, /Headers, QueryParams, FormParams
|
Các phần tử TargetEndpoint chấp nhận mẫu thông báo
| Các phần tử HTTPTargetConnection | Các phần tử con hỗ trợ mẫu tin nhắn |
|---|---|
| SSLInfo | Đã bật, KeyAlias, KeyStore, TrustStore, ClientAuthEnabled, CLRStore |
| LocalTargetConnection | ApiProxy, ProxyEndpoint |
| Đường dẫn | Khi sử dụng phần tử LoadBalancer, phần tử Path sẽ hoạt động và chấp nhận một mẫu thông báo. |
Cú pháp mẫu tin nhắn
Phần này giải thích các quy tắc mà bạn phải tuân thủ để sử dụng mẫu tin nhắn.
Dùng dấu ngoặc nhọn để biểu thị các biến
Đặt tên biến trong dấu ngoặc nhọn { }. Nếu biến không tồn tại, một chuỗi trống sẽ được trả về trong đầu ra; tuy nhiên, bạn có thể chỉ định các giá trị mặc định trong mẫu thông báo (các giá trị được thay thế nếu biến không được phân giải). Xem phần Đặt giá trị mặc định trong mẫu tin nhắn.
Xin lưu ý rằng bạn có thể đặt toàn bộ chuỗi mẫu thông báo trong dấu ngoặc kép, nhưng không bắt buộc. Ví dụ: hai mẫu tin nhắn sau đây là tương đương:
<Set>
<Headers>
<Header name="x-h1">"Hello {user.name}"</Header>
<Header name="x-h1">Hello {user.name}</Header>
</Headers>
</Set>Đặt giá trị mặc định trong mẫu tin nhắn
Nếu không phân giải được một biến dựa trên mẫu, Edge sẽ thay thế bằng một chuỗi trống. Tuy nhiên, bạn có thể chỉ định một giá trị mặc định như sau:
<Header name="x-h1">Test message. id = {request.header.id:Unknown}</Header>Trong mẫu ở trên, nếu không thể phân giải biến request.header.id thì giá trị của biến đó sẽ được thay thế bằng Unknown. Ví dụ:
Test message. id = Unknown
Không được dùng dấu cách trong biểu thức hàm
Không được phép sử dụng dấu cách ở bất kỳ vị trí nào trong biểu thức hàm mẫu tin nhắn. Ví dụ:
Cho phép:
{substring(alpha,0,4)}
{createUuid()}
{randomLong(10)}Không được phép:
{substring( alpha, 0, 4 )}
{ createUuid( ) }
{randomLong( 10 )}Cú pháp cũ cho gói dữ liệu JSON
Trong các phiên bản Edge trước bản phát hành Cloud 16.08.17, bạn không thể dùng dấu ngoặc nhọn để biểu thị các tham chiếu biến trong tải trọng JSON. Trong các phiên bản cũ đó, bạn cần sử dụng các thuộc tính variablePrefix và variableSuffix để chỉ định các ký tự phân cách, đồng thời sử dụng các ký tự đó để bao bọc tên biến, như sau:
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set>
Mặc dù Apigee khuyên bạn nên sử dụng cú pháp dấu ngoặc nhọn mới hơn, nhưng cú pháp cũ vẫn hoạt động.
Sử dụng các hàm mẫu tin nhắn
Edge cung cấp một tập hợp các hàm mà bạn có thể sử dụng trong mẫu thông báo để thoát, mã hoá, băm và định dạng các biến chuỗi.
Các hàm mẫu thông báo được mô tả chi tiết trong Tài liệu tham khảo về hàm mẫu thông báo.
Ví dụ: toLowerCase()
Dùng hàm toLowerCase() tích hợp để chuyển đổi một biến chuỗi thành chữ thường:
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Test header: {toLowerCase(foo.bar:FOO)}</Header> </Headers> </Set> </AssignMessage>
Nếu biến foo.bar trong luồng được phân giải, thì các ký tự của biến đó sẽ đều là chữ thường.
Nếu foo.bar chưa được phân giải, thì giá trị mặc định FOO sẽ được thay thế và chuyển đổi thành các ký tự viết thường. Ví dụ:
Test header: foo
Ví dụ: escapeJSON()
Sau đây là một trường hợp sử dụng thú vị: Giả sử ứng dụng phụ trợ của bạn trả về một phản hồi JSON chứa các ký tự thoát hợp lệ. Ví dụ:
{
"code": "INVALID",
"user_message": "Invalid value for \"logonId\" check your input."
}Sau đó, giả sử bạn muốn trả lại thông báo này cho người gọi ứng dụng trong một tải trọng tuỳ chỉnh. Cách thông thường để thực hiện việc này là trích xuất thông báo từ tải trọng phản hồi mục tiêu và sử dụng Assign Message để thêm thông báo đó vào một phản hồi proxy tuỳ chỉnh (tức là gửi lại cho máy khách).
Sau đây là chính sách Trích xuất biến giúp trích xuất thông tin user_message vào một biến có tên là standard.systemMessage:
<ExtractVariables name="EV-BackendErrorResponse"> <DisplayName>EV-BackendErrorResponse</DisplayName> <JSONPayload> <Variable name="standard.systemMessage"> <JSONPath>$.user_message</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
Sau đây là một chính sách Assign Message hoàn toàn hợp lệ, giúp thêm biến đã trích xuất vào tải trọng phản hồi (phản hồi của proxy):
<AssignMessage name="AM-SetStandardFaultResponse"> <DisplayName>AM-SetStandardFaultResponse</DisplayName> <Set> <Payload contentType="application/json"> { "systemMessage": "{standard.systemMessage}" } </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Rất tiếc, đã xảy ra sự cố. Chính sách Trích xuất biến đã xoá các ký tự dấu ngoặc kép thoát xung quanh một phần của thông báo. Điều này có nghĩa là phản hồi được trả về cho ứng dụng khách là JSON không hợp lệ. Rõ ràng đây không phải là điều bạn muốn!
{
"systemMessage": "Invalid value for "logonId" check your input."
}
Để giải quyết vấn đề này, bạn có thể sửa đổi chính sách Chỉ định thông báo để sử dụng một hàm mẫu thông báo giúp bạn thoát dấu ngoặc kép trong JSON. Hàm này, escapeJSON(), sẽ thoát mọi dấu ngoặc kép hoặc ký tự đặc biệt khác xuất hiện trong biểu thức JSON:
<AssignMessage name="AM-SetStandardFaultResponse"> <DisplayName>AM-SetStandardFaultResponse</DisplayName> <Set> <Payload contentType="application/json"> { "systemMessage": "{escapeJSON(standard.systemMessage)}" } </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Hàm này sẽ thoát các dấu ngoặc kép được nhúng, dẫn đến JSON hợp lệ, đúng như bạn muốn:
{
"systemMessage": "Invalid value for \"logonId\" check your input.",
}Mẫu thông báo là một tính năng thay thế chuỗi động mà bạn có thể sử dụng trong một số chính sách và trong các định nghĩa TargetEndpoint. Hàm mẫu tin nhắn cho phép bạn thực hiện các thao tác hữu ích như băm, thao tác chuỗi, thoát ký tự và các thao tác khác trong mẫu tin nhắn.
Ví dụ: trong chính sách AssignMessage sau đây, hàm toLowerCase() được dùng trong một mẫu thông báo:
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Test header: {Hello, toLowerCase(user.name)}</Header> </Headers> </Set> </AssignMessage>
Chủ đề này mô tả các hàm mẫu tin nhắn, đối số và đầu ra của các hàm đó. Chủ đề này giả định rằng bạn đã quen thuộc với mẫu tin nhắn và các ngữ cảnh mà mẫu tin nhắn được sử dụng.
Hàm băm
Tính toán giá trị băm và trả về biểu thị chuỗi của giá trị băm đó.
Hàm băm thập lục phân
Tính toán giá trị băm và trả về chuỗi biểu thị giá trị băm đó dưới dạng số thập lục phân.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
md5Hex(string)
|
Tính toán giá trị băm MD5 được biểu thị dưới dạng số thập lục phân. |
sha1Hex(string)
|
Tính toán hàm băm SHA1 được biểu thị dưới dạng số thập lục phân. |
sha256Hex(string)
|
Tính toán hàm băm SHA256 dưới dạng số thập lục phân. |
sha384Hex(string)
|
Tính toán hàm băm SHA384 được biểu thị dưới dạng số thập lục phân. |
sha512Hex(string)
|
Tính toán hàm băm SHA512 được biểu thị dưới dạng số thập lục phân. |
Đối số
string – Các hàm băm nhận một đối số chuỗi duy nhất mà thuật toán băm được tính toán dựa trên đó. Đối số có thể là một chuỗi giá trị cố định hoặc một biến luồng chuỗi.
Ví dụ
Lệnh gọi hàm:
sha256Hex('abc')Kết quả:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Lệnh gọi hàm:
var str = 'abc'; sha256Hex(str)
Kết quả:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Hàm băm Base64
Tính toán giá trị băm và trả về chuỗi đại diện của giá trị băm đó dưới dạng giá trị được mã hoá bằng Base64.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
md5Base64(string)
|
Tính toán hàm băm MD5 được biểu thị dưới dạng giá trị được mã hoá Base64. |
sha1Base64(string)
|
Tính toán hàm băm SHA1 được biểu thị dưới dạng giá trị được mã hoá Base64. |
sha256Base64(string)
|
Tính toán hàm băm SHA256 được biểu thị dưới dạng giá trị được mã hoá Base64. |
sha384Base64(string)
|
Tính toán hàm băm SHA384 được biểu thị dưới dạng giá trị được mã hoá Base64. |
sha512Base64(string)
|
Tính toán hàm băm SHA512 được biểu thị dưới dạng giá trị được mã hoá Base64. |
Đối số
string – Các hàm băm nhận một đối số chuỗi duy nhất mà thuật toán băm được tính toán dựa trên đó. Đối số có thể là một chuỗi chữ hoặc một biến luồng chuỗi.
Ví dụ
Lệnh gọi hàm:
sha256Base64('abc')Kết quả:
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
Lệnh gọi hàm:
var str = 'abc'; sha256Base64(str)
Kết quả:
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
Hàm chuỗi
Thực hiện các thao tác trên chuỗi trong mẫu tin nhắn.
Hàm mã hoá Base64
Mã hoá và giải mã các chuỗi bằng cách sử dụng lược đồ mã hoá Base64.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
encodeBase64(string)
|
Mã hoá một chuỗi bằng phương thức mã hoá Base64. Ví dụ: encodeBase64(value), khi value giữ abc, hàm sẽ trả về chuỗi: YWJj
|
decodeBase64(string)
|
Giải mã một chuỗi được mã hoá Base64. Ví dụ: decodeBase64(value) khi value chứa aGVsbG8sIHdvcmxk, hàm sẽ trả về chuỗi hello, world.
|
Đối số
chuỗi – Chuỗi cần mã hoá hoặc giải mã. Có thể là một chuỗi ký tự hoặc một biến luồng chuỗi.
Ví dụ
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Hello, {decodeBase64('d29ybGQK')}</Header> </Headers> </Set> </AssignMessage>
Các hàm chuyển đổi chữ hoa chữ thường
Chuyển đổi một chuỗi thành tất cả chữ hoa hoặc tất cả chữ thường.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
toUpperCase(string)
|
Chuyển đổi một chuỗi thành chữ hoa. |
toLowerCase(string)
|
Chuyển đổi một chuỗi thành chữ thường. |
Đối số
chuỗi – Chuỗi cần chuyển đổi. Có thể là một chuỗi ký tự hoặc một biến luồng chuỗi.
Ví dụ
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Hello, {toLowerCase(user.name)}</Header> </Headers> </Set> </AssignMessage>
Hàm chuỗi con
Trả về các ký tự giữa chỉ mục bắt đầu và chỉ mục kết thúc của chuỗi được chỉ định.
Cú pháp
substring(str,start_index,end_index)
Đối số
- str – Một chuỗi chữ hoặc biến luồng chuỗi.
- start_index – Chỉ mục bắt đầu trong chuỗi.
- end_index – (Không bắt buộc) Chỉ mục kết thúc của chuỗi. Nếu không được cung cấp, chỉ mục kết thúc sẽ là cuối chuỗi.
Ví dụ
Đối với các ví dụ sau, giả sử có các biến luồng sau:
| Tên biến | Giá trị |
|---|---|
alpha
|
ABCDEFGHIJKLMNOPQRSTUVWXYZ |
seven
|
7 |
Sau đây là kết quả của các lệnh gọi hàm sử dụng những biến này:
| Biểu thức mẫu thông báo | Kết quả |
|---|---|
{substring(alpha,22)}
|
WXYZ
|
hello {substring(alpha,22)}
|
hello WXYZ
|
{substring(alpha,-4)}
|
WXYZ
|
{substring(alpha,-8,-4)}
|
STUV
|
{substring(alpha,0,10)}
|
ABCDEFGHIJ
|
{substring(alpha,0,seven)}
|
ABCDEFG
|
Hàm Thay thế tất cả
Áp dụng một biểu thức chính quy cho một chuỗi và đối với mọi kết quả trùng khớp, hãy thay thế kết quả trùng khớp đó bằng một giá trị thay thế.
Cú pháp
replaceAll(string,regex,value)
Đối số
- chuỗi – Một chuỗi ký tự hoặc biến luồng chuỗi để thực hiện các thao tác thay thế.
- regex – Một biểu thức chính quy.
- value – Giá trị dùng để thay thế tất cả các giá trị khớp với biểu thức chính quy trong chuỗi.
Ví dụ
Đối với các ví dụ sau, giả sử có các biến luồng sau:
| Tên biến | Giá trị |
|---|---|
header
|
Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
regex1
|
"^Bearer "
|
replacement
|
"TOKEN: "
|
Sau đây là kết quả của các lệnh gọi hàm sử dụng những biến này:
| Biểu thức mẫu thông báo | Kết quả |
|---|---|
{replaceAll(header,"9993",'')}
|
Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-
|
{replaceAll(header,regex1,'')}
|
ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
{replaceAll(header,regex1,replacement)}
|
TOKEN: ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
Hàm Replace First
Chỉ thay thế lần xuất hiện đầu tiên của giá trị trùng khớp với biểu thức chính quy đã chỉ định trong chuỗi.
Cú pháp
replaceFirst(string,regex,value)
Đối số
- chuỗi – Một chuỗi ký tự hoặc biến luồng chuỗi để thực hiện các thao tác thay thế.
- regex – Một biểu thức chính quy.
- giá_trị – Giá trị dùng để thay thế các giá trị khớp với biểu thức chính quy trong chuỗi.
Hàm mã hoá và thoát ký tự
Các hàm loại bỏ hoặc mã hoá ký tự đặc biệt trong một chuỗi.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
| escapeJSON(string) | Dấu gạch chéo ngược thoát dấu ngoặc kép. |
| escapeXML(string) | Thay thế dấu ngoặc nhọn, dấu nháy đơn, dấu nháy kép và dấu và bằng các thực thể XML tương ứng. Sử dụng cho tài liệu XML 1.0.
|
| escapeXML11(chuỗi) | Hoạt động giống như escapeXML, nhưng dành cho các thực thể XML phiên bản 1.1. Xem phần Ghi chú về việc sử dụng bên dưới. |
| encodeHTML(chuỗi) | Mã hoá dấu nháy đơn, dấu ngoặc nhọn và ký hiệu và. |
Đối số
chuỗi – Chuỗi cần thoát. Có thể là một chuỗi ký tự hoặc một biến luồng chuỗi.
Lưu ý về cách sử dụng
XML 1.1 có thể biểu thị một số ký tự điều khiển, nhưng không thể biểu thị byte rỗng hoặc các điểm mã thay thế Unicode không ghép nối, ngay cả sau khi thoát. Hàm escapeXML11() sẽ xoá những ký tự không nằm trong các dải sau:
[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Hàm escapeXML11() thoát các ký tự trong các dải sau:
[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
Ví dụ
Giả sử có một biến luồng có tên là food với giá trị sau: "bread" & "butter". Sau đó, hàm:
{escapeHTML(food)}dẫn đến:
"bread" & "butter"
Hàm định dạng thời gian
Trả về một chuỗi đại diện cho thời gian, được định dạng theo múi giờ địa phương hoặc theo giờ UTC.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
timeFormat(format,str)
|
Trả về ngày được định dạng theo múi giờ địa phương. |
timeFormatMs(format,str)
|
Trả về ngày được định dạng theo múi giờ địa phương. |
timeFormatUTC(format,str)
|
Trả về ngày được định dạng theo giờ UTC. |
timeFormatUTCMs(format,str)
|
Trả về ngày được định dạng theo giờ UTC. |
Đối số
- định dạng – Chuỗi định dạng ngày/giờ. Có thể là một chuỗi ký tự hoặc một biến chuỗi.
- str – Một biến chuỗi hoặc biến luồng chuỗi chứa giá trị thời gian. Giá trị có thể tính bằng giây kể từ thời gian bắt đầu của hệ thống hoặc mili giây kể từ thời gian bắt đầu của hệ thống đối với timeFormatMs.
Ví dụ
Giả sử các giá trị sau và giả sử múi giờ địa phương là múi giờ Thái Bình Dương:
epoch_time_ms = 1494390266000epoch_time = 1494390266fmt1 = yyyy-MM-ddfmt2 = yyyy-MM-dd HH-mm-ssfmt3 = yyyyMMddHHmmss
Các hàm này trả về những kết quả sau:
- key – (Bắt buộc) Chỉ định khoá bí mật, được mã hoá dưới dạng một chuỗi, dùng để tính toán HMAC.
- valueToSign – (Bắt buộc) Chỉ định thông báo cần ký. Đây phải là một chuỗi.
- keyencoding – (Không bắt buộc) Chuỗi khoá bí mật sẽ được giải mã theo phương thức mã hoá được chỉ định này. Giá trị hợp lệ:
hex,base16,base64,utf-8. Mặc định:utf-8 - outputencoding – (Không bắt buộc) Chỉ định thuật toán mã hoá sẽ dùng cho đầu ra.
Giá trị hợp lệ:
hex,base16,base64. Các giá trị không phân biệt chữ hoa chữ thường;hexvàbase16là từ đồng nghĩa. Mặc định:base64 - Nếu không có đối số nào được chỉ định, hàm sẽ trả về một số nguyên dài ngẫu nhiên, do lớp SecureRandom của Java tính toán.
- Nếu có một đối số, thì đối số đó được coi là giá trị tối thiểu của phép tính.
- Nếu có đối số thứ hai, đối số này sẽ được coi là giá trị tối đa của phép tính.
- (Bắt buộc)
json-path: (Chuỗi) Biểu thức JSON Path. - (Bắt buộc)
json-var: (Chuỗi) Một biến luồng hoặc chuỗi chứa JSON. - (Không bắt buộc)
want-array: (Chuỗi) Nếu tham số này được đặt thành'true'và nếu tập kết quả là một mảng, thì tất cả các phần tử mảng sẽ được trả về. Nếu được đặt thành bất kỳ giá trị nào khác hoặc nếu bạn bỏ qua tham số này, thì chỉ phần tử thứ 0 của một mảng tập hợp kết quả được trả về. Nếu tập kết quả không phải là một mảng, thì tham số thứ ba này (nếu có) sẽ bị bỏ qua.
| Chức năng | Đầu ra |
|---|---|
timeFormatMs(fmt1,epoch_time_ms) |
2017-05-09 |
timeFormat(fmt1,epoch_time) |
2017-05-09 |
timeFormat(fmt2,epoch_time) |
2017-05-09 21:24:26 |
timeFormat(fmt3,epoch_time) |
20170509212426 |
timeFormatUTC(fmt1,epoch_time) |
2017-05-10 |
timeFormatUTC(fmt2,epoch_time) |
2017-05-10 04:24:26 |
timeFormatUTC(fmt3,epoch_time) |
20170510042426 |
Hàm tính toán HMAC
Các hàm tính toán HMAC cung cấp một phương án thay thế cho việc sử dụng chính sách HMAC để tính toán HMAC. Các hàm này rất hữu ích khi thực hiện phép tính HMAC theo tầng, chẳng hạn như khi đầu ra của một HMAC được dùng làm khoá cho HMAC thứ hai.
Cú pháp
| Chức năng | Nội dung mô tả |
|---|---|
hmacSha224(key,valueToSign[,keyencoding[,outputencoding]])
|
Tính toán HMAC bằng hàm băm SHA-224. |
hmacSha256(key,valueToSign[,keyencoding[,outputencoding]])
|
Mã hoá HMAC bằng hàm băm SHA-256. |
hmacSha384(key,valueToSign[,keyencoding[,outputencoding]])
|
Mã hoá HMAC bằng hàm băm SHA-384. |
hmacSha512(key,valueToSign[,keyencoding[,outputencoding]])
|
Mã hoá một HMAC bằng hàm băm SHA-512. |
hmacMd5(key,valueToSign[,keyencoding[,outputencoding]])
|
Mã hoá HMAC bằng hàm băm MD5. |
hmacSha1(key, valueToSign [,keyencoding[,outputencoding]])
|
Mã hoá HMAC bằng thuật toán mã hoá SHA-1. |
Đối số
Ví dụ
Ví dụ này sử dụng chính sách AssignMessage để tính toán HMAC-256 và chỉ định giá trị này cho một biến luồng:
<AssignMessage name='AM-HMAC-1'>
<AssignVariable>
<Name>valueToSign</Name>
<Template>{request.header.apikey}.{request.header.date}</Template>
</AssignVariable>
<AssignVariable>
<Name>hmac_value</Name>
<Template>{hmacSha256(private.secretkey,valueToSign)}</Template>
</AssignVariable>
</AssignMessage>Ví dụ này minh hoạ cách tạo một HMAC xếp tầng có thể dùng với quy trình ký Chữ ký AWS phiên bản 4. Ví dụ này sử dụng chính sách AssignMessage để tạo 5 cấp độ HMAC xếp tầng được dùng để tính toán chữ ký cho Chữ ký AWS phiên bản 4:
<AssignMessage name='AM-HMAC-AWS-1'> <!-- 1 --> <AssignVariable> <Name>DateValue</Name> <Template>{timeFormatUTCMs('yyyyMMdd',system.timestamp)}</Template> </AssignVariable> <!-- 2 --> <AssignVariable> <Name>FirstKey</Name> <Template>AWS4{private.secret_aws_access_key}</Template> </AssignVariable> <!-- 3 --> <AssignVariable> <Name>DateKey</Name> <Template>{hmacSha256(FirstKey,DateValue,'utf-8','base16')}</Template> </AssignVariable> <!-- 4 --> <AssignVariable> <Name>DateRegionKey</Name> <Template>{hmacSha256(DateKey,aws_region,'base16','base16')}</Template> </AssignVariable> <!-- 5 --> <AssignVariable> <Name>DateRegionServiceKey</Name> <Template>{hmacSha256(DateRegionKey,aws_service,'base16','base16')}</Template> </AssignVariable> <!-- 6 --> <AssignVariable> <Name>SigningKey</Name> <Template>{hmacSha256(DateRegionServiceKey,'aws4_request','base16','base16')}</Template> </AssignVariable> <!-- 7 --> <AssignVariable> <Name>aws4_hmac_value</Name> <Template>{hmacSha256(SigningKey,stringToSign,'base16','base16')}</Template> </AssignVariable> </AssignMessage>
Các hàm khác
Tạo hàm UUID
Tạo và trả về một mã nhận dạng duy nhất (UUID).
Cú pháp
createUuid()
Đối số
Không có.
Ví dụ
{createUuid()}
Kết quả mẫu:
ec3ca9be-d1e1-4ef4-aee4-4a58f3130db8
Hàm Random Long Generator
Trả về một số nguyên dài ngẫu nhiên.
Cú pháp
randomLong(args)
Đối số
Ví dụ
{random()}dẫn đến kết quả như sau:
5211338197474042880Công cụ tạo văn bản bằng biểu thức chính quy
Tạo một chuỗi văn bản khớp với một biểu thức chính quy nhất định.
Cú pháp
xeger(regex)
Đối số
regex – Một biểu thức chính quy.
Ví dụ
Ví dụ này tạo ra một chuỗi gồm 7 chữ số không có số 0:
xeger('[1-9]{7}')Ví dụ về kết quả:
9857253Hàm kết hợp giá trị rỗng
Hàm firstnonnull() trả về giá trị của đối số khác rỗng ở ngoài cùng bên trái.
Cú pháp
firstnonnull(var1,varnn>)
Đối số
var1 – Một biến ngữ cảnh.
varn – Một hoặc nhiều biến ngữ cảnh. Bạn có thể đặt đối số ở ngoài cùng bên phải thành một chuỗi để cung cấp giá trị dự phòng (giá trị sẽ được đặt nếu không có đối số nào ở bên trái được đặt).
Ví dụ
Bảng sau đây minh hoạ cách sử dụng hàm này:
| Mẫu | Var1 | Var2 | Var3 | Kết quả |
|---|---|---|---|---|
{firstnonnull(var1,var2)}
|
Chưa đặt | foo
|
Không áp dụng | foo
|
{firstnonnull(var1,var2)}
|
foo
|
bar
|
Không áp dụng | foo
|
{firstnonnull(var1,var2)}
|
foo
|
Chưa đặt | Không áp dụng | foo
|
{firstnonnull(var1,var2,var3)}
|
foo
|
bar
|
baz
|
foo
|
{firstnonnull(var1,var2,var3)}
|
Chưa đặt | bar
|
baz
|
bar
|
{firstnonnull(var1,var2,var3)}
|
Chưa đặt | Chưa đặt | baz
|
baz
|
{firstnonnull(var1,var2,var3)}
|
Chưa đặt | Chưa đặt | Chưa đặt | null
|
{firstnonnull(var1)}
|
Chưa đặt | Không áp dụng | Không áp dụng | null
|
{firstnonnull(var1)}
|
foo
|
Không áp dụng | Không áp dụng | foo
|
{firstnonnull(var1,var2)}
|
""
|
bar
|
Không áp dụng | ""
|
{firstnonnull(var1,var2,'fallback value')}
|
null
|
null
|
fallback value
|
fallback value
|
Hàm XPath
Áp dụng một biểu thức XPath cho một biến XML.
Cú pháp
xpath(xpath_expression,xml_string,[datatype])
Đối số
xpath_expression – Một biểu thức XPath.
xml_string – Một biến luồng hoặc chuỗi chứa XML.
datatype – (Không bắt buộc) Chỉ định kiểu dữ liệu trả về mong muốn của truy vấn. Có thể là nodeset, node, number, boolean, string. Giá trị mặc định là nodeset. Lựa chọn mặc định thường là lựa chọn phù hợp.
Ví dụ 1
Giả sử các biến ngữ cảnh này xác định một chuỗi XML và một biểu thức XPath:
xml = "<tag><tagid>250397</tagid><readerid>1</readerid><rssi>74</rssi><date>2019/06/15</date></tag>" xpath = "/tag/tagid"
Hàm xpath() được dùng trong chính sách AssignMessage, như sau:
<AssignMessage>
<AssignVariable>
<Name>extracted_tag</Name>
<Template>{xpath(xpath,xml)}</Template>
</AssignVariable>
</AssignMessage><
Hàm này trả về giá trị <tagid>250397</tagid>. Giá trị này được đặt trong biến ngữ cảnh có tên là extracted_tag.
Ví dụ 2
Nếu bạn chỉ muốn giá trị của nút, hãy sử dụng hàm text() như sau:
<AssignMessage>
<AssignVariable>
<Name>extracted_tag</Name>
<Template>{xpath('/tag/tagid/text()',xml)}</Template>
</AssignVariable>
</AssignMessage>
Do thao tác này, biến ngữ cảnh extracted_tag được đặt thành 250397
Nếu bạn chọn nhiều nút, thì kết quả của xpath() là tất cả các giá trị của lựa chọn, được nối với nhau bằng dấu phẩy.
Ví dụ 3: Không gian tên XML
Để chỉ định một không gian tên, hãy thêm các tham số bổ sung, mỗi tham số là một chuỗi có dạng prefix:namespaceuri. Ví dụ: hàm xpath() chọn phần tử con của một nội dung SOAP có thể có dạng như sau:
<AssignMessage> <AssignVariable> <Name>soapns</Name> <Value>soap:http://schemas.xmlsoap.org/soap/envelope/</Value> </AssignVariable> <AssignVariable> <Name>xpathexpression</Name> <Value>/soap:Envelope/soap:Body/*</Value> </AssignVariable> <AssignVariable> <Name>extracted_element</Name> <Template>{xpath(xpathexpression,xml,soapns)}</Template> </AssignVariable> </AssignMessage>
Đối với các không gian tên bổ sung, bạn có thể thêm tối đa 10 tham số bổ sung vào hàm xpath().
Bạn có thể chỉ định một biểu thức XPath đơn giản dưới dạng một chuỗi được đặt trong dấu ngoặc đơn:
{xpath('/tag/tagid/text()',xml)}Nếu biểu thức XPath có tiền tố không gian tên (và dấu hai chấm), thì bạn cần chỉ định biểu thức XPath đó cho một biến và chỉ định tên biến thay vì biểu thức trực tiếp.
{xpath(xpathexpression,xml,ns1)}Ví dụ 4: Chỉ định kiểu dữ liệu trả về mong muốn
Tham số thứ ba không bắt buộc được truyền đến hàm xpath() chỉ định loại dữ liệu trả về mong muốn của truy vấn.
Một số truy vấn XPath có thể trả về giá trị số hoặc giá trị boolean. Ví dụ: hàm count() trả về một số. Đây là một truy vấn XPath hợp lệ:
count(//Record/Fields/Pair)
Truy vấn hợp lệ này trả về một giá trị boolean:
count(//Record/Fields/Pair)>0
Trong những trường hợp đó, hãy gọi hàm xpath() bằng tham số thứ ba chỉ định loại đó:
{xpath(expression,xml,'number')}
{xpath(expression,xml,'boolean')}
Nếu tham số thứ ba chứa dấu hai chấm, thì tham số đó sẽ được diễn giải là đối số không gian tên.
Nếu không, thì kiểu này sẽ được coi là kiểu dữ liệu trả về mong muốn. Trong trường hợp này, nếu tham số thứ ba không phải là một trong các giá trị hợp lệ (bỏ qua trường hợp), thì hàm xpath() sẽ mặc định trả về một nhóm nút.
Hàm JSON Path
Áp dụng biểu thức JSON Path cho một biến JSON.
Cú pháp
jsonPath(json-path,json-var,want-array)
Đối số
Ví dụ 1
Nếu đây là mẫu tin nhắn:
The address is {jsonPath($.results[?(@.name == 'Mae West')].address.line1,the_json_variable)}
và the_json_variable chứa:
{ "results" : [ { "address" : { "line1" : "18250 142ND AV NE", "city" : "Woodinville", "state" : "Washington", "zip" : "98072" }, "name" : "Fred Meyer" }, { "address" : { "line1" : "1060 West Addison Street", "city" : "Chicago", "state" : "Illinois", "zip" : "60613" }, "name" : "Mae West" } ] }
Kết quả của hàm là:
The address is 1060 West Addison Street
Xin lưu ý rằng trong trường hợp này, tập hợp kết quả là một phần tử duy nhất (không phải là một mảng phần tử). Nếu tập hợp kết quả là một mảng, thì chỉ phần tử thứ 0 của mảng mới được trả về. Để trả về toàn bộ mảng, hãy gọi hàm có 'true' làm tham số thứ ba, như minh hoạ trong ví dụ tiếp theo.
Ví dụ 2
Nếu đây là mẫu tin nhắn:
{jsonPath($.config.quota[?(@.operation=='ManageOrder')].appname,the_json_variable,'true')}
và the_json_variable chứa:
{
"results" : [
{
"config": {
"quota": [
{
"appname": "A",
"operation": "ManageOrder",
"value": "900"
},
{
"appname": "B",
"operation": "ManageOrder",
"value": "1000"
},
{
"appname": "B",
"operation": "SubmitOrder",
"value": "800"
}
]
}
}
]
} Kết quả của hàm là:
['A','B']