Chính sáchassignMessage

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

Nội dung

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

  • Thêm thông số biểu mẫu, tiêu đề hoặc tham số truy vấn mới vào thư
  • Sao chép các cơ sở lưu trú 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ư khỏi thư
  • Đặt giá trị của các cơ sở lưu trú hiện có trong một thông báo

Thông qua chính sách AttributionMessage, 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 AttributionMessage để tạo thông báo phản hồi hoặc yêu cầu tuỳ chỉnh rồi truyền thông báo này sang một mục tiêu thay thế như mô tả trong phần Tạo thông báo yêu cầu tuỳ chỉnh.

Chính sách AttributionMessage 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 chính sách AttributionMessage.

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

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

Cú pháp

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

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

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

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

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

  <DisplayName>policy_display_name</DisplayName>

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

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

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

</AssignMessage>

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

Ví dụ sau đây cho thấy các chế độ cài đặt mặc định khi bạn thêm chính sách AttributionMessage vào quy trình 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 AssignmentsMessage mới vào giao diện người dùng của Edge, mẫu này sẽ chứa các mã giả lập cho tất cả thao tác có thể thực hiện. Thông thường, bạn chọn(những) 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> cũng như các phần tử con khác khỏi chính sách này để phần tử đó 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ả bao quát về các phần tử con của <AssignMessage>:

Phần tử con Bắt buộc? Nội dung mô tả
Toán tử 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ố 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 do thuộc tính source chỉ định vào đối tượng thông báo do phần tử <AssignTo> chỉ định.
<Remove> Không bắt buộc Xoá các phần tử đượ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ế giá trị của các thuộc tính hiện có trong yêu cầu hoặc phản hồi (do phần tử <AssignTo> chỉ định).

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

Các phần tử con khác
<AssignTo> Không bắt buộc Chỉ định thông báo mà chính sách AttributionMessage sẽ hoạt động. Đây có thể là yêu cầu hoặc phản hồi thông thường hoặc có thể là một tin nhắn mới, tuỳ chỉnh.
<AssignVariable> Không bắt buộc Gán giá trị cho biến flow. 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ó ngừng khi gặp một biến chưa được giải quyết hay không.

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

Ví dụ

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

1: Thêm tiêu đề

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

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

2: Xoá tải trọng

Ví dụ sau đây sẽ 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 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 ra thông báo mới. Thay vào đó, phương thức này sửa đổi một thông báo phản hồi hiện có bằng cách thêm tiêu đề HTTP.

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

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

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

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

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

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

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

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

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

Để biết 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 biến.

5: Xoá tham số truy vấn

Ví dụ sau đây sẽ 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>

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

6: Đặt/nhận biến

Ví dụ sau đây sử dụng 3 chính sách Chỉ định tin nhắn:

  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 chúng 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 tên biến và <Value> chỉ định giá trị.

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

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

Trong chính sách thứ hai, phần tử <Ref> tham chiếu đến biến nguồn, còn phần tử <Name> chỉ định tên của biến mới. Nếu không thể truy cập vào biến được 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 thử áp dụng bộ chính sách này:

  1. Thêm chính sách #1 và #2 vào quy trình yêu cầu. Hãy nhớ đặt chính sách #1 trước chính sách #2.
  2. Thêm chính sách thứ ba 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 tải trọng XML trong phản hồi mà Edge trả về ứng dụng:
    <!-- 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>
    

    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.

    Hãy 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

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

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

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

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

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

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

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

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

{calloutResponse.header.Set-Cookie.values}

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

Tham chiếu phần tử con

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

<Add>

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

Phần tử <Add> thêm các thuộc tính mới trên thông báo không tồn tại 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 áp dụng
Bắt buộc? Không bắt buộc
Loại Loại phức tạp
Phần tử mẹ <AssignMessage>
Phần tử con <FormParams>
<Headers>
<QueryParams>

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

Cú pháp

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

Ví dụ 1

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

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

