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
Các điều kiện cho phép các proxy API hoạt động linh hoạt trong thời gian chạy. Điều kiện xác định các thao tác trên các biến, được quy trình xử lý Apigee Edge đánh giá. Câu lệnh có điều kiện là boolean và luôn được đánh giá là true hoặc false.
Tổng quan về điều kiện
Phần này mô tả cách và vị trí sử dụng câu lệnh có điều kiện với Edge. Ngoài ra, các phần sau đây mô tả cú pháp:
Cấu trúc của câu lệnh có điều kiện
Cấu trúc cơ bản của câu lệnh có điều kiện là:
<Condition>variable.name operator "value"</Condition>
Ví dụ:
<Condition>request.verb = "GET"</Condition>
Bạn có thể kết hợp các điều kiện với AND để thực thi nhiều điều kiện cùng một lúc. Ví dụ: các điều kiện sau đây chỉ được đánh giá là true nếu URI của yêu cầu khớp với /statuses và động từ HTTP của yêu cầu là GET:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
Trường hợp bạn có thể sử dụng câu lệnh có điều kiện
Bạn có thể sử dụng các điều kiện để kiểm soát hành vi trong những trường hợp sau:
Thực thi chính sách
Bằng cách sử dụng câu lệnh có điều kiện, bạn có thể kiểm soát việc thực thi chính sách. Một trường hợp sử dụng phổ biến là chuyển đổi có điều kiện các thông báo phản hồi, dựa trên tiêu đề HTTP hoặc nội dung thông báo.
Ví dụ sau đây chuyển đổi có điều kiện XML thành JSON dựa trên tiêu đề Accept:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Thực thi quy trình công việc
Bằng cách sử dụng câu lệnh có điều kiện, bạn có thể kiểm soát việc thực thi các luồng có tên trong ProxyEndpoints và TargetEndpoints. Xin lưu ý rằng bạn chỉ có thể thực thi các luồng "được đặt tên" có điều kiện. Preflow và postflow (cả yêu cầu và phản hồi) trên ProxyEndpoint và TargetEndpoint sẽ thực thi cho mọi giao dịch, do đó cung cấp các chức năng "an toàn" vô điều kiện.
Ví dụ: để thực thi một luồng yêu cầu có điều kiện dựa trên động từ HTTP của thông báo yêu cầu và luồng phản hồi có điều kiện dựa trên mã trạng thái HTTP (có thể) đại diện cho một lỗi:
<Flow name="GetRequests">
<Condition>request.verb = "GET"</Condition>
<Request>
<Step>
<Condition>request.path MatchesPath "/statuses/**"</Condition>
<Name>StatusesRequestPolicy</Name>
</Step>
</Request>
<Response>
<Step>
<Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
<Name>MaintenancePolicy</Name>
</Step>
</Response>
</Flow>Lựa chọn tuyến đường cho điểm cuối mục tiêu
Bằng cách sử dụng câu lệnh có điều kiện, bạn có thể kiểm soát điểm cuối mục tiêu được gọi bằng cấu hình điểm cuối proxy. Một quy tắc định tuyến chuyển tiếp yêu cầu đến một điểm cuối đích cụ thể. Khi có nhiều điểm cuối đích, quy tắc định tuyến sẽ được đánh giá theo điều kiện của quy tắc đó và nếu đúng, yêu cầu sẽ được chuyển tiếp đến điểm cuối đích được đặt tên.
Ví dụ: để định tuyến có điều kiện các thông báo đến các điểm cuối mục tiêu được chỉ định dựa trên Content-Type:
<RouteRule name="default">
<!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
<Condition>request.header.Content-Type = "text/xml"</Condition>
<TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>Hãy xem phần Biến và điều kiện trong luồng để biết thêm thông tin.
Biểu thức đường dẫn
Biểu thức đường dẫn được dùng để so khớp đường dẫn URI, sử dụng "*" để biểu thị một phần tử đường dẫn duy nhất và "**" để biểu thị nhiều cấp URI.
Ví dụ:
| Mẫu | Đường dẫn URI mẫu trùng khớp |
|---|---|
/*/a/ |
/x/a/ hoặc /y/a/ |
/*/a/* |
/x/a/b hoặc /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/*/feed/ |
/x/a/b/feed/ hoặc /y/a/foo/feed/ |
/a/**/feed/** |
/a/b/feed/rss/1234 |
% được coi là ký tự thoát. Mẫu %{user%} khớp với {user} nhưng không khớp với user.
Biến
Bạn có thể sử dụng cả biến luồng tích hợp và biến tuỳ chỉnh trong câu lệnh có điều kiện. Để biết thêm thông tin, hãy xem các bài viết sau:
- Tài liệu tham khảo về các biến trong luồng: Danh sách đầy đủ các biến tích hợp
- Chính sách ExtractVariables: Hướng dẫn về cách đặt biến tuỳ chỉnh
Toán tử
Khi sử dụng toán tử, hãy tuân thủ các hạn chế sau:
- Bạn không thể dùng toán tử làm tên biến.
- Bạn phải thêm ký tự dấu cách trước và sau toán tử.
- Để thêm một toán tử vào một biến, tên biến phải được đặt trong dấu ngoặc đơn.
Ví dụ:
'request.header.help!me'. - Không được hỗ trợ toán tử số học (
+ * - / %). - Mức độ ưu tiên của Java được dùng cho các toán tử.
- Apigee Edge dựa vào các biểu thức chính quy được triển khai trong
java.util.regex.
Bảng sau đây liệt kê các toán tử được hỗ trợ. Bạn có thể sử dụng ký hiệu hoặc từ trong biểu thức của mình:
| Biểu tượng | Word | Mô tả |
|---|---|---|
! |
Not, not |
Toán tử một ngôi (chỉ nhận một đầu vào) |
= |
Equals, Is |
Bằng (phân biệt chữ hoa chữ thường) |
!= |
NotEquals, IsNot |
Không bằng (phân biệt chữ hoa chữ thường) |
:= |
EqualsCaseInsensitive |
Bằng nhưng không phân biệt chữ hoa chữ thường |
> hoặc > |
GreaterThan |
Lớn hơn. Nếu bạn sử dụng > khi xác định điều kiện trong giao diện người dùng Edge, thì điều kiện đó sẽ được chuyển đổi thành >. |
>= hoặc >= |
GreaterThanOrEquals |
Lớn hơn hoặc bằng. Nếu bạn sử dụng >= khi xác định điều kiện trong giao diện người dùng Edge, thì điều kiện đó sẽ được chuyển đổi thành >=. |
< |
LesserThan |
Nhỏ hơn. Giao diện người dùng Edge không hỗ trợ ký tự <. |
<= |
LesserThanOrEquals |
Nhỏ hơn hoặc bằng. Giao diện người dùng Edge không hỗ trợ ký tự <=. |
&& |
And, and |
và |
|| |
Or |
Toán tử Hoặc không phân biệt chữ hoa chữ thường. Ví dụ: OR, Or và or đều hợp lệ. |
() |
Nhóm một biểu thức. ( mở biểu thức và ) đóng biểu thức. |
|
~~ |
JavaRegex |
Khớp với một biểu thức chính quy tuân thủ |
~ |
Matches, Like |
So khớp một mẫu kiểu glob bằng ký tự đại diện "*". Kết quả so khớp có phân biệt chữ hoa chữ thường. Để xem ví dụ, hãy tham khảo phần So khớp mẫu bằng các câu lệnh có điều kiện. |
~/ |
MatchesPath, LikePath |
Khớp với một biểu thức đường dẫn. Kết quả so khớp có phân biệt chữ hoa chữ thường. Để xem ví dụ, hãy tham khảo phần So khớp mẫu bằng các câu lệnh có điều kiện. |
=| |
StartsWith |
Khớp với các ký tự đầu tiên của một chuỗi. Kết quả so khớp có phân biệt chữ hoa chữ thường. |
Toán hạng
Apigee Edge điều chỉnh các toán hạng thành một kiểu dữ liệu chung trước khi so sánh chúng. Ví dụ: nếu mã trạng thái phản hồi là 404, thì biểu thức response.status.code = "400" và response.status.code = 400 sẽ tương đương nhau.
Đối với toán hạng số, kiểu dữ liệu được diễn giải là số nguyên, trừ phi giá trị được kết thúc như sau:
- "f" hoặc "F" (số thực, ví dụ: 3.142f, 91.1F)
- "d" hoặc "D" (double, ví dụ: 3.142d, 100.123D)
- "l" hoặc "L" (dài, ví dụ: 12321421312L)
Trong những trường hợp này, hệ thống sẽ thực hiện các hoạt động điều chỉnh như trong bảng sau (trong đó RHS đề cập đến phía bên phải của phương trình và LHS là phía bên trái):
| RHS LHS | Boolean | Số nguyên | Dài | Số thực dấu phẩy động | Đôi | Chuỗi | Tương đương | Đối tượng |
|---|---|---|---|---|---|---|---|---|
| Boolean | Boolean | Số nguyên | Dài | Số thực dấu phẩy động | Đôi | Chuỗi | - | |
| Số nguyên | Số nguyên | Số nguyên | Dài | Số thực dấu phẩy động | Đôi | Chuỗi | Tương đương | - |
| Dài | Dài | Dài | Dài | Số thực dấu phẩy động | Đôi | Chuỗi | Tương đương | - |
| Số thực dấu phẩy động | Số thực dấu phẩy động | Số thực dấu phẩy động | Số thực dấu phẩy động | Số thực dấu phẩy động | Đôi | Chuỗi | Tương đương | - |
| Đôi | Đôi | Đôi | Đôi | Đôi | Đôi | Chuỗi | Tương đương | - |
| Chuỗi | Chuỗi | Chuỗi | Chuỗi | Chuỗi | Chuỗi | Chuỗi | Tương đương | - |
| Tương đương | Tương đương | Tương đương | Tương đương | Tương đương | Tương đương | Tương đương | Tương đương | - |
| Đối tượng | - | - | - | - | - | - | - | - |
Toán hạng rỗng
Bảng sau đây cho biết liệu các điều kiện có đánh giá thành true hay false khi các giá trị là giá trị rỗng ở phía bên trái (LHS) và/hoặc phía bên phải (RHS) của toán hạng được hiển thị:
| Đơn vị tổ chức | LHS null | RHS null | LHS và RHS rỗng |
|---|---|---|---|
=, ==, := |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> hoặc > |
true | false | false |
>= hoặc >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | Không có | false |
~~ |
false | Không có | false |
!~ |
true | false | false |
~/ |
false | Không có | false |
Giá trị cố định
Ngoài các giá trị cố định dạng chuỗi và số, bạn có thể sử dụng các giá trị cố định sau trong câu lệnh có điều kiện:
nulltruefalse
Ví dụ:
request.header.host is nullflow.cachehit is true
Ví dụ
<RouteRule name="default"> <Condition>request.header.content-type = "text/xml"</Condition> <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint> </RouteRule>
<Step>
<Condition>response.status.code = 503</Condition>
<Name>MaintenancePolicy</Name>
</Step><Flow name="GetRequests">
<Condition>response.verb="GET"</Condition>
<Request>
<Step>
<Condition>request.path ~ "/statuses/**"</Condition>
<Name>StatusesRequestPolicy</Name>
</Step>
</Request>
<Response>
<Step>
<Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
<Name>MaintenancePolicy</Name>
</Step>
</Response>
</Flow>