Chính sáchassignMessage

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

Nội dung

Chính sách AssignMessage thay đổi hoặc tạo yêu cầu và thông báo phản hồi mới trong quy trình Proxy API. Chính sách này cho phép bạn thực hiện các hành động sau đối với những tin nhắn đó:

  • Thêm tham số biểu mẫu, tiêu đề hoặc tham số truy vấn mới vào một thông báo
  • Sao chép các thuộc tính hiện có từ một thư sang thư khác
  • Xoá tiêu đề, tham số truy vấn, tham số biểu mẫu và/hoặc tải trọng thông báo khỏi một thông báo
  • Đặt giá trị của các thuộc tính hiện có trong một thông báo

Với chính sách AssignMessage, bạn thường thêm, thay đổi hoặc xoá các thuộc tính của yêu cầu hoặc phản hồi. Tuy nhiên, bạn cũng có thể sử dụng chính sách AssignMessage để tạo một yêu cầu hoặc thông báo phản hồi tuỳ chỉnh và chuyển thông báo đó đến một mục tiêu thay thế, như mô tả trong phần Tạo thông báo yêu cầu tuỳ chỉnh.

Chính sách AssignMessage có thể tạo hoặc thay đổi các biến flow bằng các phần tử con sau:

Phần tử <AssignMessage>

Xác định chính sách AssignMessage.

Giá trị mặc định Xem thẻ Chính sách mặc định ở bên dưới
Bắt buộc? Bắt buộc
Loại Đối tượng phức tạp
Phần tử mẹ không áp dụng
Phần tử con <Add>
<AssignTo>
<AssignVariable>
<Copy>
<DisplayName>
<IgnoreUnresolvedVariables>
<Remove>
<Set>

Phần tử <AssignMessage> sử dụng cú pháp sau:

Cú pháp

Phần tử <AssignMessage> sử dụng cú pháp sau:

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <!-- All AssignMessage child elements are optional -->
  <Add>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>

  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>

  <AssignVariable>
    <Name>variable_name</Name>
    <Ref>source_variable</Ref>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
    <Value>variable_value</Value>
  </AssignVariable>

  <Copy source="[request|response]">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>[false|true]</ReasonPhrase>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>

  <DisplayName>policy_display_name</DisplayName>

  <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>

  <Remove>
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Remove>

  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>path</Path>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>

</AssignMessage>

Chính sách mặc định

Ví dụ sau đây cho thấy chế độ cài đặt mặc định khi bạn thêm chính sách AssignMessage vào luồng trong giao diện người dùng Edge:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <Copy source="request">
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <Payload/>
    <Verb/>
    <StatusCode/>
    <ReasonPhrase/>
    <Path/>
  </Copy>
  <Remove>
    <Headers>
      <Header name="h1"/>
    </Headers>
    <QueryParams>
      <QueryParam name="q1"/>
    </QueryParams>
    <FormParams>
      <FormParam name="f1"/>
    </FormParams>
    <Payload/>
  </Remove>
  <Add>
    <Headers/>
    <QueryParams/>
    <FormParams/>
  </Add>
  <Set>
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <!-- <Verb>GET</Verb> -->
    <Path/>
  </Set>
  <AssignVariable>
    <Name>name</Name>
    <Value/>
    <Ref/>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Khi bạn chèn một chính sách AssignMessage mới trong giao diện người dùng Edge, mẫu sẽ chứa các mã giả lập cho tất cả các thao tác có thể thực hiện. Thông thường, bạn sẽ chọn(các) thao tác mà bạn muốn thực hiện bằng chính sách này và xoá các phần tử con còn lại. Ví dụ: nếu bạn muốn thực hiện thao tác sao chép, hãy sử dụng phần tử <Copy> và xoá <Add>, <Remove> và các phần tử con khác khỏi chính sách để dễ đọc hơn.

Phần tử này có các thuộc tính chung cho tất cả các chính sách:

Thuộc tính Mặc định Bắt buộc? Nội dung mô tả
name Không áp dụng Bắt buộc

Tên nội bộ của chính sách. Giá trị của thuộc tính name có thể chứa chữ cái, số, dấu cách, dấu gạch nối, dấu gạch dưới và dấu chấm. Giá trị này không được vượt quá 255 ký tự.

Nếu muốn, hãy sử dụng phần tử <DisplayName> để gắn nhãn chính sách trong trình chỉnh sửa proxy của giao diện người dùng quản lý bằng một tên ngôn ngữ tự nhiên khác.

continueOnError sai Không bắt buộc Đặt thành "false" để trả về lỗi khi một chính sách không thành công. Đây là hành vi dự kiến đối với hầu hết các chính sách. Đặt thành "true" để tiếp tục thực thi luồng ngay cả sau khi chính sách không hoạt động.
enabled true Không bắt buộc Đặt thành "true" để thực thi chính sách này. Đặt thành "false" để "tắt" chính sách này. Chính sách sẽ không được thực thi ngay cả khi vẫn được liên kết với một luồng.
async   sai Không được dùng nữa Thuộc tính này không còn được dùng nữa.

Bảng sau đây cung cấp nội dung mô tả tổng quan về các phần tử con của <AssignMessage>:

Phần tử con Bắt buộc? Mô tả
Các thao tác phổ biến
<Add> Không bắt buộc Thêm thông tin vào đối tượng thông báo do phần tử <AssignTo> chỉ định.

<Add> thêm tiêu đề hoặc tham số vào thông báo không có trong thông báo gốc. Để ghi đè tiêu đề hoặc tham số hiện có, hãy sử dụng phần tử <Set>.

<Copy> Không bắt buộc Sao chép thông tin từ thông báo do thuộc tính source chỉ định sang đối tượng thông báo do phần tử <AssignTo> chỉ định.
<Remove> Không bắt buộc Xoá các phần tử đã chỉ định khỏi biến thông báo được chỉ định trong phần tử <AssignTo>.
<Set> Không bắt buộc Thay thế các giá trị của các thuộc tính hiện có trên yêu cầu hoặc phản hồi do phần tử <AssignTo> chỉ định.

<Set> ghi đè các tiêu đề hoặc tham số đã tồn tại trong thông báo gốc. Để thêm tiêu đề hoặc tham số mới, hãy sử dụng phần tử <Add>.

Các phần tử con khác
<AssignTo> Không bắt buộc Chỉ định thông báo mà chính sách AssignMessage hoạt động. Đây có thể là yêu cầu hoặc phản hồi tiêu chuẩn hoặc có thể là một thông báo tuỳ chỉnh mới.
<AssignVariable> Không bắt buộc Chỉ định giá trị cho biến flow. Nếu biến không tồn tại, thì <AssignVariable> sẽ tạo biến đó.
<IgnoreUnresolvedVariables> Không bắt buộc Xác định xem quá trình xử lý có dừng lại khi gặp một biến chưa được phân giải hay không.

Mỗi phần tử con này được mô tả trong các phần tiếp theo.

Ví dụ

Các ví dụ sau đây cho thấy một số cách bạn có thể sử dụng chính sách AssignMessage:

1: Thêm tiêu đề

Ví dụ sau đây thêm một tiêu đề vào yêu cầu bằng phần tử <Add>:

<AssignMessage continueOnError="false" enabled="true" name="add-headers-1">
  <Add>
    <Headers>
      <Header name="user-agent">{request.user.agent}</Header>
    </Headers>
  </Add>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

2: Xoá tải trọng

Ví dụ sau đây xoá tải trọng khỏi phản hồi bằng phần tử <Remove>:

<AssignMessage continueOnError="false" enabled="true" name="remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

3: Sửa đổi câu trả lời

Ví dụ sau đây sửa đổi một đối tượng phản hồi hiện có bằng cách thêm một tiêu đề vào đối tượng đó:

<AssignMessage name="modify-response">
  <Set>
    <Headers>
      <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" type="response"></AssignTo>
</AssignMessage>

Ví dụ này không tạo thông báo mới. Thay vào đó, phương thức này sửa đổi thông báo phản hồi hiện có bằng cách thêm tiêu đề HTTP.

Vì ví dụ này bỏ qua tên biến trong phần tử <AssignTo> và chỉ định type là "phản hồi", nên chính sách này sẽ sửa đổi đối tượng phản hồi do máy chủ mục tiêu trả về.

Tiêu đề HTTP được thêm vào thông báo phản hồi theo chính sách này bắt nguồn từ một biến được điền sẵn bằng chính sách LookupCache. Do đó, thông báo phản hồi được sửa đổi theo chính sách Chỉ định thông báo này sẽ chứa một tiêu đề HTTP cho biết kết quả đã được lấy từ bộ nhớ đệm hay chưa. Việc đặt tiêu đề trong phản hồi có thể hữu ích cho việc gỡ lỗi và khắc phục sự cố.

4: Đặt nội dung động

Bạn có thể sử dụng tính năng Chỉ định thông báo để nhúng nội dung động vào tải trọng của thông báo phản hồi và yêu cầu.

Để nhúng các biến luồng Edge vào tải trọng XML, hãy gói biến được chỉ định trong dấu ngoặc nhọn, như sau: {prefix.name}.

Ví dụ sau đây nhúng giá trị của biến luồng tiêu đề HTTP user-agent vào một phần tử XML có tên là User-agent:

<AssignMessage name="set-dynamic-content">
  <AssignTo createNew="false" type="response"></AssignTo>
  <Set>
    <Payload contentType="text/xml">
      <User-agent>{request.header.user-agent}</User-agent>
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

Đối với tải trọng JSON, bạn có thể chèn biến bằng cách sử dụng các thuộc tính variablePrefixvariableSuffix có ký tự phân cách như trong ví dụ sau:

<AssignMessage name="set-payload">
  <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
  {
     "user-agent": "@request.header.user-agent#"
  }
  </Payload>
</AssignMessage>

Để xem danh sách đầy đủ các biến flow, hãy xem bài viết Tham khảo về biến flow.

Kể từ bản phát hành trên đám mây 16.08.17, bạn cũng có thể sử dụng dấu ngoặc nhọn để chèn biến.

5: Xoá tham số truy vấn

Ví dụ sau đây xoá tham số truy vấn apikey khỏi yêu cầu:

