Chính sáchassignMessage

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
info

Nội dung

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

  • 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ừ thông báo này sang thông báo 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 thông báo yêu cầu hoặc phản hồi tuỳ chỉnh và truyền thông báo đó đến một đích đến 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 luồng bằng các phần tử con sau đây:

Phần tử <AssignMessage>

Xác định một 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 có
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 các chế độ cài đặt mặc định khi bạn thêm chính sách AssignMessage vào luồng của mình 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 vào giao diện người dùng Edge, mẫu này sẽ chứa các phần giữ chỗ cho tất cả các thao tác có thể. Thông thường, bạn sẽ chọn(các) thao tác mà bạn muốn thực hiện với 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 để giúp 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ả cấp cao 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 các tiêu đề hoặc tham số vào thông báo không có trong thông báo gốc. Để ghi đè các 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 được chỉ định theo thuộc tính source sang đối tượng thông báo được chỉ định theo phần tử <AssignTo>.
<Remove> Không bắt buộc Xoá các phần tử được 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 thuộc tính hiện có trên yêu cầu hoặc phản hồi, được chỉ định bằng phần tử <AssignTo>.

<Set> ghi đè các tiêu đề hoặc tham số đã tồn tại trong thông báo ban đầu. Để thêm tiêu đề hoặc thông 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 mới, tuỳ chỉnh.
<AssignVariable> Không bắt buộc Gán một giá trị cho biến luồng. Nếu biến không tồn tại, <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 phải một biến chưa được giải quyết hay không.

Từng 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 minh hoạ 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 sẽ 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 một thông báo mới. Thay vào đó, nó sửa đổi một thông báo phản hồi hiện có bằng cách thêm một tiêu đề HTTP.

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

Tiêu đề HTTP được chính sách này thêm vào thông báo phản hồi bắt nguồn từ một biến do chính sách LookupCache điền sẵn. Do đó, thông báo phản hồi do chính sách Chỉ định thông báo này sửa đổi sẽ chứa một tiêu đề HTTP cho biết kết quả có được lấy từ bộ nhớ đệm hay không. 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 Assign Message để 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 một tải trọng XML, hãy đặt 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 các biến bằng cách sử dụng thuộc tính variablePrefixvariableSuffix với các ký tự phân cách như minh hoạ 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 luồng, hãy xem Tài liệu tham khảo về biến luồng.

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 các 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>

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 làm việc này để ngăn thông tin khoá nhạy cảm được truyền đến đích đến phụ trợ.

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

Ví dụ sau đây sử dụng 3 chính sách Assign Message:

  1. Tạo 3 biến luồng trong yêu cầu, với các giá trị tĩnh
  2. Lấy các biến luồng một cách linh động trong chính sách thứ hai trong luồng 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 3 biến trong yêu cầu. Mỗi phần tử <Name> chỉ định một 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 3 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à phần tử <Name> chỉ định tên của các biến mới. Nếu không truy cập được vào biến mà phần tử <Ref> tham chiếu, 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 số 1 và số 2 vào quy trình yêu cầu. Hãy nhớ đặt chính sách số 1 trước chính sách số 2.
  2. Thêm chính sách thứ ba vào quy trình 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 máy 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 vào các biến luồng trong <Set> là đặt 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 của bạn; ví dụ:
    curl -vL https://ahamilton-eval-test.apigee.net/myproxy

    Bạn có thể chuyển kết quả qua một tiện ích như xmllint để XML xuất hiện trong một 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 phản hồi sẽ có dạng như sau:

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

7: Nhận tiêu đề phản hồi Chú thích dịch vụ

Trong ví dụ sau, giả sử chính sách ServiceCallout nằm trong yêu cầu của API proxy và phản hồi của lệnh gọi chứa nhiều tiêu đề có cùng tên (Set-Cookie). Giả sử biến phản hồi của Service Callout là calloutResponse mặc định, chính sách sau 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ả các giá trị tiêu đề, hãy 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. Để xem thêm ví dụ, hãy xem ví dụ AssignMessage trên GitHub.

Tài liệu tham khảo về 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, được chỉ định bằng phần tử <AssignTo>.

Phần tử <Add> sẽ thêm các thuộc tính mới vào thông báo không có trong thông báo 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 có
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 đây sử dụng phần tử <FormParams> để lấy giá trị của 3 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 trong yêu cầu điểm cuối đích:

<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 đây 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 đây 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 quy trình trước yêu cầu. Nếu bạn xem kết quả trong một công cụ như Trace tool (Công cụ theo dõi), thì yêu cầu đối với "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ợ thay thế chuỗi động, còn được gọi là tạo mẫu thông báo.