Ví dụ 2

Ví dụ sau đâ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 thu thập trước yêu cầu. Nếu bạn xem kết quả trong một công cụ như Công cụ theo dõi, thì yêu cầu "http://httpbin.org/get" sẽ trở thành "http://httpbin.org/get?myParam=42".

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

<FormParams> (con của <Add>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 thêm một thông số biểu mẫu duy nhất ("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 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 thông số vào yêu cầu.

Ví dụ 3

Ví dụ sau đây thêm nhiều thông 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 rồi thêm các tham số đó dưới dạng tham số biểu mẫu trong 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 phần 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 chuyển vào dưới dạng tham số chuỗi truy vấn:

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

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

  • Động từ HTTP: POST
  • Loại thông báo: Yêu cầu
  • Một (hoặc cả hai) trong những trường hợp 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 thì độ 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-urlidentifier" trước khi gửi thông báo đến dịch vụ đích.

<Headers> (con của <Add>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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à gán 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> (con của <Add>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 thêm tham số truy vấn "myParam" vào yêu cầu và chỉ định giá trị "42" cho 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>

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

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

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

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

<AssignTo>

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

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

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 AttributionMessage hoạt động. Ví dụ: bạn không thể sử dụng <Add> hoặc <Set> để thêm hoặc thay đổi tham số truy vấn (<QueryParams>) hoặc tham số biểu mẫu (<FormParams>) cho câu trả lời. Bạn chỉ có thể thao tác với các tham số truy vấn và tham số biểu mẫu theo yêu cầu.

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

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

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

Cú pháp

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

Ví dụ 1

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

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

Bằng cách đặt createNew thành "false" (giá trị mặc định), ví dụ này sẽ không tạo ra 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 trong chính sách AttributionMessage (chẳng hạn như <Add>, <Set><Set>) sẽ hoạt động dựa trên đối tượng yêu cầu mới đó.

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

Ví dụ 3

Ví dụ sau đây sẽ 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 trong chính sách AttributionMessage (chẳng hạn như <Add>, <Set><Set>) sẽ hoạt động dựa trên đối tượng yêu cầu mới đó.

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

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

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

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

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

Nếu giá trị "false" thì chính sách sẽ phản hồi theo một trong 2 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ì hệ thống sẽ tiếp tục xử lý. Ví dụ: nếu chính sách nằm trong một quy trình yêu cầu, thì biến đó sẽ 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 đó sẽ là đối tượng phản hồi.
  • Nếu <AssignTo> không giải quyết được hoặc chuyển thành loại không phải thông báo, thì chính sách sẽ gửi lỗi.

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

  • Nếu <AssignTo> phân giải thành một thư, thì quá trình xử lý sẽ chuyển sang bước tiếp theo.
  • Nếu <AssignTo> không phân giải được thành 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 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" (phản hồi).

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

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

<AssignVariable>

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

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

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

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

Cú pháp

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

Sử dụng phần tử <Ref> để chỉ định biến nguồn. Nếu không truy cập được vào biến do <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ành phần này sẽ được ưu tiên hơn các phần tử con khác.

Ví dụ 1

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

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

Ví dụ 2

Ví dụ sau đây 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 không chỉ định được, Edge sẽ chỉ định giá trị "ErrorOnCopy" cho biến luồng đích đến.

Nếu các biến luồng myvar hoặc Country không tồn tại, <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 2 biến ngữ cảnh với một chuỗi giá trị cố định (dấu gạch nối) ở 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>

Cách sử dụng phổ biến cho <AssignVariable> là đặt giá trị mặc định cho tham số truy vấn, tiêu đề hoặc giá trị khác có thể được truyền 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ả hai phần tử con <Ref><Value>. Để biết thêm thông tin, hãy xem các ví dụ về <Ref>.

<Name> (con của <AssignVariable>)

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

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

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

Cú pháp

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

Ví dụ 1

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

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

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

<Ref> (con của <AssignVariable>)

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

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

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

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

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

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

Để xác định giá trị mặc định cho biến luồng đích, hãy sử dụng <Value> kết hợp với <Ref>. Nếu biến luồng do <Ref> chỉ định không tồn tại, không thể đọc hoặc rỗng, thì Edge sẽ chỉ định giá trị <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 cách 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 các 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 không đúng định dạng, 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 tham số truy vấn, tiêu đề hoặc giá trị khác có thể được truyền cùng với yêu cầu. Ví dụ: bạn tạo proxy API thời tiết trong đó yêu cầu sẽ lấy một tham số truy vấn có tên là "w". Tham số này chứa mã của thành phố mà bạn muốn biết thông tin thời tiết. URL yêu cầu có dạng:

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

Để xác định giá trị mặc định cho "w", hãy tạo một chính sách AttributionMessage 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 flow có giá trị rỗng, nghĩa là tham số truy vấn "w" đã bị bỏ khỏi yêu cầu, thì ví dụ này sẽ sử dụng giá trị mặc định của phần tử <Value>. Do đó, bạn có thể đưa ra yêu cầu tới proxy API này mà bỏ qua tham số truy vấn "w":

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

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

Không giống như khi sử dụng <Value>, giá trị của <Ref> phải là 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 flow không tồn tại cho giá trị <Ref> và giá trị của <IgnoreUnresolvedVariables> là "true", thì Edge sẽ gửi lỗi.

<Template> (con của <AssignVariable>)

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

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

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

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

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

Cú pháp

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

Ví dụ 1

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

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

Ví dụ 2

Ví dụ sau đây chỉ định một biến flow, trong đó giá trị của biến là một mẫu thông báo được xác định trước. Hãy sử dụng lựa chọn này nếu bạn muốn chèn một mẫu được xác định trước trong thời gian chạy mà không 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 flow và giá trị văn bản. Trong trường hợp này, nếu biến được tham chiếu không có giá trị null, 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 rất hữu ích khi cung cấp giá trị "ghi đè", 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 động. Ví dụ: câu lệnh có điều kiện có thể lấy một giá trị từ bản đồ khoá-giá trị và đặt biến được tham chiếu thành giá trị đó:

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

<Value> (con của <AssignVariable>)

Xác định giá trị của biến luồng đích được đặt bằng <AssignVariable>. Giá trị luôn được hiểu là một chuỗi giá trị cố định. 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 vuông ("{}"). Để sử dụng biến luồng, hãy sử dụng <Ref>.

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

Khi được dùng kết hợp với phần tử <Ref>, <Value> đóng vai trò là giá trị mặc định (hoặc dự phòng). Nếu <Ref> không được chỉ định, không thể giải quyết hoặc 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 không chỉ định được, <AssignVariable> sẽ chỉ định giá trị "ErrorOnCopy" cho biến luồng đích đến.

<Copy>

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

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

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

Cú pháp

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

Ví dụ 1

Ví dụ sau đây sẽ sao chép một tiêu đề, 3 thông số biểu mẫu, đường dẫn và tất cả các tham số truy vấn từ yêu cầu sang 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 Nội dung mô tả Bắt buộc? Loại
source

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

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

<FormParams> (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 vào yêu cầu do phần tử <AssignTo> chỉ định. Phần tử này không ảnh hưởng đến phản hồi.

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 sẽ sao chép một thông 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 thông 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 thông 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 thông 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 là "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 đây:

  • Động từ HTTP: POST
  • Loại thông báo: Phản hồi
  • Một (hoặc cả hai) trong những trường hợp 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 thì độ dài hiện tại. Ví dụ: với curl, hãy thêm -H "Content-Length: 0" vào yêu cầu của bạn.

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

<Headers> (con của <Copy>)

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

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

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

Cú pháp

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

Ví dụ 1

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

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

Ví dụ 2

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

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

Ví dụ 3

Nếu có nhiều tiêu đề trù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 là "h3". Nếu "h3" chỉ có một giá trị, thì giá trị đó sẽ không được sao chép.

<Path> (con của <Copy>)

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

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

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

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

Cú pháp

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

Ví dụ 1

Ví dụ sau đây cho biết chính sách composeMessage 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 đây:

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

<Payload> (con của <Copy>)

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

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

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

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

Cú pháp

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

Ví dụ 1

Ví dụ sau đây đặt <Payload> thành "true" để sao chép trọng tải yêu cầu từ yêu cầu đến 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> (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 vào yêu cầu do phần tử <AssignTo> chỉ định. Phần tử này không ảnh hưởng đến phản hồi.

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

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

Cú pháp

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

Ví dụ 1

Ví dụ sau đây sẽ sao chép thông 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 sẽ sao chép tất 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 đây:

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

<ReasonPhrase> (con của <Copy>)

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

Nếu giá trị "true" là "true", chính sách này sẽ sao chép ReasonPhrase từ phản hồi do thuộc tính source của phần tử <Copy> chỉ định và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ử <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ừ câu trả lời mặc định sang đối tượng phản hồi tuỳ chỉnh:

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

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

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

<StatusCode> (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 đến 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 giá trị "true" ("đúng") thì 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" ("đúng") để sao chép mã trạng thái từ đối tượng phản hồi mặc định vào một đối tượng phản hồi mới, tuỳ chỉnh:

<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 đây:

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

Việc sử dụng <StatusCode> phổ biến là để đảm bảo phản hồi 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> (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 "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" ("đúng") để sao chép động từ trong yêu cầu mặc định sang một yêu cầu tuỳ chỉnh mới:

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

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

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

<Version> (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 "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" trên yêu cầu. Quá trình 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 mới, tuỳ chỉnh:

<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 đây:

  • 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 cho chính sách này bằng một tên khác nghe tự nhiên hơn trong trình chỉnh sửa proxy giao diện người dùng quản lý.

Phần tử <DisplayName> là phần tử chung cho mọi chính sách.

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

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

Cú pháp

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

Ví dụ:

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

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

<IgnoreUnresolvedVariables>

Xác định xem quá trình xử lý có ngừng khi gặp 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 giải quyết và tiếp tục xử lý; nếu không, hãy đặt 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ỗ chế độ này dành riêng cho việc đặt và nhận giá trị của biến. Nếu bạn đặt continueOnError thành true, Edge sẽ bỏ qua mọi lỗi, chứ không chỉ các lỗi gặp phải khi sử dụng biến.

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

Cú pháp

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

Ví dụ 1

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

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

<Remove>

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

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

Một trường hợp sử dụng phổ biến 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 gửi đế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 sẽ xoá nội dung của thông báo khỏi phản hồi:

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

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

Ví dụ 2

Ví dụ sau đây sẽ xoá tất cả các thông số biểu mẫu và 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> (con của <Remove>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 sẽ xoá 3 thông 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ả thông số biểu mẫu khỏi yêu cầu:

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

Ví dụ 3

Nếu có nhiều thông 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 là "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 đây:

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

<Headers> (con của <Remove>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 sẽ 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 sẽ 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 đề trù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 sẽ xoá "h1", "h2" và giá trị thứ hai là "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> (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, do phần tử <AssignTo> chỉ định. Hãy đặt thành "true" để xoá tải trọng; nếu không, hãy đặt là "false". Giá trị mặc định là "false".

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

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

Cú pháp

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

Ví dụ 1

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

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

<QueryParams> (con của <Remove>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 sẽ 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 sẽ 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 sẽ 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 đây:

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

<Set>

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

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

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

Cú pháp

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

Ví dụ 1

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

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

<FormParams> (con của <Set>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 thông 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 tuỳ chỉnh mới:

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

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

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

Nếu bạn xác định thông số biểu mẫu trống trong chính sách (<Add><FormParams/></Add>), chính sách này sẽ không thêm bất kỳ thông số biểu mẫu nào. Việc 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-urlcoded" trước khi gửi thông báo đến điểm cuối đích.

<Headers> (con của <Set>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 sẽ đặt tiêu đề user-agent thành giá trị của biến request.header.user-agent:

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

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

<Path> (con của <Set>)

<Payload> (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 do phần tử <AssignTo> chỉ định. Tải trọng dữ liệu 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 thiết lập một phần 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 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 Apigee cũ hơn của Apigee (ví dụ: trước bản phát hành đám mây 16.08.17), bạn không thể sử dụng dấu ngoặc nhọn để biểu thị các tham chiếu thay đổi trong tải trọng JSON. Trong các bản phát hành đó, bạn cần sử dụng các thuộc tính variablePrefixvariableSuffix để chỉ định các ký tự phân tách và dùng các thuộc tính đó để gói tên biến, như sau:

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

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

Ví dụ 4

Nội dung của <Payload> được coi là một mẫu thông báo. Điều này có nghĩa là chính sách AttributionMessage sẽ thay thế các biến được đặt 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 một 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 Nội dung mô tả Sự hiện diện Loại
contentType

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

Không bắt buộc Chuỗi
variablePrefix Nếu muốn, hãy chỉ định dấu phân cách ở đầu trên biến luồng. Giá trị mặc định là "{". Để biết thêm thông tin, hãy xem Tài liệu tham khảo về biến luồng. Không bắt buộc Chữ ký
variableSuffix Nếu muốn, hãy chỉ định dấu phân cách ở cuối trên biến luồng. Giá trị mặc định là "}". Để biết thêm thông tin, hãy xem Tài liệu tham khảo về biến luồng. Không bắt buộc Chữ ký

<QueryParams> (con của <Set>)

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

Giá trị mặc định không áp dụng
Bắt buộc? Không bắt buộc
Loại Mảng 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 đây:

  • Độ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>), chính sách này sẽ không đặt bất kỳ tham số truy vấn nào. Việc này cũng giống như việc bỏ qua <QueryParams>.

<ReasonPhrase> (con của <Set>)

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

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

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

Cú pháp

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

Ví dụ 1

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

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

Ví dụ 2

Nội dung của <ReasonPhrase> được coi là một mẫu thông báo. Tức 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ụ dưới đâ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 đây:

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

<StatusCode> (con của <Set>)

Thiết lập 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 thông báo. Tức 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ụ dưới đâ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 đây:

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

<Verb> (con của <Set>)

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

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

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

Cú pháp

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

Ví dụ 1

Ví dụ sau đây thiết lập một động từ đơn giản trong 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 thông báo. Đ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 vào 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 đây:

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

<Version> (con của <Set>)

Thiết lập 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 áp dụng
Bắt buộc? Không bắt buộc
Loại Chuỗi hoặc variable
Phần tử mẹ <Set>
Phần tử con Không có

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

Cú pháp

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

Ví dụ 1

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

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

Ví dụ 2

Hàm sau đây sử dụng 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 thông báo. Đ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 đây:

  • 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 composeMessage để tạo thông báo yêu cầu tuỳ chỉnh. Sau khi tạo một yêu cầu tuỳ chỉnh, bạn có thể sử dụng yêu cầu đó theo các cách sau:

  • Truy cập vào các biến của quy tắc trong các chính sách khác
  • Truyền nó đế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 composeMessage. Đặt createNew thành "true" rồi chỉ định tên của thông báo mới trong phần nội dung của phần tử, như trong ví dụ sau:

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

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

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

Ví dụ 1

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

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

Ví dụ sau:

  • 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 sang tin nhắn mới. Vì <Copy> sử dụng tham chiếu tuyệt đối đến biến luồng user-agent, nên bạn không cần chỉ định thuộc tính source cho <Copy>.
    • Đặt tham số truy vấn address trên thông điệp tuỳ chỉnh thành giá trị của tham số truy vấn addy của yêu cầu đến.
    • Đặt động từ HTTP thành GET.
  • Đặt <IgnoreUnresolvedVariables> thành "false". Khi <IgnoreUnresolvedVariables> là "false", nếu một trong các biến mà chính sách cố gắng thêm không tồn tại, Edge sẽ ngừng xử lý trong quy trình API.

Ví dụ 2

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

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

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

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

Video

Xem các video sau để tìm hiểu thêm về chính sách AttributionMessage.

Video Nội dung mô tả
Tại sao nên chỉ định chính sách tin nhắn? Tìm hiểu về các lợi ích của việc sử dụng chính sách AssignmentsMessage để sửa đổi yêu cầu hoặc phản hồi của 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 AttributionMessage 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 AssignmentsMessage.
Xoá các phần tử API bằng chính sách AssignmentsMessage Xoá các phần tử API và sửa đổi API trước khi chuyển đến phần phụ trợ mục tiêu bằng chính sách AttributionMessage.
Thêm và thiết lập các phần tử API bằng chính sách AttributionMessage Thay đổi yêu cầu hoặc phản hồi API bằng cách thêm tham số truy vấn, tiêu đề, tham số biểu mẫu hoặc tải trọng dữ liệu thông qua chính sách composeMessage.
Tạo biến tuỳ chỉnh bằng chính sách AttributionMessage Đặt các biến luồng tuỳ chỉnh bằng chính sách AttributionMessage và tận dụng các biến trong các chính sách khác trong proxy API.
Tạo đối tượng yêu cầu hoặc đối tượng phản hồi mới bằng chính sách AssignmentsMessage Tạo đối tượng phản hồi hoặc yêu cầu API mới bằng chính sách AttributionMessage trong thời gian chạy API.
Tạo API mô phỏng bằng chính sách AssignmentsMessage Tạo một API REST mô phỏng đơn giản bằng cách thêm chính sách composeMessage vào quy trình phản hồi.
Đặt hoặc sửa đổi tải trọng bằng chính sách assignedMessage 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 AssignmentsMessage trong thời gian chạy API.

Mã lỗi

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

Lỗi thời gian chạy

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

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 thể đặt biến. Hãy 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 thông báo.

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

steps.assignmessage.UnresolvedVariable 500

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

  • ngoài phạm vi (không có trong quy trình cụ thể đang thực thi chính sách)
  • hoặc
  • không thể phân giải (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 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 các phần tử <Copy> và/hoặc <Remove> của chính sách Chỉ định tin nhắn là 0 hoặc số âm, thì quá trình triển khai Proxy API sẽ không thành công.
InvalidVariableName Nếu phần tử con <Name> trống hoặc không được chỉ định trong phần tử <AssignVariable>, thì việc triển khai proxy API sẽ không thành công vì không có tên biến hợp lệ nào để chỉ định 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, hãy xem bài viết Những điều bạn cần biết về 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ư 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 của chính sách báo lỗi do người dùng chỉ định. assignmessage.AM-SetResponse.failed = true

Ví dụ về phản hồi 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 giản đồ XML (.xsd). Để tham khảo, lược đồ chính sách có trên GitHub.

Chủ đề có liên quan

Mẫu hoạt động của chính sách AttributionMessage có trong phần 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 tham khảo bài viết này trên Cộng đồng Apigee.

Để xem cách "thiết lập đường dẫn" trong một chính sách về Dịch vụ chú thích, hãy tham khảo nội dung Tìm hiểu bằng cách làm ví dụ trong các mẫu GitHub về Apigee. Bạn chỉ cần sao chép kho lưu trữ và làm theo hướng dẫn trong chủ đề đó. Ví dụ này sử dụng chính sách AttributionMessage để thiết lập đường dẫn yêu cầu, sau đó sử dụng chính sách Chú thích dịch vụ để gửi yêu cầu đến một dịch vụ bên ngoài.