<AssignMessage name="remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Tốt nhất bạn nên xoá tham số truy vấn apikey khỏi thông báo yêu cầu khi sử dụng chính sách VerifyAPIKey để xác thực người dùng. Bạn thực hiện việc này để ngăn thông tin khoá nhạy cảm được truyền đến mục tiêu phụ trợ.

6: Đặt/lấy biến

Ví dụ sau đây sử dụng 3 chính sách Gán thông báo:

  1. Tạo ba biến flow trong yêu cầu, với các giá trị tĩnh
  2. Tự động lấy các biến flow trong chính sách thứ hai trong flow yêu cầu
  3. Đặt các giá trị này trong tải trọng của phản hồi
<!-- Policy #1: Set variables in the request -->
<AssignMessage continueOnError="false" enabled="true" name="set-variables">
    <!-- Create a variable named myAppSecret -->
    <AssignVariable>
        <Name>myAppSecret</Name>
        <Value>42</Value>
    </AssignVariable>
    <!-- Create a variable named config.environment -->
    <AssignVariable>
        <Name>config.environment</Name>
        <Value>test</Value>
    </AssignVariable>
    <!-- Create a variable named config.protocol -->
    <AssignVariable>
        <Name>config.protocol</Name>
        <Value>gopher</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Trong chính sách đầu tiên, phần tử <AssignVariable> sẽ tạo và đặt ba biến trong yêu cầu. Mỗi phần tử <Name> chỉ định tên biến và <Value> chỉ định giá trị.

Chính sách thứ hai sử dụng phần tử <AssignVariable> để đọc các giá trị và tạo ba biến mới:

<!-- Policy #2: Get variables from the request -->
<AssignMessage continueOnError="false" enabled="true" name="get-variables">
  <AssignTo createNew="false" transport="http" type="request"/>
  <!-- Get the value of myAppSecret and create a new variable, secret -->
  <AssignVariable>
    <Name>secret</Name>
    <Ref>myAppSecret</Ref>
    <Value>0</Value>
  </AssignVariable>
  <!-- Get the value of config.environment and create a new variable, environment -->
  <AssignVariable>
    <Name>environment</Name>
    <Ref>config.environment</Ref>
    <Value>default</Value>
  </AssignVariable>
  <!-- Get the value of config.protocol and create a new variable, protocol -->
  <AssignVariable>
    <Name>protocol</Name>
    <Ref>config.protocol</Ref>
    <Value>default</Value>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

Trong chính sách thứ hai, phần tử <Ref> tham chiếu đến biến nguồn và các phần tử <Name> chỉ định tên của các biến mới. Nếu không truy cập được biến được tham chiếu bởi phần tử <Ref>, bạn có thể sử dụng giá trị do phần tử <Value> chỉ định.

Cách dùng thử bộ chính sách này:

  1. Thêm chính sách #1 và #2 vào quy trình yêu cầu. Hãy nhớ đặt chính sách #1 trước chính sách #2.
  2. Thêm chính sách thứ ba trong luồng phản hồi.
  3. Chính sách thứ ba sử dụng phần tử <Set> để thêm các biến vào phản hồi. Ví dụ sau đây tạo một tải trọng XML trong phản hồi mà Edge trả về cho ứng dụng khách:
    <!-- Policy #3: Add variables to the response -->
    <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload">
      <DisplayName>put-em-in-the-payload</DisplayName>
      <Set>
        <Payload contentType="application/xml">
          <wrapper>
            <secret>{secret}</secret>
            <config>
              <environment>{environment}</environment>
              <protocol>{protocol}</protocol>
            </config>
          </wrapper>
        </Payload>
      </Set>
      <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
      <AssignTo createNew="false" transport="http" type="response"/>
    </AssignMessage>

    Xin lưu ý rằng cú pháp để truy cập các biến flow trong <Set> là gói các biến đó trong dấu ngoặc nhọn.

    Nhớ đặt thuộc tính contentType của phần tử <Payload> thành "application/xml".

  4. Gửi yêu cầu đến proxy API; ví dụ:
    curl -vL https://ahamilton-eval-test.apigee.net/myproxy

    Nếu muốn, bạn có thể chuyển kết quả qua một tiện ích như xmllint để XML hiển thị theo cấu trúc được định dạng đẹp mắt:

    curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -

    Nội dung của phản hồi sẽ có dạng như sau:

    <wrapper>
      <secret>42</secret>
      <config>
        <environment>test</environment>
        <protocol>gopher</protocol>
      </config>
    </wrapper>

7: Lấy tiêu đề phản hồi của Chú thích dịch vụ

Trong ví dụ sau, giả sử chính sách ServiceCallout nằm trong yêu cầu proxy API và phản hồi chú thích chứa nhiều tiêu đề có cùng tên (Set-Cookie). Giả sử biến phản hồi của Chú thích dịch vụ là calloutResponse mặc định, thì chính sách sau đây sẽ nhận được giá trị tiêu đề Set-Cookie thứ hai.