<FormParams> (phần tử 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 sẽ thêm một tham 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>

Xin 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 quy trình. 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 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) trong những điều kiện sau:
    • Dữ liệu biểu mẫu: Đặt thành một giá trị nào đó 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ụ đích.

<Headers> (phần tử con của <Add>)

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

Giá trị mặc định Không có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 luồng 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> (phần tử con của <Add>)

Thêm 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 sẽ 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 các 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 trống gồm các tham số truy vấn 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 do máy chủ đích trả về
  • Thông báo tuỳ chỉnh: Một đố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. Ví dụ: bạn không thể 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 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 có
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, thì theo mặc định, chính sách này 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 đích đến là yêu cầu ban đầu sẽ được gửi đến điểm cuối đích:

<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ả cá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 đó.

Sau này, 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 của 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 đó.

Sau này, 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 của 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 một thông báo mới khi chỉ định giá trị hay không.

Nếu là "true", thì chính sách sẽ tạo một biến mới thuộc loại do type chỉ định (là "request" hoặc "response"). 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 đối tượng yêu cầu hoặc 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:

  • 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ì nó sẽ tiếp tục xử lý. Ví dụ: nếu chính sách nằm trong một luồng yêu cầu, thì biến này 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 <AssignTo> không thể phân giải 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ẽ báo lỗi.

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

  • Nếu <AssignTo> chuyển 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 <AssignTo> không thể phân giải hoặc phân giải thành một loại không phải 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à "request" hoặc "response".

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

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

<AssignVariable>

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

Giá trị mặc định Không có
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 luồng đích có thể là một trong những giá trị sau:

  • Chuỗi ký tự: Sử dụng phần tử con <Value> để chỉ định giá trị chuỗi ký tự cho biến luồng đích.
  • Biến luồng: Sử dụng phần tử con <Ref> để chỉ định giá trị của một biến luồng hiện có cho biến luồng đích. Để xem danh sách đầy đủ các biến luồng có thể dùng làm nguồn, hãy xem Tài liệu tham khảo về biến luồng.
  • Mẫu tin nhắn: Sử dụng phần tử con <Template> để chỉ định một mẫu tin nhắn 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 vào biến mà <Ref> tham chiếu, Edge sẽ sử dụng giá trị do phần tử <Value> chỉ định. Nếu bạn xác định <Template>, thì 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ị theo nghĩa đen "42":

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

Ví dụ 2

Ví dụ sau đây chỉ định giá trị của biến luồng request.header.user-agent cho biến luồng đích myvar và giá trị của tham số truy vấn country cho biến luồng đí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 hoạt động gán không thành công, Edge sẽ gán giá trị "ErrorOnCopy" cho biến luồng đích.

Nếu các biến luồng 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 ký tự (dấu gạch ngang) ở giữa:

<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 trường hợp sử dụng phổ biến cho <AssignVariable> là đặt giá trị mặc định cho 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. 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> (phần tử con của <AssignVariable>)

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

Giá trị mặc định Không có
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 này 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 này.

<Ref> (phần tử con của <AssignVariable>)

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

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

Giá trị mặc định Không có
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 chỉ định một biến luồng 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 luồng. 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 đến, hãy sử dụng <Value> kết hợp với <Ref>. Nếu biến luồng do <Ref> chỉ định không tồn tại, không thể đọc hoặc có giá trị rỗng, thì Edge sẽ chỉ định giá trị của <Value> cho biến luồng đí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 chỉ định giá trị của biến luồng request.header.user-agent cho biến luồng đí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 cả hai hoạt động chỉ định.

Ví dụ 2

Ví dụ sau đây chỉ định giá trị của biến luồng request.header.user-agent cho biến luồng đí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 luồng request.header.user-agent hoặc tham số truy vấn Country là rỗng, không đọc được hoặc bị lỗi, thì Edge sẽ chỉ định 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 cho <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 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ờ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 một 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> nhận giá trị của request.queryparam.w và gán giá trị đó cho chính nó. Nếu biến luồng là rỗng, tức là tham số truy vấn "w" đã bị bỏ qua trong 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à không cần tham số truy vấn "w":

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

...và vẫn yêu cầu proxy API trả về một 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 luồng, 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 luồng không tồn tại cho giá trị của <Ref> và giá trị của <IgnoreUnresolvedVariables> là "true", thì Edge sẽ gửi một lỗi.

