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 các proxy API hoạt động linh hoạt trong thời gian chạy. Các điều kiện xác định thao tác trên các biến được đánh giá bằng quy trình xử lý Apigee Edge. Câu lệnh có điều kiện là boolean và luôn đánh giá là true hoặc false.

Tổng quan về các điều kiện

Phần này mô tả cách thức và trường hợp 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 hàm 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 được đánh giá thành true chỉ khi 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 phần 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. Trường hợp sử dụng phổ biến là việc 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 có điều kiện XML sang JSON dựa trên Accept tiêu đề:

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

Thực thi luồng

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 các luồng có tên trong ProxyEndpoints và TargetEndpoints. Lưu ý rằng chỉ "được đặt tên" luồng có thể được thực thi có điều kiện. Luồng trước và luồng hậu (cả yêu cầu và phản hồi) trên ProxyEndpoints và TargetEndpoints được thực thi cho mỗi giao dịch và do đó cung cấp giá trị "không thành công" vô điều kiện các chức năng khác nhau.

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 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ị 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 điểm cuối mục tiêu

Khi 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 do điểm cuối proxy gọi ra . Quy tắc định tuyến sẽ chuyển tiếp yêu cầu đến một điểm cuối mục tiêu cụ thể. Khi có hơn khi có một đ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 này sẽ được chuyển tiếp đến điểm cuối mục tiêu đã đặt tên.

Ví dụ: để định tuyến thông báo theo cách có điều kiện đến đ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>

Xem bài viết Các biến luồng và điều kiện để 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 các đường dẫn URI, có dùng "*" để biểu thị một phần tử đường dẫn đơn 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. Chiến lược phát hành đĩa đơn 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 sẵn 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ủ những hạn chế sau:

  • Bạn không được sử dụng toán tử làm tên biến.
  • 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 nháy đơn. Ví dụ: 'request.header.help!me'.
  • Toán tử số học (+ * - / %) không được hỗ trợ.
  • Java ưu tiên sẽ được dùng cho toán tử.
  • Apigee Edge dựa vào biểu thức chính quy như đượ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 biểu tượng hoặc từ trong biểu thức:

Biểu tượng Word Mô tả
! Not, not Toán tử đơn nhất (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, đó là được chuyển đổi sang &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, nó được chuyển đổi thành &gt;=.
&lt; LesserThan Ít 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 nó.
~~ JavaRegex

Khớp với một biểu thức chính quy tuân thủ javax.util.regex. Kết quả phù hợp là phân biệt chữ hoa chữ thường. Để biết các ví dụ, hãy xem phần Mẫu khớp trong câu lệnh có điều kiện.

~ Matches, Like Khớp với một mẫu kiểu toàn cầu bằng cách sử dụng "*" ký tự đại diện. Kết quả phù hợp là 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 điều kiện.
~/ MatchesPath, LikePath Khớp với một biểu thức đường dẫn. Kết quả 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 đ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ả 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 thành một loại dữ liệu chung trước khi so sánh. Ví dụ: nếu mã trạng thái phản hồi là 404, biểu thức response.status.code = "400"response.status.code = 400 là tương đương.

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

  • "f" hoặc "F" (độ 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" (dài, ví dụ: 12321421312L)

Trong những trường hợp này, hệ thống thực hiện các hoạt động điều chỉnh như minh hoạ trong bảng sau (trong đó RHS đề cập đến ở vế phải của phương trình, LHS là vế 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á là true hay false khi các giá trị là rỗng ở bên trái (LHS) và/hoặc bên phải (RHS) của toán hạng được biểu thị:

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

Giá trị cố định

Ngoài giá trị cố định kiểu chuỗi và giá trị cố định dạng 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>