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

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 độ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:

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 &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ợ ký tự <=.
&& And, and
|| Or Toán tử Hoặc 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ả 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 trong câu lệnh có điều kiện.

~ 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"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 &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

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:

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