<AssignMessage continueOnError="false" enabled="true" name="get-header">
  <Set>
    <Payload contentType="application/json">
      {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Để liệt kê tất cả giá trị tiêu đề, hãy sử dụng biến sau:

{calloutResponse.header.Set-Cookie.values}

Mỗi phần tử con trong tài liệu tham khảo này đều có các ví dụ bổ sung. Để biết thêm ví dụ, hãy xem ví dụ về AssignMessage trên GitHub.

Tham chiếu phần tử con

Phần này mô tả các phần tử con của <AssignMessage>.

<Add>

Thêm thông tin vào yêu cầu hoặc phản hồi do phần tử <AssignTo> chỉ định.

Phần tử <Add> thêm các thuộc tính mới vào tin nhắn không có trong tin nhắn gốc. Để thay đổi giá trị của các thuộc tính hiện có, hãy sử dụng phần tử <Set>.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Loại phức tạp
Phần tử mẹ <AssignMessage>
Phần tử con <FormParams>
<Headers>
<QueryParams>

Phần tử <Add> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Ví dụ 1

Ví dụ sau sử dụng phần tử <FormParams> để lấy giá trị của ba tham số chuỗi truy vấn từ yêu cầu ban đầu và đặt các tham số đó làm tham số biểu mẫu trên yêu cầu điểm cuối mục tiêu:

<AssignMessage continueOnError="false" enabled="true" name="add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="name">{request.queryparam.name}</FormParam>
      <FormParam name="zip">{request.queryparam.zipCode}</FormParam>
      <FormParam name="lang">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <AssignTo transport="http" type="request"/>
</AssignMessage>

Ví dụ 2

Ví dụ sau sử dụng phần tử <Headers> để thêm tiêu đề User-Agent vào yêu cầu điểm cuối mục tiêu:

<AssignMessage continueOnError="false" enabled="true" name="add-headers-1">
  <Add>
    <Headers>
      <Header name="user-agent">{request.user.agent}</Header>
    </Headers>
  </Add>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ 3

Ví dụ sau sử dụng phần tử <QueryParams> để thêm một tham số truy vấn duy nhất có giá trị tĩnh vào yêu cầu:

<AssignMessage continueOnError="false" enabled="true" name="add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ này sử dụng <Add> trong luồng yêu cầu trước. Nếu bạn xem kết quả trong một công cụ như Công cụ theo dõi, thì yêu cầu đến "http://httpbin.org/get" sẽ trở thành "http://httpbin.org/get?myParam=42".

Các phần tử con của <Add> hỗ trợ tính năng thay thế chuỗi động, còn gọi là tạo mẫu thông báo.

<FormParams> (thành phần con của <Add>)

Thêm các tham số biểu mẫu mới vào thông báo yêu cầu. Phần tử này không ảnh hưởng đến thông báo phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <FormParam>
Phần tử mẹ <Add>
Phần tử con <FormParam>

Phần tử <FormParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>
  </Add>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây thêm một thông số biểu mẫu ("answer") và một giá trị tĩnh ("42") vào yêu cầu:

<AssignMessage continueOnError="false" enabled="true" name="add-formparams-1">
  <Add>
    <FormParams>
      <FormParam name="answer">42</FormParam>
    </FormParams>
  </Add>
  <AssignTo transport="http" type="request"></AssignTo>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây sẽ lấy giá trị của tham số chuỗi truy vấn name và thêm giá trị đó vào yêu cầu dưới dạng tham số biểu mẫu:

<AssignMessage continueOnError="false" enabled="true" name="add-formparams-2">
  <Add>
    <FormParam name="name">{request.queryparam.name}</FormParam>
  </Add>
</AssignMessage>

Lưu ý rằng ví dụ này không chỉ định mục tiêu bằng <AssignTo>. Chính sách này chỉ thêm tham số vào yêu cầu.

Ví dụ 3

Ví dụ sau đây sẽ thêm nhiều tham số biểu mẫu vào yêu cầu:

<AssignMessage continueOnError="false" enabled="true" name="add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="name">{request.queryparam.name}</FormParam>
      <FormParam name="zip">{request.queryparam.zipCode}</FormParam>
      <FormParam name="lang">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <AssignTo transport="http" type="request"/>
</AssignMessage>

Ví dụ này lấy các tham số chuỗi truy vấn từ yêu cầu ban đầu và thêm các tham số đó dưới dạng tham số biểu mẫu vào yêu cầu được gửi đến điểm cuối mục tiêu.

Bạn có thể sử dụng Công cụ theo dõi để xem luồng. Bạn sẽ thấy rằng nội dung của yêu cầu chứa dữ liệu biểu mẫu được mã hoá URL, ban đầu được truyền vào dưới dạng tham số chuỗi truy vấn:

%7Busername%7D=nick&%7Bzip_code%7D=90210&%7Bdefault_language%7D=en

Bạn chỉ có thể sử dụng <FormParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: POST
  • Loại thông báo: Yêu cầu
  • Một (hoặc cả hai) điều kiện sau:
    • Dữ liệu biểu mẫu: Đặt thành một giá trị hoặc "" (chuỗi trống). Ví dụ: với curl, hãy thêm -d "" vào yêu cầu của bạn.
    • Tiêu đề Content-Length: Đặt thành 0 (nếu không có dữ liệu nào trong yêu cầu ban đầu; nếu không, độ dài hiện tại, tính bằng byte). Ví dụ: với curl, hãy thêm -H "Content-Length: 0" vào yêu cầu của bạn.

Ví dụ:

curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded"
  https://ahamilton-eval-test.apigee.net/am-test

Khi bạn thêm <FormParams>, Edge sẽ đặt tiêu đề Content-Type của yêu cầu thành "application/x-www-form-urlencoded" trước khi gửi thông báo đến dịch vụ mục tiêu.

<Headers> (thuộc <Add>)

Thêm tiêu đề mới vào yêu cầu hoặc phản hồi được chỉ định, được chỉ định bằng phần tử <AssignTo>.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <Header>
Phần tử mẹ <Add>
Phần tử con <Header>

Phần tử <Headers> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Add>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây sẽ thêm tiêu đề user-agent vào thông báo yêu cầu và chỉ định giá trị của biến flow request.user.agent cho tiêu đề đó.

<AssignMessage continueOnError="false" enabled="true" name="add-headers-1">
  <Add>
    <Headers>
      <Header name="user-agent">{request.user.agent}</Header>
    </Headers>
  </Add>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

<QueryParams> (thuộc <Add>)

Thêm các tham số truy vấn mới vào yêu cầu. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <QueryParam>
Phần tử mẹ <Add>
Phần tử con <QueryParam>

Phần tử <QueryParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Add>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây thêm tham số truy vấn "myParam" vào yêu cầu và chỉ định giá trị "42" cho tham số đó:

<AssignMessage continueOnError="false" enabled="true" name="add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Bạn chỉ có thể sử dụng <QueryParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: GET
  • Loại thông báo: Yêu cầu

Ngoài ra, bạn chỉ có thể đặt tham số truy vấn khi thuộc tính type của phần tử <AssignTo> là một thông báo yêu cầu. Việc đặt các giá trị này trên phản hồi sẽ không có hiệu lực.

Nếu bạn xác định một mảng tham số truy vấn trống trong chính sách (<Add><QueryParams/></Add>), thì chính sách đó sẽ không thêm bất kỳ tham số truy vấn nào. Điều này cũng giống như việc bỏ qua <QueryParams>.

<AssignTo>

Xác định đối tượng mà chính sách AssignMessage hoạt động. Có các lựa chọn sau:

  • Thông báo yêu cầu: request mà proxy API nhận được
  • Thông báo phản hồi: response được trả về từ máy chủ mục tiêu
  • Thông báo tuỳ chỉnh: Đối tượng yêu cầu hoặc phản hồi tuỳ chỉnh

Xin lưu ý rằng trong một số trường hợp, bạn không thể thay đổi đối tượng mà chính sách AssignMessage tác động đến. Ví dụ: bạn không thể sử dụng <Add> hoặc <Set> để thêm hoặc thay đổi tham số truy vấn (<QueryParams>) hoặc tham số biểu mẫu (<FormParams>) trên phản hồi. Bạn chỉ có thể thao tác với các tham số truy vấn và tham số biểu mẫu trên yêu cầu.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignMessage>
Phần tử con Không có

Nếu bạn không chỉ định <AssignTo>, chính sách sẽ hoạt động trên yêu cầu hoặc phản hồi mặc định, dựa trên vị trí thực thi chính sách. Nếu chính sách thực thi trong luồng yêu cầu, thì chính sách đó sẽ ảnh hưởng đến thông báo yêu cầu. Nếu thực thi trong luồng phản hồi, theo mặc định, chính sách sẽ ảnh hưởng đến phản hồi.

Phần tử <AssignTo> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây chỉ định rằng mục tiêu là yêu cầu ban đầu sẽ được gửi đến điểm cuối mục tiêu:

<AssignMessage name="assignto-1">
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Bằng cách đặt createNew thành "false" (mặc định), ví dụ này sẽ không tạo một yêu cầu mới. Tất cả thao tác trong chính sách này đều ảnh hưởng đến yêu cầu ban đầu.

Ví dụ 2

Ví dụ sau đây sẽ tạo một đối tượng yêu cầu mới:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Khi bạn tạo một đối tượng yêu cầu hoặc phản hồi mới, các phần tử khác của chính sách AssignMessage (chẳng hạn như <Add>, <Set><Set>) sẽ hoạt động trên đối tượng yêu cầu mới đó.

Bạn có thể truy cập vào đối tượng yêu cầu mới trong các chính sách khác sau này trong quy trình hoặc gửi đối tượng yêu cầu mới đến một dịch vụ bên ngoài bằng chính sách ServiceCallout.

Ví dụ 3

Ví dụ sau đây tạo một đối tượng yêu cầu mới có tên là "MyRequestObject":

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"&gt;MyRequestObject&lt;/AssignTo>
</AssignMessage>

Khi bạn tạo một đối tượng yêu cầu hoặc phản hồi mới, các phần tử khác của chính sách AssignMessage (chẳng hạn như <Add>, <Set><Set>) sẽ hoạt động trên đối tượng yêu cầu mới đó.

Bạn có thể truy cập vào đối tượng yêu cầu mới trong các chính sách khác sau này trong quy trình hoặc gửi đối tượng yêu cầu mới đến một dịch vụ bên ngoài bằng chính sách ServiceCallout.

Bảng sau đây mô tả các thuộc tính của <AssignTo>:

Thuộc tính Mô tả Bắt buộc? Loại
createNew

Xác định xem chính sách này có tạo thông báo mới khi chỉ định giá trị hay không.

Nếu "true", thì chính sách sẽ tạo một biến mới thuộc loại do type chỉ định ("yêu cầu" hoặc "phản hồi"). Nếu bạn không chỉ định tên của biến mới, thì chính sách sẽ tạo một yêu cầu hoặc đối tượng phản hồi mới, dựa trên giá trị của type.

Nếu là "false", thì chính sách sẽ phản hồi theo một trong hai cách sau:

  • Nếu <AssignTo> có thể phân giải tên biến thành một yêu cầu hoặc phản hồi, thì biến này sẽ tiếp tục xử lý. Ví dụ: nếu chính sách nằm trong luồng yêu cầu, thì biến đó là đối tượng yêu cầu. Nếu chính sách nằm trong một phản hồi, thì biến đó là đối tượng phản hồi.
  • Nếu không thể phân giải <AssignTo> hoặc phân giải thành một loại không phải là thông báo, thì chính sách sẽ gửi một lỗi.

Nếu bạn không chỉ định createNew, thì chính sách sẽ phản hồi theo một trong hai cách sau:

  • Nếu <AssignTo> phân giải thành một thông báo, thì quá trình xử lý sẽ chuyển sang bước tiếp theo.
  • Nếu không thể phân giải <AssignTo> hoặc phân giải thành một loại không phải là thông báo, thì một biến mới thuộc loại được chỉ định trong type sẽ được tạo.
Không bắt buộc Boolean
transport

Chỉ định loại phương thức truyền tải cho loại thông báo yêu cầu hoặc phản hồi.

Giá trị mặc định là "http" (giá trị duy nhất được hỗ trợ).

Không bắt buộc Chuỗi
type Chỉ định loại thông báo mới khi createNew là "true". Các giá trị hợp lệ là "yêu cầu" hoặc "phản hồi".

Giá trị mặc định là "yêu cầu". Nếu bạn bỏ qua thuộc tính này, Edge sẽ tạo một yêu cầu hoặc phản hồi, tuỳ thuộc vào vị trí trong luồng mà chính sách này thực thi.

Không bắt buộc Chuỗi

<AssignVariable>

Chỉ định giá trị cho biến luồng đích (ví dụ: biến có giá trị do chính sách AssignMessage đặt). Nếu biến flow không tồn tại, thì <AssignVariable> sẽ tạo biến đó.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Loại phức tạp
Phần tử mẹ <AssignMessage>
Phần tử con <Name> (bắt buộc)
<Ref>
<Template>
<Value>

Giá trị mà bạn chỉ định cho biến flow đích có thể là một trong những giá trị sau:

  • Chuỗi cố định: Sử dụng phần tử con <Value> để chỉ định giá trị chuỗi cố định cho biến luồng đích.
  • Biến flow: Sử dụng phần tử con <Ref> để chỉ định giá trị của biến flow hiện có cho biến flow đích. Để xem danh sách đầy đủ các biến dòng chảy có thể dùng làm nguồn, hãy xem phần Tài liệu tham khảo về biến dòng chảy.
  • Mẫu thông báo: Sử dụng phần tử con <Template> để chỉ định mẫu thông báo cho biến luồng đích.

Phần tử <AssignVariable> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
    <Ref>source_variable</Ref>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
    <Value>variable_value</Value>
  </AssignVariable>
</AssignMessage>

Sử dụng phần tử <Ref> để chỉ định biến nguồn. Nếu không truy cập được biến được tham chiếu bởi <Ref>, Edge sẽ sử dụng giá trị do phần tử <Value> chỉ định. Nếu bạn xác định <Template>, phần tử này sẽ được ưu tiên hơn các phần tử con khác.

Ví dụ 1

Ví dụ sau đây đặt giá trị của một biến mới, myvar, thành giá trị cố định "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây gán giá trị của biến flow (luồng) request.header.user-agent cho biến flow đích myvar và giá trị của tham số truy vấn country cho biến flow đích Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Nếu một trong hai lượt gán không thành công, Edge sẽ gán giá trị "ErrorOnCopy" cho biến luồng đích.

Nếu biến flow myvar hoặc Country không tồn tại, thì <AssignVariable> sẽ tạo các biến đó.

Ví dụ 3

Ví dụ sau đây sử dụng phần tử con <Template> để nối hai biến ngữ cảnh với một chuỗi cố định (dấu gạch nối) giữa các biến đó:

<AssignMessage name='template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

Một cách sử dụng phổ biến của <AssignVariable> là đặt giá trị mặc định cho tham số truy vấn, tiêu đề hoặc giá trị khác có thể được truyền vào cùng với yêu cầu. Bạn thực hiện việc này bằng cách kết hợp cả phần tử con <Ref><Value>. Để biết thêm thông tin, hãy xem các ví dụ về <Ref>.

<Name> (thuộc <AssignVariable>)

Chỉ định tên của biến luồng đích (ví dụ: biến có giá trị do chính sách AssignMessage đặt). Nếu biến có tên trong <AssignVariable> không tồn tại, chính sách sẽ tạo một biến có tên đó.

Giá trị mặc định không áp dụng
Bắt buộc? Bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignVariable>
Phần tử con Không có

Phần tử <Name> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
  </AssignVariable>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây chỉ định biến đích là myvar và đặt biến đó thành giá trị cố định "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Nếu myvar không tồn tại, <AssignVariable> sẽ tạo tệp đó.

<Ref> (thuộc <AssignVariable>)

Chỉ định nguồn của giá trị gán dưới dạng biến flow. Biến flow có thể là một trong các biến flow được xác định trước (như được liệt kê trong Tài liệu tham khảo về biến flow) hoặc một biến flow tuỳ chỉnh mà bạn đã tạo.

Giá trị của <Ref> luôn được diễn giải là biến flow; bạn không thể chỉ định một chuỗi cố định làm giá trị. Để gán giá trị chuỗi cố định, hãy sử dụng phần tử <Value>.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignVariable>
Phần tử con Không có

Khi bạn chỉ định một biến flow bằng <Ref>, hãy bỏ qua dấu ngoặc nhọn "{}" mà bạn thường dùng để tham chiếu đến một biến flow. Ví dụ: để đặt giá trị của biến mới thành giá trị của biến luồng client.host:

Do this (no brackets):
  <Ref>client.host</Ref>

Do NOT do this (brackets):
  <Ref>{client.host}</Ref>

Để xác định giá trị mặc định cho biến luồng đích, hãy sử dụng <Value> kết hợp với <Ref>. Nếu biến flow do <Ref> chỉ định không tồn tại, không thể đọc hoặc có giá trị rỗng, thì Edge sẽ gán giá trị của <Value> cho biến flow đích.

Phần tử <Ref> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
    <Ref>source_variable</Ref>
  </AssignVariable>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây gán giá trị của biến flow (luồng) request.header.user-agent cho biến flow đích myvar và giá trị của tham số truy vấn country cho biến Country:

<AssignMessage name="assignvariable-4">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

Trong ví dụ này, Edge không có giá trị mặc định (hoặc giá trị dự phòng) được chỉ định cho bất kỳ giá trị nào được gán.

Ví dụ 2

Ví dụ sau đây gán giá trị của biến flow request.header.user-agent cho biến flow đích myvar và giá trị của tham số truy vấn country cho biến Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Trong ví dụ này, nếu giá trị của biến flow request.header.user-agent hoặc tham số truy vấn Country là rỗng, không đọc được hoặc có định dạng không chính xác, thì Edge sẽ gán giá trị "ErrorOnCopy" cho các biến mới.

Ví dụ 3

Một trường hợp sử dụng phổ biến của <AssignVariable> là đặt giá trị mặc định của một tham số truy vấn, tiêu đề hoặc giá trị khác có thể được truyền vào cùng với yêu cầu. Ví dụ: bạn tạo một proxy API thời tiết, trong đó yêu cầu sẽ lấy một tham số truy vấn duy nhất có tên là "w". Tham số này chứa mã nhận dạng của thành phố mà bạn muốn biết thông tin thời tiết. URL yêu cầu có dạng:

http://myCO.com/v1/weather/forecastrss?w=city_ID

Để xác định giá trị mặc định cho "w", hãy tạo chính sách AssignMessage như sau:

<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3">
  <AssignTo createNew="false" transport="http" type="request"/>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>request.queryparam.w</Name>
    <Ref>request.queryparam.w</Ref>
    <Value>12797282</Value>
  </AssignVariable>
</AssignMessage>

Trong ví dụ này, <AssignVariable> lấy giá trị của request.queryparam.w và gán giá trị đó cho chính nó. Nếu biến flow có giá trị rỗng, nghĩa là tham số truy vấn "w" đã bị bỏ qua khỏi yêu cầu, thì ví dụ này sẽ sử dụng giá trị mặc định từ phần tử <Value>. Do đó, bạn có thể gửi yêu cầu đến proxy API này mà bỏ qua tham số truy vấn "w":

http://myCO.com/v1/weather/forecastrss

...và vẫn có proxy API trả về kết quả hợp lệ.

Không giống như khi sử dụng <Value>, giá trị của <Ref> phải là một biến flow, chẳng hạn như thuộc tính của đối tượng request, response hoặc target. Giá trị này cũng có thể là một biến luồng tuỳ chỉnh mà bạn đã tạo.

Nếu bạn chỉ định một biến flow không tồn tại cho giá trị của <Ref> và giá trị của <IgnoreUnresolvedVariables> là "true", Edge sẽ gửi một lỗi.

<Template> (thành phần con của <AssignVariable>)

Chỉ định một mẫu tin nhắn. Mẫu thông báo cho phép bạn thực hiện việc thay thế chuỗi biến khi chính sách thực thi và có thể kết hợp các chuỗi cố định với tên biến được gói trong dấu ngoặc nhọn. Ngoài ra, mẫu tin nhắn còn hỗ trợ các hàm như thoát và chuyển đổi trường hợp.

Sử dụng thuộc tính ref để chỉ định một biến flow, trong đó giá trị của biến là một mẫu thông báo. Ví dụ: bạn có thể lưu trữ mẫu thông báo dưới dạng thuộc tính tuỳ chỉnh trên ứng dụng của nhà phát triển. Khi Edge xác định ứng dụng của nhà phát triển sau khi xác minh khoá API hoặc mã thông báo bảo mật (thông qua một chính sách bổ sung), phần tử <AssignVariable> có thể sử dụng mẫu thông báo từ thuộc tính tuỳ chỉnh của ứng dụng. Mẫu này có sẵn dưới dạng biến luồng từ chính sách bảo mật. Ví dụ sau giả định rằng mẫu thông báo có sẵn trong thuộc tính khách hàng có tên là message_template trên ứng dụng của nhà phát triển thực hiện lệnh gọi API, trong đó chính sách VerifyAPIKey được dùng để xác minh khoá API của ứng dụng:

<AssignVariable ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignVariable>
Phần tử con Không có

Phần tử <Template> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Template>message_template</Template>
    or
    <Template ref='template_variable'></Template>
  </AssignVariable>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây sử dụng cú pháp tạo mẫu thông báo để nối hai biến ngữ cảnh với một chuỗi cố định (dấu gạch nối) giữa các biến đó:

<AssignMessage name='template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây chỉ định một biến flow, trong đó giá trị của biến là một mẫu thông báo được xác định trước. Sử dụng tuỳ chọn này nếu bạn muốn chèn một mẫu được xác định trước trong thời gian chạy mà không cần sửa đổi chính sách:

<AssignMessage name='template-2'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template ref='my_template_variable'/>

  </AssignVariable>
</AssignMessage>

Ví dụ 3

Ví dụ sau đây chỉ định một biến flow và một giá trị văn bản. Trong trường hợp này, nếu biến được tham chiếu không phải là giá trị rỗng, thì giá trị đó sẽ được dùng làm mẫu. Nếu giá trị được tham chiếu là rỗng, thì giá trị văn bản (trong trường hợp này là {system.uuid}-{messageid}) sẽ được dùng làm mẫu. Mẫu này hữu ích để cung cấp giá trị "ghi đè", trong đó trong một số trường hợp, bạn muốn ghi đè mẫu mặc định (phần văn bản) bằng các giá trị được đặt một cách linh động. Ví dụ: câu lệnh có điều kiện có thể lấy một giá trị từ bản đồ khoá-giá trị và đặt biến được tham chiếu thành giá trị đó:

<AssignMessage name='template-2'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template ref='my_variable'>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

<Value> (thành phần con của <AssignVariable>)

Xác định giá trị của biến luồng đích được đặt bằng <AssignVariable>. Giá trị này luôn được diễn giải là một chuỗi cố định; bạn không thể sử dụng biến flow làm giá trị, ngay cả khi bạn gói giá trị đó trong dấu ngoặc đơn ("{}"). Để sử dụng biến flow, hãy sử dụng <Ref>.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignVariable>
Phần tử con Không có

Khi được sử dụng kết hợp với phần tử <Ref>, <Value> đóng vai trò là giá trị mặc định (hoặc dự phòng). Nếu bạn không chỉ định <Ref>, không thể phân giải hoặc giá trị là rỗng, thì giá trị của <Value> sẽ được sử dụng.

Phần tử <Value> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <AssignVariable>
    <Name>variable_name</Name>
    <Value>variable_value</Value>
  </AssignVariable>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt giá trị của biến luồng đích, myvar, thành giá trị cố định "42":

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây gán giá trị của biến flow (luồng) request.header.user-agent cho biến flow (luồng) myvar và giá trị của tham số truy vấn country cho biến Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Nếu một trong hai lượt gán không thành công, <AssignVariable> sẽ gán giá trị "ErrorOnCopy" cho biến luồng đích.

<Copy>

Sao chép giá trị từ thông báo do thuộc tính source chỉ định sang thông báo do phần tử <AssignTo> chỉ định. Nếu bạn không chỉ định mục tiêu bằng <AssignTo>, thì chính sách này sẽ sao chép các giá trị vào yêu cầu hoặc phản hồi, tuỳ thuộc vào vị trí trong luồng mà chính sách này thực thi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignMessage>
Phần tử con <FormParams>
<Headers>
<Path>
<Payload>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

Phần tử <Copy> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
    <Copy source="[request|response]">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>[false|true]</ReasonPhrase>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>
  <!-- Used as the destination for the <Copy> values -->
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">destination_variable_name</AssignTo>
</AssignMessage>
  

Ví dụ 1

Ví dụ sau đây sao chép một tiêu đề, ba tham số biểu mẫu, đường dẫn và tất cả tham số truy vấn từ yêu cầu sang một yêu cầu tuỳ chỉnh mới:

<AssignMessage continueOnError="false" enabled="true" name="copy-1">
  <Copy source="request">
    <Headers>
      <Header name="Header_Name_1">Header value 1</Header>
    </Headers>
    <FormParams>
      <FormParam name="Form_Param_Name_1">Form param value 1</FormParam>
      <FormParam name="Form_Param_Name_2">Form param value 1</FormParam>
      <FormParam name="Form_Param_Name_3">Form param value 1</FormParam>
    </FormParams>
    <Payload>false</Payload>
    <Path>true</Path>
    <QueryParams/>
    <ReasonPhrase>false</ReasonPhrase>
    <StatusCode>false</StatusCode>
    <Verb>false</Verb>
    <Version>false</Version>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Phần tử <Copy> có các thuộc tính như sau:

Thuộc tính Mô tả Bắt buộc? Loại
source

Chỉ định đối tượng nguồn của bản sao.

  • Nếu không chỉ định source, thì thông báo này sẽ được coi là một thông báo đơn giản. Ví dụ: nếu chính sách nằm trong luồng yêu cầu, thì nguồn sẽ mặc định là đối tượng request. Nếu chính sách nằm trong luồng phản hồi, thì chính sách đó sẽ mặc định là đối tượng response. Nếu bỏ qua source, bạn có thể sử dụng tham chiếu tuyệt đối đến một biến flow làm nguồn của bản sao. Ví dụ: chỉ định giá trị là {request.header.user-agent}.
  • Nếu không thể phân giải biến nguồn hoặc phân giải thành loại không phải là thông báo, thì <Copy> sẽ không phản hồi.
Không bắt buộc Chuỗi

<FormParams> (thành phần con của <Copy>)

Sao chép các tham số biểu mẫu từ yêu cầu do thuộc tính source của phần tử <Copy> chỉ định cho yêu cầu do phần tử <AssignTo> chỉ định. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <FormParam> hoặc một mảng trống
Phần tử mẹ <Copy>
Phần tử con <FormParam>

Phần tử <FormParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây sao chép một tham số biểu mẫu từ yêu cầu sang yêu cầu tuỳ chỉnh "MyCustomRequest":

<AssignMessage name="copy-formparams-1">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName">Form param value 1</FormParam>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây sao chép tất cả các tham số của biểu mẫu vào yêu cầu tuỳ chỉnh "MyCustomRequest":

<AssignMessage name="copy-formparams-2">
  <Copy source="request">
    <FormParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 3

Ví dụ sau đây sao chép ba tham số biểu mẫu vào yêu cầu tuỳ chỉnh "MyCustomRequest":

<AssignMessage name="copy-formparams-3">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName1"/>
      <FormParam name="paramName2"/>
      <FormParam name="paramName3"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 4

Nếu có nhiều tham số biểu mẫu có cùng tên, hãy sử dụng cú pháp sau:

<AssignMessage name="copy-formparams-4">
  <Copy source="request">
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ này sao chép "f1", "f2" và giá trị thứ hai của "f3". Nếu "f3" chỉ có một giá trị, thì giá trị đó sẽ không được sao chép.

Bạn chỉ có thể sử dụng <FormParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: POST
  • Loại thông báo: Phản hồi
  • Một (hoặc cả hai) điều kiện sau:
    • Dữ liệu biểu mẫu: Đặt thành một giá trị hoặc "" (chuỗi trống). Ví dụ: với curl, hãy thêm -d "" vào yêu cầu của bạn.
    • Tiêu đề Content-Length: Đặt thành 0 (nếu không có dữ liệu nào trong yêu cầu ban đầu; nếu không, hãy đặt thành độ dài hiện tại. Ví dụ: với curl, hãy thêm -H "Content-Length: 0" vào yêu cầu của bạn.

Khi bạn sao chép <FormParams>, <Copy> sẽ đặt Content-Type của thông báo thành "application/x-www-form-urlencoded" trước khi gửi thông báo đến dịch vụ mục tiêu.

<Headers> (thành phần con của <Copy>)

Sao chép tiêu đề HTTP từ thông báo yêu cầu hoặc phản hồi do thuộc tính source của phần tử <Copy> chỉ định sang thông báo yêu cầu hoặc phản hồi do phần tử <AssignTo> chỉ định.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Một mảng gồm các phần tử <Header> hoặc một mảng trống
Phần tử mẹ <Copy>
Phần tử con <Header>

Phần tử <Headers> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây sao chép tiêu đề user-agent từ yêu cầu sang đối tượng yêu cầu tuỳ chỉnh mới:

<AssignMessage name="copy-headers-1">
  <Copy source="request">
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 2

Để sao chép tất cả tiêu đề, hãy sử dụng phần tử <Headers> trống, như trong ví dụ sau:

<AssignMessage name="copy-headers-2">
  <Copy source="request">
    <Headers/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 3

Nếu có nhiều tiêu đề có cùng tên, hãy sử dụng cú pháp sau:

<AssignMessage name="copy-headers-3">
  <Copy source="request">
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ này sao chép "h1", "h2" và giá trị thứ hai của "h3". Nếu "h3" chỉ có một giá trị, thì giá trị đó sẽ không được sao chép.

<Path> (thành phần con của <Copy>)

Xác định xem có nên sao chép đường dẫn từ yêu cầu nguồn sang yêu cầu đích hay không. Phần tử này không ảnh hưởng đến phản hồi.

Nếu "đúng", chính sách này sẽ sao chép đường dẫn từ thông báo yêu cầu do thuộc tính source của phần tử <Copy> chỉ định sang thông báo yêu cầu do phần tử <AssignTo> chỉ định.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Copy>
Phần tử con Không có

Phần tử <Path> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Path>[false|true]</Path>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây cho biết rằng chính sách AssignMessage sẽ sao chép đường dẫn từ yêu cầu nguồn sang đối tượng yêu cầu tuỳ chỉnh mới:

<AssignMessage name="copy-path-1">
  <Copy source="request">
    <Path>true</Path>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <Path> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Yêu cầu

<Payload> (thành phần con của <Copy>)

Xác định xem có nên sao chép tải trọng từ nguồn sang đích hay không. Nguồn và đích đến có thể là yêu cầu hoặc phản hồi.

Nếu "đúng", chính sách này sẽ sao chép tải trọng từ thông báo do thuộc tính source của phần tử <Copy> chỉ định sang thông báo do phần tử <AssignTo> chỉ định.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Copy>
Phần tử con Không có

Phần tử <Payload> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Payload>[false|true]</Payload>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <Payload> thành "true" để tải trọng yêu cầu được sao chép từ yêu cầu sang phản hồi:

<AssignMessage name="copy-payload-1">
  <Copy source="request">
    <Payload>true</Payload>
  </Copy>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

<QueryParams> (thành phần con của <Copy>)

Sao chép các tham số chuỗi truy vấn từ yêu cầu do thuộc tính source của phần tử <Copy> chỉ định sang yêu cầu do phần tử <AssignTo> chỉ định. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Một mảng gồm các phần tử <QueryParam> hoặc một mảng trống
Phần tử mẹ <QueryParam>
Phần tử con Không có

Phần tử <QueryParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây sao chép tham số truy vấn "my_param" từ yêu cầu vào một đối tượng yêu cầu tuỳ chỉnh mới:

<AssignMessage name="copy-queryparams-1">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="my_param"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây sao chép tất cả các tham số truy vấn từ yêu cầu vào một đối tượng yêu cầu tuỳ chỉnh mới:

<AssignMessage name="copy-queryparams-2">
  <Copy source="request">
    <QueryParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ 3

Nếu có nhiều tham số truy vấn có cùng tên, hãy sử dụng cú pháp sau:

<AssignMessage name="copy-queryparams-3">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="qp1"/>
      <QueryParam name="qp2"/>
      <QueryParam name="qp3.2"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ví dụ này sao chép "qp1", "qp2" và giá trị thứ hai của "qp3". Nếu "qp3" chỉ có một giá trị, thì giá trị đó sẽ không được sao chép.

Bạn chỉ có thể sử dụng <QueryParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: GET
  • Loại thông báo: Yêu cầu

<ReasonPhrase> (thành phần con của <Copy>)

Xác định xem có nên sao chép cụm từ lý do từ phản hồi nguồn sang phản hồi đích hay không. Phần tử này không ảnh hưởng đến yêu cầu.

Nếu "đúng", chính sách này sẽ sao chép ReasonPhrase từ phản hồi do thuộc tính source của phần tử <Copy> chỉ định sang phản hồi do phần tử <AssignTo> chỉ định.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Copy>
Phần tử con Không có

Phần tử <ReasonPhrase> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <ReasonPhrase>[false|true]</ReasonPhrase>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <ReasonPhrase> thành "true", khiến <Copy> sao chép cụm từ lý do từ phản hồi mặc định sang đối tượng phản hồi tuỳ chỉnh:

<AssignMessage name="copy-reasonphrase-1">
  <Copy source="response">
    <ReasonPhrase>true</ReasonPhrase>
  </Copy>
  <AssignTo createNew="trie" transport="http" type="response">MyCustomResponse</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <ReasonPhrase> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Phản hồi

<StatusCode> (thuộc <Copy>)

Xác định xem mã trạng thái có được sao chép từ phản hồi nguồn sang phản hồi đích hay không. Phần tử này không ảnh hưởng đến yêu cầu.

Nếu "đúng", chính sách này sẽ sao chép mã trạng thái từ thông báo phản hồi do thuộc tính source của phần tử <Copy> chỉ định sang thông báo phản hồi do phần tử <AssignTo> chỉ định.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Copy>
Phần tử con Không có

Phần tử <StatusCode> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <StatusCode>[false|true]</StatusCode>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <StatusCode> thành "true", sao chép mã trạng thái từ đối tượng phản hồi mặc định sang một đối tượng phản hồi tuỳ chỉnh mới:

<AssignMessage name="copy-statuscode-1">
  <Copy source="response">
    <StatusCode>true</StatusCode>
  </Copy>
  <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <StatusCode> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Phản hồi

Một cách sử dụng phổ biến của <StatusCode> là đảm bảo rằng phản hồi của proxy có cùng trạng thái với phản hồi nhận được từ mục tiêu khi thuộc tính createNew của <AssignTo> được đặt thành "true".

<Verb> (thành phần con của <Copy>)

Xác định xem động từ HTTP có được sao chép từ yêu cầu nguồn sang yêu cầu đích hay không. Phần tử này không ảnh hưởng đến phản hồi.

Nếu "đúng", hãy sao chép động từ tìm thấy trong thuộc tính source của phần tử <Copy> vào yêu cầu được chỉ định trong phần tử <AssignTo>.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Copy>
Phần tử con Không có

Phần tử <Verb> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Verb>[false|true]</Verb>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <Verb> thành "true" (đúng), sao chép động từ từ yêu cầu mặc định sang một yêu cầu tuỳ chỉnh mới:

<AssignMessage name="copy-verb-1">
  <Copy source="request">
    <Verb>true</Verb>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <Verb> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Yêu cầu

<Version> (thành phần con của <Copy>)

Xác định xem phiên bản HTTP có được sao chép từ yêu cầu nguồn sang yêu cầu đích hay không. Phần tử này không ảnh hưởng đến phản hồi.

Nếu "đúng", hãy sao chép phiên bản HTTP có trong thuộc tính source của phần tử <Copy> vào đối tượng do phần tử <AssignTo> chỉ định.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Copy>
Phần tử con Không có

Phần tử <Version> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Copy source="[request|response]">
    <Version>[false|true]</Version>
  </Copy>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <Version> thành "true" trên yêu cầu, sao chép phiên bản từ đối tượng yêu cầu mặc định sang một đối tượng yêu cầu tuỳ chỉnh mới:

<AssignMessage name="copy-version-1">
  <Copy source="request">
    <Version>true</Version>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <Version> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Yêu cầu

<DisplayName>

Sử dụng cùng với thuộc tính name để gắn nhãn chính sách trong trình chỉnh sửa proxy giao diện người dùng quản lý bằng một tên khác, nghe tự nhiên hơn.

Phần tử <DisplayName> là phần tử chung cho tất cả các chính sách.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc. Nếu bạn bỏ qua <DisplayName>, giá trị của thuộc tính name của chính sách sẽ được sử dụng
Loại Chuỗi
Phần tử mẹ <PolicyElement>
Phần tử con Không có

Phần tử <DisplayName> sử dụng cú pháp sau:

Cú pháp

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

Ví dụ:

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

Phần tử <DisplayName> không có thuộc tính hoặc phần tử con nào.

<IgnoreUnresolvedVariables>

Xác định xem quá trình xử lý có dừng lại khi gặp một biến chưa được phân giải hay không.

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <AssignMessage>
Phần tử con Không có

Đặt thành true để bỏ qua các biến chưa được phân giải và tiếp tục xử lý; nếu không, false. Giá trị mặc định là false.

Việc đặt <IgnoreUnresolvedVariables> thành true khác với việc đặt continueOnError của <AssignMessage> thành true vì thao tác này dành riêng cho việc đặt và nhận giá trị của các biến. Nếu bạn đặt continueOnError thành true, thì Edge sẽ bỏ qua tất cả lỗi, chứ không chỉ lỗi gặp phải khi sử dụng biến.

Phần tử <IgnoreUnresolvedVariables> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <IgnoreUnresolvedVariables> thành "true":

<AssignMessage name="ignoreunresolvedvariables">
  <Copy source="response">
    ...
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  </Copy>
</AssignMessage>

<Remove>

Xoá tiêu đề, tham số truy vấn, tham số biểu mẫu và/hoặc tải trọng thông báo khỏi một thông báo. Thông báo có thể là một yêu cầu hoặc một phản hồi. Bạn chỉ định thông báo mà <Remove> sẽ xử lý bằng cách sử dụng phần tử <AssignTo>.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Loại phức tạp
Phần tử mẹ <AssignMessage>
Phần tử con <FormParams>
<Headers>
<Payload>
<QueryParams>

Một trường hợp sử dụng phổ biến của <Remove> là xoá một tham số truy vấn chứa thông tin nhạy cảm khỏi đối tượng yêu cầu đến, để tránh truyền tham số đó đến máy chủ phụ trợ.

Phần tử <Remove> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây xoá nội dung của thông báo khỏi phản hồi:

<AssignMessage continueOnError="false" enabled="true" name="remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

Trong luồng phản hồi, chính sách này sẽ xoá nội dung của phản hồi, chỉ trả về tiêu đề HTTP cho ứng dụng.

Ví dụ 2

Ví dụ sau đây xoá tất cả tham số biểu mẫu và một tham số truy vấn khỏi yêu cầu đến:

<AssignMessage continueOnError="false" enabled="true" name="remove-2">
  <Remove>
    <!-- Empty (<FormParams/>) removes all form parameters -->
    <FormParams/>
    <QueryParams>
      <QueryParam name="qp1"/>
    </QueryParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

<FormParams> (thành phần con của <Remove>)

Xoá các tham số biểu mẫu đã chỉ định khỏi yêu cầu. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <FormParam> hoặc một mảng trống
Phần tử mẹ <Remove>
Phần tử con <FormParam>

Phần tử <FormParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Remove>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây xoá 3 tham số biểu mẫu khỏi yêu cầu:

<AssignMessage name="remove-formparams-1">
  <Remove>
    <FormParams>
      <FormParam name="form_param_1"/>
      <FormParam name="form_param_2"/>
      <FormParam name="form_param_3"/>
    </FormParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="application/x-www-form-urlencoded"/>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây xoá tất cả các thông số biểu mẫu khỏi yêu cầu:

<AssignMessage name="remove-formparams-2">
  <Remove>
    <FormParams/>
  </Remove>
  <AssignTo createNew="false" transport="http" type="application/x-www-form-urlencoded"/>
</AssignMessage>

Ví dụ 3

Nếu có nhiều tham số biểu mẫu có cùng tên, hãy sử dụng cú pháp sau:

<AssignMessage name="remove-formparams-3">
  <Remove>
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="application/x-www-form-urlencoded"/>
</AssignMessage>

Ví dụ này xoá "f1", "f2" và giá trị thứ hai của "f3". Nếu "f3" chỉ có một giá trị, thì giá trị đó sẽ không bị xoá.

Bạn chỉ có thể sử dụng <FormParams> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Yêu cầu
  • Content-Type: "application/x-www-form-urlencoded"

<Headers> (thành phần con của <Remove>)

Xoá các tiêu đề HTTP đã chỉ định khỏi yêu cầu hoặc phản hồi do phần tử <AssignTo> chỉ định.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <Header> hoặc một mảng trống
Phần tử mẹ <Remove>
Phần tử con <Header>

Phần tử <Headers> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<Headers/>) -->
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Remove>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây xoá tiêu đề user-agent khỏi yêu cầu:

<AssignMessage name="remove-headers-1">
  <Remove>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây xoá tất cả tiêu đề khỏi yêu cầu:

<AssignMessage name="remove-headers-2">
  <Remove>
    <Headers/>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ 3

Nếu có nhiều tiêu đề có cùng tên, hãy sử dụng cú pháp sau:

<AssignMessage name="remove-headers-3">
  <Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ này xoá "h1", "h2" và giá trị thứ hai của "h3" khỏi yêu cầu. Nếu "h3" chỉ có một giá trị, thì thẻ này sẽ không bị xoá.

<Payload> (thành phần con của <Remove>)

Xác định xem <Remove> có xoá tải trọng trong yêu cầu hoặc phản hồi hay không, được chỉ định bằng phần tử <AssignTo>. Đặt thành "true" để xoá tải trọng; nếu không, hãy đặt thành "false". Giá trị mặc định là "false".

Giá trị mặc định Sai
Bắt buộc? Không bắt buộc
Loại Boolean
Phần tử mẹ <Remove>
Phần tử con Không có

Phần tử <Payload> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <Payload>[false|true]</Payload>
  </Remove>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt <Payload> thành "true" để xoá tải trọng yêu cầu:

<AssignMessage name="remove-payload-1">
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

<QueryParams> (thành phần con của <Remove>)

Xoá các tham số truy vấn đã chỉ định khỏi yêu cầu. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <QueryParam> hoặc một mảng trống
Phần tử mẹ <Remove>
Phần tử con <QueryParam>

Phần tử <QueryParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Remove>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây xoá một tham số truy vấn khỏi yêu cầu:

<AssignMessage name="remove-queryparams-1">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
      </QueryParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây sẽ xoá tất cả tham số truy vấn khỏi yêu cầu:

<AssignMessage name="remove-queryparams-2">
  <Remove>
      <QueryParams/>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ 3

Nếu có nhiều tham số truy vấn có cùng tên, hãy sử dụng cú pháp sau:

<AssignMessage name="remove-queryparams-3">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
        <QueryParam name="qp2"/>
        <QueryParam name="qp3.2"/>
      </QueryParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ này xoá "qp1", "qp2" và giá trị thứ hai của "qp3" khỏi yêu cầu. Nếu "qp3" chỉ có một giá trị, thì giá trị đó sẽ không bị xoá.

Ví dụ 4

Ví dụ sau đây xoá tham số truy vấn apikey khỏi yêu cầu:

<AssignMessage name="remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Bạn chỉ có thể sử dụng <QueryParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: GET
  • Loại thông báo: Yêu cầu

<Set>

Đặt thông tin trong thông báo yêu cầu hoặc phản hồi do phần tử <AssignTo> chỉ định. <Set> ghi đè các tiêu đề hoặc tham số đã tồn tại trong thông báo ban đầu. Để tạo tiêu đề hoặc tham số mới, hãy sử dụng phần tử <Add>.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Loại phức tạp
Phần tử mẹ <AssignMessage>
Phần tử con <FormParams>
<Headers>
<Payload>
<Path>
<QueryParams>
<ReasonPhrase>
<StatusCode>
<Verb>
<Version>

Phần tử <Set> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
    <Path>path</Path>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây cho thấy phần tử <Set>:

<AssignMessage continueOnError="false" enabled="true" name="set-1">
  <Set>
    <FormParams>
      <FormParam name="myparam">{request.header.myparam}</FormParam>
    </FormParams>
    <Headers>
        <Header name="user-agent">{request.header.user-agent}</Header>
    </Headers>
    <QueryParams>
      <QueryParam name="name">{request.header.name}</QueryParam>
      <QueryParam name="address">{request.header.address}</QueryParam>
    </QueryParams>
    <!-- <Verb>GET</Verb> -->
    <Payload contentType="text/plain">42</Payload>
    <Path/>
    <ReasonPhrase>Bad request</ReasonPhrase>
    <StatusCode>400</StatusCode>
    <Verb>POST</Verb>
    <Verb>{my_variable}</Verb>
    <Version>1.1</Version>
  </Set>
  <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

<FormParams> (thành phần con của <Set>)

Ghi đè các tham số biểu mẫu hiện có trên một yêu cầu và thay thế các tham số đó bằng các giá trị mới mà bạn chỉ định bằng phần tử này. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <FormParam>
Phần tử mẹ <Set>
Phần tử con <FormParam>

Phần tử <FormParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <FormParams>
      <FormParam name="formparam_name">formparam_value</FormParam>
      ...
    </FormParams>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt tham số biểu mẫu có tên "myparam" thành giá trị của biến request.header.myparam trong một yêu cầu tuỳ chỉnh mới:

<AssignMessage name="set-formparams-1">
  <Set>
    <FormParams>
      <FormParam name="myparam">{request.header.myparam}</FormParam>
    </FormParams>
  </Set>
    <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <FormParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: POST
  • Loại thông báo: Yêu cầu

Nếu bạn xác định các tham số biểu mẫu trống trong chính sách (<Add><FormParams/></Add>), thì chính sách đó sẽ không thêm bất kỳ tham số biểu mẫu nào. Điều này cũng giống như việc bỏ qua <FormParams>.

<Set> thay đổi Content-Type của thông báo thành "application/x-www-form-urlencoded" trước khi gửi thông báo đó đến điểm cuối mục tiêu.

<Headers> (thành phần con của <Set>)

Ghi đè các tiêu đề HTTP hiện có trong yêu cầu hoặc phản hồi do phần tử <AssignTo> chỉ định.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <Header>
Phần tử mẹ <Set>
Phần tử con <Header>

Phần tử <Headers> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Headers>
      <Header name="header_name">header_value</Header>
      ...
    </Headers>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt tiêu đề user-agent thành giá trị của biến request.header.user-agent:

<AssignMessage name="set-headers-1">
  <Set>
    <Headers>
      <Header name="user-agent">{request.header.user-agent}</Header>
    </Headers>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

Nếu bạn xác định tiêu đề trống trong chính sách (<Add><Headers/></Add>), thì chính sách sẽ không thêm tiêu đề nào. Điều này cũng giống như việc bỏ qua <Headers>.

<Path> (thành phần con của <Set>)

<Payload> (thành phần con của <Set>)

Xác định nội dung thông báo cho một yêu cầu hoặc phản hồi, được chỉ định bằng phần tử <AssignTo>. Tải trọng có thể là bất kỳ loại nội dung hợp lệ nào, chẳng hạn như văn bản thuần tuý, JSON hoặc XML.

Giá trị mặc định chuỗi trống
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <Set>
Phần tử con Không có

Phần tử <Payload> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Payload contentType="content_type" variablePrefix="prefix"
        variableSuffix="suffix">new_payload</Payload>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt tải trọng văn bản thuần tuý:

<AssignMessage name="set-payload-1">
  <Set>
    <Payload contentType="text/plain">42</Payload>
  </Set>
</AssignMessage>

Ví dụ 2

Ví dụ sau đây đặt tải trọng JSON:

<AssignMessage name="set-payload-2">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"bar"}
    </Payload>
  </Set>