<Template> (phần tử 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 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 ký tự với tên biến được đặt trong dấu ngoặc nhọn. Ngoài ra, mẫu tin nhắn hỗ trợ các hàm như thoát và chuyển đổi chữ hoa chữ thường.

Sử dụng thuộc tính ref để chỉ định một biến luồng mà 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ột mẫu thông báo dưới dạng thuộc tính tuỳ chỉnh trên một ứng dụng dành cho nhà phát triển. Khi Edge xác định ứng dụng dành cho 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. Thuộc tính này có sẵn dưới dạng một biến luồng từ chính sách bảo mật. Ví dụ sau đây giả định rằng mẫu thông báo có trong một thuộc tính khách hàng có tên là message_template trên ứng dụng 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 có
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 ký tự (dấu gạch ngang) ở giữa:

<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 luồng, trong đó giá trị của biến là một mẫu thông báo được xác định trước. Hãy sử dụng lựa chọn này nếu bạn muốn chèn một mẫu xác định trước tại thời gian chạy mà không cần phải 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 luồng 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 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 khi 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 linh động. Ví dụ: một 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> (phần tử 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 dưới dạng một chuỗi ký tự; bạn không thể sử dụng biến luồng làm giá trị, ngay cả khi bạn đặt giá trị trong dấu ngoặc ("{}"). Để sử dụng biến luồng, hãy dùng <Ref>.

Giá trị mặc định Không có
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 dùng kết hợp với phần tử <Ref>, <Value> sẽ đó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 có giá trị 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 chỉ định giá trị của biến luồng request.header.user-agent cho biến 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 hoạt động 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ột 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í thực thi chính sách này trong quy trình.

Giá trị mặc định Không có
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 đề, 3 tham số biểu mẫu, đường dẫn và tất cả tham số truy vấn từ yêu cầu đến một yêu cầu mới, tuỳ chỉnh:

<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
nguồn

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

  • Nếu bạn 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 mặc định sẽ là đối tượng request. Nếu chính sách này nằm trong luồng phản hồi, thì chính sách này sẽ mặc định là đối tượng response. Nếu bỏ qua source, bạn có thể sử dụng một giá trị tham chiếu tuyệt đối đến một biến luồng 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 một 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> (phần tử 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 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 duy nhất 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ố 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 3 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) trong những điều kiện sau:
    • Dữ liệu biểu mẫu: Đặt thành một giá trị nào đó 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 có, thì đặ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 tin nhắn thành "application/x-www-form-urlencoded" trước khi gửi tin nhắn đến dịch vụ đích.

<Headers> (phần tử 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 đến 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 có
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 một phần tử <Headers> trống, như ví dụ sau đây minh hoạ:

<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> (phần tử con của <Copy>)

Xác định xem đường dẫn có nên đượ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 là "true", chính sách này sẽ sao chép đường dẫn from (từ) thông báo yêu cầu do thuộc tính source của phần tử <Copy> chỉ định to (đến) 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 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> (phần tử con của <Copy>)

Xác định xem tải trọng có được sao chép 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 là "true", 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 đến 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> (phần tử 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 đến 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 có
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> (phần tử con của <Copy>)

Xác định xem cụm từ lý do có nên đượ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 là "true", chính sách này sẽ sao chép ReasonPhrase from phản hồi do thuộc tính source của phần tử <Copy> chỉ định to 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 một đố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> (phần tử con của <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 là "true", 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", thao tác này sẽ 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 trường hợp 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> (phần tử 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 là "true", hãy sao chép động từ có 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", thao tác này sẽ sao chép động từ từ yêu cầu mặc định sang một yêu cầu mới, tuỳ chỉnh:

<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> (phần tử 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 là "true", 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" trong yêu cầu, thao tác này sẽ 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 có
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 phải một biến chưa được giải quyết 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 thì 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 ở chỗ việ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ả các lỗi, không chỉ những lỗi gặp phải khi sử dụng các 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. Tin nhắn có thể là yêu cầu hoặc phản hồi. Bạn chỉ định thông báo mà <Remove> hoạt động bằng cách sử dụng phần tử <AssignTo>.

Giá trị mặc định Không có
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 cho <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 thư 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 phản hồi, chỉ trả về tiêu đề HTTP cho máy khách.

Ví dụ 2

Ví dụ sau đây sẽ xoá tất cả cá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> (phần tử 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 sẽ xoá tất cả các tham 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 sẽ 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> (phần tử con của <Remove>)

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

Giá trị mặc định Không có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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ì giá trị đó sẽ không bị xoá.

<Payload> (phần tử 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" để tải trọng yêu cầu được xoá:

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

<QueryParams> (phần tử 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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, được chỉ định bằng phần tử <AssignTo>. <Set> ghi đè các tiêu đề hoặc tham số đã có trong thông báo ban đầu. Để tạo một tiêu đề hoặc tham số mới, hãy sử dụng phần tử <Add>.

Giá trị mặc định Không có
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 minh hoạ 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> (phần tử con của <Set>)

Ghi đè các thông số biểu mẫu hiện có trên một yêu cầu và thay thế các thông 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 một tham số biểu mẫu có tên là "myparam" thành giá trị của biến request.header.myparam trong một yêu cầu mới, tuỳ chỉnh:

<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 của mình (<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 đến điểm cuối mục tiêu.

<Headers> (phần tử con của <Set>)

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

Giá trị mặc định Không có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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 của mình (<Add><Headers/></Add>), thì chính sách sẽ không thêm bất kỳ tiêu đề nào. Điều này cũng giống như việc bỏ qua <Headers>.

<Path> (phần tử con của <Set>)

<Payload> (phần tử 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 mộ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 đặt 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 đám mây 16.08.17), bạn không thể dùng dấu ngoặc nhọn để biểu thị các tham chiếu biến trong tải trọng JSON. Trong những bản phát hành đó, bạn cần sử dụng các thuộc tính variablePrefixvariableSuffix để chỉ định các ký tự phân cách, đồng thời sử dụng các ký tự đó để bao bọc 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ột 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 bao bọc 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 của 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 chỉ định cho tiêu đề HTTP Content-Type.

Không bắt buộc Chuỗi
variablePrefix Không bắt buộc, chỉ định dấu phân cách đầu tiên trên một biến luồng. Mặc định là "{". Để biết thêm thông tin, hãy xem Tài liệu tham khảo về các biến trong luồng. Không bắt buộc Char
variableSuffix Nếu muốn, hãy chỉ định dấu phân cách ở cuối trên một biến luồng. 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 luồng. Không bắt buộc Char

<QueryParams> (phần tử 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm 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> (phần tử con của <Set>)

Đặt cụm từ lý do cho phản hồi. Thao tá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 có
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ừ đơn giản cho lý do:

<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ột mẫu tin nhắn. Điều này có nghĩa là tên biến được đặt 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 đây cho thấy:

<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> (phần tử con của <Set>)

Đặt mã trạng thái cho 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ột mẫu tin nhắn. Điều này có nghĩa là tên biến được đặt 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 đây cho thấy:

<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> (phần tử con của <Set>)

Đặt động từ HTTP cho 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 có
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 cho 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ột mẫu tin nhắn. Điều này có nghĩa là tên biến được đặt 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 sẵn một độ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> (phần tử con của <Set>)

Đặt phiên bản HTTP cho 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 có
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

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ột mẫu tin nhắn. Điều này có nghĩa là tên biến được đặt 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 những cách sau:

  • Truy cập vào các biến của chính sách này trong các chính sách khác
  • Truyề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 nội dung của phần tử, như ví dụ sau đây minh hoạ:

<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 như chính sách ServiceCallout vào proxy của bạn. Chính sách này có thể truyề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 ra thông báo yêu cầu tuỳ chỉnh:

Ví dụ 1

Ví dụ sau đây tạo một đối tượng yêu cầu tuỳ chỉnh bằng Assign Message:

<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 là "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 đến vào thông báo mới. Vì <Copy> sử dụng một 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 thành <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 trong 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

Sau đâ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 đó, nó sẽ đặt <Verb><Payload> trên yêu cầu mới.

Bạn có thể truy cập vào một 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 trong 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 phải chỉ định Chính sách về tin nhắn? 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ừ mộ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ày đến được phần phụ trợ mục tiêu bằ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 các 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 các biến tuỳ chỉnh bằng chính sách AssignMessage Đặt các 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 các đối tượng yêu cầu hoặc phản hồi mới bằng chính sách AssignMessage Tạo các đối tượng yêu cầu hoặc phản hồi API mới bằng chính sách AssignMessage tại 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 vào luồng phản hồi.
Đặt hoặc sửa đổi tải trọng bằng cách sử dụ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 tải trọng SOAP bằng chính sách AssignMessage tại 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 nếu bạn đang phát triển các quy tắc lỗi để xử lý lỗi. Để tìm hiểu thêm, hãy xem bài viết Những điều bạn cần biết về lỗi chính sáchCách xử 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 này thực thi.

Mã lỗi Trạng thái HTTP Nguyên nhân 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 giải quyết.
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 tin nhắn.

Biến kiểu thông báo đại diện cho toàn bộ các yêu cầu và phản hồi HTTP. Cạnh tích hợp sẵn các biến luồng request, responsemessage đều 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 có một trong hai loại sau:

  • ngoài phạm vi (không có trong quy trình cụ thể nơi chính sách đang được thực thi)
  • hoặc
  • không thể giải quyết (không 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 proxy có chứa chính sách này.

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

Các mẫu hoạt động của chính sách AssignMessage có 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 "set path" hoạt động trong chính sách ServiceCallout, hãy xem Ví dụ học qua thực hành này trong các mẫu Apigee trên GitHub. 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.