Tài liệu tham khảo về điều kiện

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

Các điều kiện cho phép proxy API hoạt động động trong thời gian chạy. Các điều kiện xác định hoạt động trên các biến. Các biến này được đánh giá theo quy trình xử lý của Apigee Edge. Câu lệnh có điều kiện là giá trị 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 thức 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 sẽ 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 bằng AND để thực thi nhiều điều kiện cùng lúc. Ví dụ: các điều kiện sau đây chỉ đánh giá true nếu URI của yêu cầu khớp với /statuses độ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ể 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

Khi 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 sẽ chuyển đổi XML thành JSON theo điều kiện dựa trên tiêu đề Accept:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

Thực thi luồng

Bằng cách sử dụng các 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 đã đặt tên trong ProxyEndpoints và TargetEndpoints. Lưu ý rằng chỉ các luồng "đã đặt tên" mới có thể được thực thi theo điều kiện. Các quy trình trước và sau (cả yêu cầu và phản hồi) trên ProxyEndpoints và TargetEndpoints sẽ thực thi cho mọi giao dịch, nhờ đó cung cấp khả năng "thất bại" 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 (tiềm năng) biểu thị 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 đến điểm cuối mục tiêu

Khi sử dụng các 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 cấu hình điểm cuối proxy gọi. Quy tắc định tuyến sẽ chuyển tiếp một yêu cầu đến một điểm cuối đích cụ thể. Khi có nhiều điểm cuối mục tiêu, quy tắc định tuyến sẽ được đánh giá theo điều kiện và nếu đúng, yêu cầu sẽ được chuyển tiếp đến điểm cuối đích đã đặt tên.

Ví dụ: để định tuyến thông báo theo điều kiện đế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 Các biến và điều kiện 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 cho các đường dẫn URI khớp, trong đó "*" để biểu thị một phần tử đường dẫn và "**" để biểu thị nhiều cấp độ URI.

Ví dụ:

Mẫu Đã khớp đường dẫn URI mẫu
/*/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:

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ể sử dụng toán tử làm tên biến.
  • Bắt buộc phải có ký tự dấu cách trước và sau toán tử.
  • Để đưa toán tử vào biến, tên biến phải được đặt trong dấu ngoặc đơn. Ví dụ: 'request.header.help!me'.
  • Toán tử số học (+ * - / %) không được hỗ trợ.
  • Mức ưu tiên của Java được dùng cho các toán tử.
  • Apigee Edge dựa trên các biểu thức chính quy như đã 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:

Biểu tượng Word Nội dung mô tả
! Not, not Toán tử đơn phân (lấy một giá trị đầ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 &gt; 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 &gt;.
>= hoặc &gt;= 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 &gt;=.
&lt; LesserThan Nhỏ hơn. Giao diện người dùng Edge không hỗ trợ ký tự <.
&lt;= LesserThanOrEquals Nhỏ hơn hoặc bằng. Giao diện người dùng Edge không hỗ trợ giá trị cố định <=.
&& And, and
|| Or Toán tử Or không phân biệt chữ hoa chữ thường. Ví dụ: OR, Oror đề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ủ javax.util.regex. Kết quả trùng khớp có phân biệt chữ hoa chữ thường. Để biết ví dụ, hãy xem phần So khớp mẫu trong câu lệnh có điều kiện.

~ Matches, Like So khớp mẫu kiểu toàn cầu bằng ký tự đại diện "*". Kết quả trùng khớp có phân biệt chữ hoa chữ thường. Để biết ví dụ, hãy xem phần So khớp mẫu với 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ả trùng khớp có phân biệt chữ hoa chữ thường. Để biết ví dụ, hãy xem phần So khớp mẫu với câu lệnh có điều kiện.
=| StartsWith Khớp với các ký tự đầu tiên của chuỗi. Kết quả trùng khớp có phân biệt chữ hoa chữ thường.

Toán hạng

Apigee Edge điều chỉnh toán hạng cho một loại dữ liệu phổ biến trước khi so sánh. Ví dụ: nếu mã trạng thái phản hồi là 404, thì biểu thức response.status.code = "400"response.status.code = 400 sẽ tương đương nhau.

Đối với toán hạng số, loại dữ liệu được diễn giải dưới dạng số nguyên trừ khi giá trị bị kết thúc như sau:

  • "f" hoặc "F" (số thực có độ chính xác đơn, ví dụ: 3.142f, 91.1F)
  • "d" hoặc "D" (gấp đôi, ví dụ: 3.142d, 100.123D)
  • "l" hoặc "L" (ví dụ: 12321421312L)

Trong những trường hợp này, hệ thống sẽ thực hiện các điều chỉnh như trong bảng sau (trong đó RHS là phần bên phải của phương trình và LHS là phần bên trái):

RHS LHS Boolean Số nguyên Dài Số thực dấu phẩy động Số thực có độ chính xác kép Chuỗi Tương đương Đối tượng
Boolean Boolean Số nguyên Dài Số thực dấu phẩy động Số thực có độ chính xác kép Chuỗi -
Số nguyên Số nguyên Số nguyên Dài Số thực dấu phẩy động Số thực có độ chính xác kép Chuỗi Tương đương -
Dài Dài Dài Dài Số thực dấu phẩy động Số thực có độ chính xác kép 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 Số thực có độ chính xác kép Chuỗi Tương đương -
Số thực có độ chính xác kép Số thực có độ chính xác kép Số thực có độ chính xác kép Số thực có độ chính xác kép Số thực có độ chính xác kép Số thực có độ chính xác kép 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 sẽ được đánh giá là true hay false khi các giá trị là rỗng ở phía bên trái (LHS) và/hoặc bên phải (RHS) của toán hạng được hiển thị:

Đơn vị tổ chức LHS rỗng RHS rỗng LHS và RHS rỗng
=, ==, := false false true
=| false false false
!= true true false
> hoặc &gt; true false false
>= hoặc &gt;= false true true
&lt; true false false
&lt;= true false true
~ false Không có false
~~ false Không có false
!~ true false false
~/ false Không có false

Ký tự

Ngoài các giá trị cố định kiểu chuỗi và số, bạn có thể sử dụng các giá trị cố định sau đây trong câu lệnh có điều kiện:

  • null
  • true
  • false

Ví dụ:

  • request.header.host is null
  • flow.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>