</AssignMessage>

Ví dụ 3

Ví dụ sau đây chèn các giá trị biến vào tải trọng bằng cách gói tên biến trong dấu ngoặc nhọn:

<AssignMessage name="set-payload-3">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"{variable_name}"}
    </Payload>
  </Set>
</AssignMessage>

Trong các phiên bản cũ của Apigee Edge (ví dụ: trước bản phát hành trên đám mây 16.08.17), bạn không thể sử dụng dấu ngoặc nhọn để biểu thị tham chiếu biến trong tải trọng JSON. Trong các bản phát hành đó, bạn cần sử dụng các thuộc tính variablePrefixvariableSuffix để chỉ định ký tự phân cách và sử dụng các ký tự đó để gói tên biến, như sau:

<AssignMessage name="set-payload-3b">
  <Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
      {"name":"foo", "type":"@variable_name#"}
    </Payload>
  </Set>
</AssignMessage>

Cú pháp cũ này vẫn hoạt động.

Ví dụ 4

Nội dung của <Payload> được coi là mẫu tin nhắn. Điều này có nghĩa là chính sách AssignMessage sẽ thay thế các biến được gói trong dấu ngoặc nhọn bằng giá trị của các biến được tham chiếu trong thời gian chạy.

Ví dụ sau đây sử dụng cú pháp dấu ngoặc nhọn để đặt một phần tải trọng thành giá trị biến:

<AssignMessage name="set-payload-4">
  <Set>
    <Payload contentType="text/xml">
      <root>
        <e1>sunday</e1>
        <e2>funday</e2>
        <e3>{var1}</e3>
      </root>
    </Payload>
  </Set>
</AssignMessage>

Bảng sau đây mô tả các thuộc tính của <Payload>:

Thuộc tính Mô tả Sự hiện diện Loại
contentType

Nếu được chỉ định, giá trị của contentType sẽ được gán cho tiêu đề HTTP Content-Type.

Không bắt buộc Chuỗi
variablePrefix Chỉ định dấu phân cách đầu dòng trên biến flow (luồng) (không bắt buộc). Mặc định là "{". Để biết thêm thông tin, hãy xem phần Tài liệu tham khảo về biến Flow. Không bắt buộc Char
variableSuffix Chỉ định dấu phân cách theo sau trên biến flow (luồng) (không bắt buộc). Mặc định là "}". Để biết thêm thông tin, hãy xem phần Tài liệu tham khảo về biến Flow. Không bắt buộc Char

<QueryParams> (thành phần con của <Set>)

Ghi đè các tham số truy vấn hiện có trong yêu cầu bằng các giá trị mới. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng các phần tử <QueryParam>
Phần tử mẹ <Set>
Phần tử con <QueryParam>

Phần tử <QueryParams> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <QueryParams>
      <QueryParam name="queryparam_name">queryparam_value</QueryParam>
      ...
    </QueryParams>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt tham số truy vấn "address" thành giá trị của biến request.header.address:

<AssignMessage continueOnError="false" enabled="true" name="set-queryparams-1">
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.header.address}</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

Bạn chỉ có thể sử dụng <QueryParams> khi đáp ứng các tiêu chí sau:

  • Động từ HTTP: GET
  • Loại thông báo: Yêu cầu

Nếu bạn xác định tham số truy vấn trống trong chính sách (<Set><QueryParams/></Set>), thì chính sách đó sẽ không đặt bất kỳ tham số truy vấn nào. Điều này cũng giống như việc bỏ qua <QueryParams>.

<ReasonPhrase> (thành phần con của <Set>)

Đặt cụm từ lý do trên phản hồi. Việc này thường được thực hiện để gỡ lỗi kết hợp với <StatusCode>. Phần tử này không ảnh hưởng đến yêu cầu.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <Set>
Phần tử con Không có

Phần tử <ReasonPhrase> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây xác định một cụm từ lý do đơn giản:

<AssignMessage name="set-reasonphrase-1">
  <Set>
    <ReasonPhrase>Bad medicine</ReasonPhrase>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

Ví dụ 2

Nội dung của <ReasonPhrase> được coi là mẫu tin nhắn. Điều này có nghĩa là tên biến được gói trong dấu ngoặc nhọn sẽ được thay thế trong thời gian chạy bằng giá trị của biến được tham chiếu, như ví dụ sau:

<AssignMessage name="set-reasonphrase-2">
  <Set>
    <ReasonPhrase>{calloutresponse.reason.phrase}</ReasonPhrase>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

Bạn chỉ có thể sử dụng <ReasonPhrase> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Phản hồi

<StatusCode> (thành phần con của <Set>)

Đặt mã trạng thái trên phản hồi. Phần tử này không ảnh hưởng đến yêu cầu.

Giá trị mặc định "200" (khi thuộc tính createNew của <AssignTo> được đặt thành "true")
Bắt buộc? Không bắt buộc
Loại Chuỗi hoặc variable
Phần tử mẹ <Set>
Phần tử con Không có

Phần tử <StatusCode> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <StatusCode>HTTP_status_code or {variable}</StatusCode>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt một mã trạng thái đơn giản:

<AssignMessage name="set-statuscode-1">
  <Set>
    <StatusCode>404</StatusCode>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

Ví dụ 2

Nội dung của <StatusCode> được coi là mẫu tin nhắn. Điều này có nghĩa là tên biến được gói trong dấu ngoặc nhọn sẽ được thay thế trong thời gian chạy bằng giá trị của biến được tham chiếu, như ví dụ sau:

<AssignMessage name="set-statuscode-2">
  <Set>
    <StatusCode>{calloutresponse.status.code}</StatusCode>
  </Set>
  <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>

Bạn chỉ có thể sử dụng <StatusCode> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Phản hồi

<Verb> (thành phần con của <Set>)

Đặt động từ HTTP trên yêu cầu. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi hoặc variable
Phần tử mẹ <Set>
Phần tử con Không có

Phần tử <Verb> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt một động từ đơn giản trên yêu cầu:

<AssignMessage name="set-verb-1">
  <Set>
    <Verb>POST</Verb>
  </Set>
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Ví dụ 2

Nội dung của <Verb> được coi là mẫu tin nhắn. Điều này có nghĩa là tên biến được gói trong dấu ngoặc nhọn sẽ được thay thế trong thời gian chạy bằng giá trị của biến được tham chiếu.

Ví dụ sau đây sử dụng một biến để điền động từ:

<AssignMessage name="set-verb-2">
  <Set>
    <Verb>{my_variable}</Verb>
  </Set>
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Bạn chỉ có thể sử dụng <Verb> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Yêu cầu

<Version> (thành phần con của <Set>)

Đặt phiên bản HTTP trên một yêu cầu. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi hoặc variable
Phần tử mẹ <Set>
Phần tử con Không có

Phần tử <Version> sử dụng cú pháp sau:

Cú pháp

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="policy_name" >
  <Set>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Ví dụ 1

Ví dụ sau đây đặt số phiên bản thành "1.1":

<AssignMessage name="set-version-1">
  <Set>
    <Version>1.1</Version>
  </Set>
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Ví dụ 2

Mã sau đây sử dụng một biến trong dấu ngoặc nhọn để đặt số phiên bản:

<AssignMessage name="set-version-2">
  <Set>
    <Version>{my_version}</Version>
  </Set>
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Nội dung của <Version> được coi là mẫu tin nhắn. Điều này có nghĩa là tên biến được gói trong dấu ngoặc nhọn sẽ được thay thế trong thời gian chạy bằng giá trị của biến được tham chiếu.

Bạn chỉ có thể sử dụng <Version> khi đáp ứng các tiêu chí sau:

  • Loại thông báo: Yêu cầu

Tạo thông báo yêu cầu tuỳ chỉnh

Bạn có thể sử dụng chính sách AssignMessage để tạo thông báo yêu cầu tuỳ chỉnh. Sau khi tạo yêu cầu tuỳ chỉnh, bạn có thể sử dụng yêu cầu đó theo các cách sau:

  • Truy cập vào các biến của chính sách đó trong các chính sách khác
  • Chuyển dữ liệu đó đến một dịch vụ bên ngoài

Để tạo thông báo yêu cầu tuỳ chỉnh, hãy sử dụng phần tử <AssignTo> trong chính sách AssignMessage. Đặt createNew thành "true" và chỉ định tên của thông báo mới trong phần nội dung của phần tử, như trong ví dụ sau:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"/>
</AssignMessage>

Theo mặc định, Edge không làm gì với thông báo yêu cầu tuỳ chỉnh. Sau khi tạo, Edge sẽ tiếp tục quy trình với yêu cầu ban đầu. Để sử dụng yêu cầu tuỳ chỉnh, hãy thêm một chính sách (chẳng hạn như chính sách ServiceCallout) vào proxy có thể chuyển yêu cầu tuỳ chỉnh đến một dịch vụ bên ngoài.

Các ví dụ sau đây tạo thông báo yêu cầu tuỳ chỉnh:

Ví dụ 1

Ví dụ sau đây sẽ tạo một đối tượng yêu cầu tuỳ chỉnh bằng Assign Message (Gán thông báo):

<AssignMessage name="AssignMessage-3">
  <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo>
  <Copy>
    <Headers>
     <Header name="user-agent"/>
    </Headers>
  </Copy>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.addy}</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

Ví dụ này:

  • Tạo một đối tượng thông báo yêu cầu mới có tên "MyCustomRequest".
  • Trên MyCustomRequest, chính sách này:
    • Sao chép giá trị của tiêu đề HTTP user-agent từ yêu cầu entrante vào thông báo mới. Vì <Copy> sử dụng tham chiếu tuyệt đối đến biến luồng user-agent, nên bạn không cần chỉ định thuộc tính source cho <Copy>.
    • Đặt tham số truy vấn address trên thông báo tuỳ chỉnh thành giá trị của tham số truy vấn addy của yêu cầu đến.
    • Đặt động từ HTTP thành GET.
  • Đặt <IgnoreUnresolvedVariables> thành "false". Khi <IgnoreUnresolvedVariables> là "false", nếu một trong các biến mà chính sách cố gắng thêm không tồn tại, Edge sẽ ngừng xử lý trong luồng API.

Ví dụ 2

Dưới đây là một ví dụ khác minh hoạ cách tạo đối tượng yêu cầu tuỳ chỉnh bằng AssignMessage:

<AssignMessage name="AssignMessage-2">
  <AssignTo createNew="true" type="request">partner.request</AssignTo>
  <Set>
    <Verb>POST</Verb>
    <Payload contentType="text/xml">
      <request><operation>105</operation></request>
    </Payload>
  </Set>
</AssignMessage>

Ví dụ này tạo một yêu cầu tuỳ chỉnh mới có tên là "partner.request". Sau đó, phương thức này sẽ đặt <Verb><Payload> trên yêu cầu mới.

Bạn có thể truy cập vào thông báo yêu cầu tuỳ chỉnh trong một chính sách AssignMessage khác xuất hiện sau trong quy trình. Ví dụ sau đây sẽ lấy giá trị của tiêu đề user-agent của thông báo yêu cầu tuỳ chỉnh:

<AssignMessage name="custom-request-1-access">
  <DisplayName>custom-request-1-access</DisplayName>
  <AssignTo createNew="false" type="request"></AssignTo>
  <Set>
    <Headers>
      <Header name="user-agentCopyCustomRequest">{MyCustomRequest.header.user-agent}</Header>
    </Headers>
  </Set>
</AssignMessage>

Video

Hãy xem các video sau để tìm hiểu thêm về chính sách AssignMessage.

Video Mô tả
Tại sao nên chỉ định Chính sách về thông báo? Tìm hiểu về lợi ích của việc sử dụng chính sách AssignMessage để sửa đổi yêu cầu hoặc phản hồi API mà không cần sửa đổi mã phụ trợ.
Sao chép các phần tử API bằng chính sách AssignMessage Sao chép các phần tử từ yêu cầu hoặc phản hồi API và tạo một đối tượng yêu cầu hoặc phản hồi mới bằng chính sách AssignMessage.
Xoá các phần tử API bằng chính sách AssignMessage Xoá các phần tử API và sửa đổi API trước khi API đó đến phần phụ trợ mục tiêu bằng cách sử dụng chính sách AssignMessage.
Thêm và đặt các phần tử API bằng chính sách AssignMessage Thay đổi yêu cầu hoặc phản hồi API bằng cách thêm tham số truy vấn, tiêu đề, tham số biểu mẫu hoặc tải trọng bằng chính sách AssignMessage.
Tạo biến tuỳ chỉnh bằng chính sách AssignMessage Đặt biến luồng tuỳ chỉnh bằng chính sách AssignMessage và tận dụng các biến trong các chính sách khác trong proxy API.
Tạo đối tượng yêu cầu hoặc phản hồi mới bằng chính sách AssignMessage Tạo đối tượng yêu cầu hoặc phản hồi API mới bằng cách sử dụng chính sách AssignMessage trong thời gian chạy API.
Tạo API mô phỏng bằng chính sách AssignMessage Tạo một API REST mô phỏng đơn giản bằng cách thêm chính sách AssignMessage trong luồng phản hồi.
Thiết lập hoặc sửa đổi tải trọng bằng chính sách AssignMessage Chuyển đổi yêu cầu REST thành yêu cầu SOAP bằng cách đặt Gói dữ liệu SOAP bằng chính sách AssignMessage trong thời gian chạy API.

Mã lỗi

Phần này mô tả các mã lỗi và thông báo lỗi được trả về cũng như các biến lỗi do Edge đặt khi chính sách này kích hoạt lỗi. Thông tin này rất quan trọng để biết bạn có đang phát triển các quy tắc lỗi để xử lý lỗi hay không. Để tìm hiểu thêm, hãy xem bài viết Những điều cần biết về lỗi liên quan đến chính sáchXử lý lỗi.

Lỗi thời gian chạy

Những lỗi này có thể xảy ra khi chính sách thực thi.

Mã lỗi Trạng thái HTTP Nguyên nhân Cách khắc phục
steps.assignmessage.SetVariableFailed 500 Chính sách này không đặt được biến. Xem chuỗi lỗi để biết tên của biến chưa được phân giải.
steps.assignmessage.VariableOfNonMsgType 500

Lỗi này xảy ra nếu thuộc tính source trong phần tử <Copy> được đặt thành một biến không thuộc loại message.

Biến loại thông báo đại diện cho toàn bộ yêu cầu và phản hồi HTTP. Các biến luồng Edge tích hợp sẵn request, responsemessage thuộc loại thông báo. Để tìm hiểu thêm về các biến thông báo, hãy xem Tài liệu tham khảo về biến.

steps.assignmessage.UnresolvedVariable 500

Lỗi này xảy ra nếu một biến được chỉ định trong chính sách Chỉ định thông báo là:

  • ngoài phạm vi (không có trong luồng cụ thể mà chính sách đang được thực thi)
  • hoặc
  • không thể phân giải (chưa được xác định)

Lỗi triển khai

Những lỗi này có thể xảy ra khi bạn triển khai một proxy chứa chính sách này.

Tên lỗi Nguyên nhân Cách khắc phục
InvalidIndex Nếu chỉ mục được chỉ định trong phần tử <Copy> và/hoặc <Remove> của chính sách Chỉ định thông báo là 0 hoặc số âm, thì việc triển khai Proxy API sẽ không thành công.
InvalidVariableName Nếu phần tử con <Name> trống hoặc không được chỉ định trong phần tử <AssignVariable>, thì việc triển khai proxy API sẽ không thành công vì không có tên biến hợp lệ để gán giá trị. Bạn phải nhập tên biến hợp lệ.
InvalidPayload Trọng tải được chỉ định trong chính sách là không hợp lệ.

Biến lỗi

Các biến này được đặt khi chính sách này kích hoạt lỗi trong thời gian chạy. Để biết thêm thông tin, hãy xem bài viết Những điều bạn cần biết về lỗi liên quan đến chính sách.

Biến Trong đó Ví dụ:
fault.name="fault_name" fault_name là tên của lỗi, như được liệt kê trong bảng Lỗi thời gian chạy ở trên. Tên lỗi là phần cuối cùng của mã lỗi. fault.name Matches "UnresolvedVariable"
assignmessage.policy_name.failed policy_name là tên do người dùng chỉ định của chính sách gây ra lỗi. assignmessage.AM-SetResponse.failed = true

Ví dụ về phản hồi khi gặp lỗi

{  
   "fault":{  
      "detail":{  
         "errorcode":"steps.assignmessage.VariableOfNonMsgType"
      },
      "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message"
   }
}

Ví dụ về quy tắc lỗi

<faultrule name="VariableOfNonMsgType"></faultrule><FaultRule name="Assign Message Faults">
    <Step>
        <Name>AM-CustomNonMessageTypeErrorResponse</Name>
        <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition>
    </Step>
    <Step>
        <Name>AM-CustomSetVariableErrorResponse</Name>
        <Condition>(fault.name = "SetVariableFailed")</Condition>
    </Step>
    <Condition>(assignmessage.failed = true) </Condition>
</FaultRule>

Giản đồ

Mỗi loại chính sách được xác định bằng một lược đồ XML (.xsd). Để tham khảo, bạn có thể xem lược đồ chính sách trên GitHub.

Chủ đề có liên quan

Bạn có thể xem các mẫu hoạt động của chính sách AssignMessage trong các mẫu Nền tảng API.

Để xem ví dụ nâng cao hơn về cách ghi đè target.url từ ProxyEndpoint, hãy xem bài viết này trên Cộng đồng Apigee.

Để xem "đường dẫn đặt" đang hoạt động trong chính sách ServiceCallout, hãy xem Ví dụ về cách học bằng cách làm này trong các mẫu GitHub của Apigee. Bạn chỉ cần sao chép kho lưu trữ và làm theo hướng dẫn trong chủ đề đó. Ví dụ này sử dụng chính sách AssignMessage để đặt đường dẫn yêu cầu, sau đó sử dụng chính sách Service Callout để đưa ra yêu cầu cho một dịch vụ bên ngoài.