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.
info

Nội dung

Chính sách AssignMessage 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 hành động sau đối với những thư đó:

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

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

Chính sách AssignMessage có thể tạo hoặc thay đổi thông báo hoặc biến luồng. Sử dụng chính sách này để sửa đổi thông báo yêu cầu trước khi gửi thông qua proxy đến các hệ thống ngược dòng, hoặc để sửa đổi thông báo phản hồi trước khi chuyển tiếp đến các ứng dụng của người dùng API.

Phần tử <AssignMessage>

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

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

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

Cú pháp

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

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

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

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

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

  <DisplayName>policy_display_name</DisplayName>

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

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

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

</AssignMessage>

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

Ví dụ sau đây cho thấy các chế độ cài đặt mặc định khi bạn thêm chính sách AssignMessage vào 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 AssignMessage mới trong giao diện người dùng Edge, mẫu này sẽ chứa các mã giả lập cho tất cả các thao tác có thể thực hiện. Thông thường, bạn sẽ chọn(các) thao tác mà bạn muốn thực hiện với chính sách này và xoá các phần tử con còn lại. Ví dụ: nếu bạn muốn thực hiện thao tác sao chép, hãy sử dụng phần tử <Copy> và xoá <Add>, <Remove> và các phần tử con khác khỏi chính sách để 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 mô tả tổng quan về các phần tử con của <AssignMessage>:

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

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

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

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

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

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

Ví dụ

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

1: Thêm tiêu đề

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

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

2: Xoá tải trọng

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

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</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="AM-modify-response">
  <Set>
    <Headers>
      <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false
  </IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

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

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

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

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

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

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

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

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

Đối với tải trọng JSON, bạn có thể chèn các biến bằng thuộc tính variablePrefix và variableSuffix 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>

Để xem danh sách đầy đủ các biến luồng, hãy xem phần 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 xoá tham số truy vấn apikey khỏi yêu cầu:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

6: Đặt/lấy giá trị biến

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

  1. Tạo 3 biến luồng trong yêu cầu, có giá trị tĩnh
  2. Lấy các biến luồng một cách linh động trong chính sách thứ hai trong luồng yêu cầu
  3. Đặt các giá trị này trong tải trọng của phản hồi
<!-- Policy #1: Set variables in the request -->

<AssignMessage name="AM-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>
</AssignMessage>

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

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

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

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

  1. Thêm chính sách số 1 và số 2 vào luồng yêu cầu. Hãy nhớ đặt chính sách số 1 trước chính sách số 2.
  2. Thêm chính sách thứ ba vào quy trình phản hồi.
  3. Chính sách thứ ba sử dụng phần tử <Set> để thêm các biến vào phản hồi. Ví dụ sau đây tạo một tải trọng XML trong phản hồi mà Edge trả về cho ứ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>

    Xin lưu ý rằng cú pháp để truy cập vào các biến luồng trong <Set> là gói chúng 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ả qua một tiện ích như xmllint để XML được hiển thị theo cấu trúc có định dạng đẹp mắt:

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

    Nội dung 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 của chú thích dịch vụ

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

<AssignMessage name="AM-Payload-from-SC-header">
  <Set>
    <Payload contentType="application/json">
      {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

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

{calloutResponse.header.Set-Cookie.values}

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

Tài liệu tham khảo về phần tử con

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

<Add>

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

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

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

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

Cú pháps1

<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ụ 1s2

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

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s3

Ví dụ sau đây sử dụng phần tử <Headers> để thêm tiêu đề partner-id vào yêu cầu sẽ được gửi đến điểm cuối mục tiêu:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 3s4

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 name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ này sử dụng <Add> trong luồng 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 đến https://example-target.com/get sẽ trở thành https://example-target.com/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à mẫu thông báo.

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

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

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

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

Cú pháps5

<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ụ 1s6

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

<AssignMessage name="AM-add-formparams-1">
  <Add>
    <FormParams>
      <FormParam name="answer">42</FormParam>
    </FormParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s7

Ví dụ sau đây lấy giá trị của tham số 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, sau đó xoá tham số truy vấn:

<AssignMessage name="AM-Swap-QueryParam-to-FormParams">
  <Add>
    <FormParam name="name">{request.queryparam.name}</FormParam>
  </Add>
  <Remove>
    <QueryParam name="name"/>
  </Remove>
</AssignMessage>

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

Ví dụ 3s8

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

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ này lấy các tham số chuỗi truy vấn từ yêu cầu ban đầu và thêm chúng dưới dạng tham số biểu mẫu có tên khác. Sau đó, hệ thống sẽ xoá các tham số truy vấn ban đầu. Apigee sẽ gửi yêu cầu đã sửa đổi đến điểm cuối mục tiêu.

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

username=nick&zip_code=90210&default_language=en

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

  • Động từ HTTP: POST
  • Loại thông báo: Yêu cầu
  • Một (hoặc cả hai) thông tin 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 trong yêu cầu ban đầu; nếu không, hãy đặt thành độ dài hiện tại, tính bằng byte). Ví dụ: với curl, hãy thêm -H "Content-Length: 0" vào yêu cầu của bạn.

Ví dụ:

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

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

<Headers> (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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm <Header> phần tử
Phần tử mẹ <Add>
Phần tử con <Header>

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

Cú pháps9

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

Ví dụ 1s10

Ví dụ sau đây thêm tiêu đề partner-id vào thông báo yêu cầu và gán giá trị của biến luồng verifyapikey.VAK-1.developer.app.partner-id cho tiêu đề đó.

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

Cú pháps11

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

Ví dụ 1s12

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

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

<AssignTo>

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

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

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

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

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

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

Cú pháps13

<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ụ 1s14

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

<AssignMessage name="assignto-1">
<!-- DO NOT do this -->
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ví dụ 2s15

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

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

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

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

Ví dụ 3s16

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

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

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

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

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

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

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

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

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

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

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

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

Chỉ định loại 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ị được hỗ trợ duy nhất).

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".

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

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

<AssignVariable>

Gán một giá trị cho một biến luồng. Nếu biến luồng không tồn tại, thì <AssignVariable> sẽ tạo biến đó.

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

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

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

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

Cú pháps17

<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 thể truy cập vào biến được <Ref> tham chiếu, thì Edge sẽ sử dụng giá trị do phần tử <Value> chỉ định. Nếu bạn xác định <Template>, thì phần tử này sẽ được ưu tiên hơn các phần tử con khác.

Ví dụ 1s18

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ụ 2s19

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

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

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

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

Ví dụ 3s20

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

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

Một cách sử dụng phổ biến 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 vào cùng với yêu cầu. Bạn có thể thực hiện việc này bằng cách kết hợp cả hai phần tử con <Ref> và <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 bởi chính sách AssignMessage). Nếu biến có tên trong <AssignVariable> không tồn tại, thì chính sách sẽ tạo một biến có tên đó.

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

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

Cú pháps21

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

Ví dụ 1s22

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

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

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

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

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

Giá trị của <Ref> luôn được diễn giải dưới dạng biến luồng; bạn không thể chỉ định một chuỗi 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 có
Bắt buộc? Không bắt buộc
Loại Chuỗi
Phần tử mẹ <AssignVariable>
Phần tử con Không có

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

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

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

Để xác định giá trị mặc định cho biến luồng đích, 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ẽ gán giá trị của <Value> cho biến luồng đích.

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

Cú pháp

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

Ví dụ 1s23

Ví dụ sau đây gán 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 một trong hai phép gán.

Ví dụ 2s23

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

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

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

Ví dụ 3s24

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 một proxy Weather API, trong đó yêu cầu lấy một tham số truy vấn duy nhất có tên là "w". Tham số này chứa mã nhận dạng của thành phố mà bạn muốn biết thô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 AssignMessage như sau:

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

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

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

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

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

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

<Template> (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 thay thế chuỗi biến khi chính sách thực thi và có thể kết hợp chuỗi ký tự với tên biến được gói 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 chữ hoa chữ thường.

Sử dụng thuộc tính ref để chỉ định một biến luồng, trong đó giá trị của biến là một mẫu thông báo. Ví dụ: bạn có thể lưu trữ mẫu thông báo dưới dạng thuộc tính tùy 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 tùy chỉnh của ứng dụng, có sẵn dưới dạng biến luồng từ chính sách bảo mật.

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

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

Cú pháps25

<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ụ 1s26

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

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

Ví dụ 2s27

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

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

Ví dụ 3s28

Ví dụ sau đây chỉ định một biến luồng và một giá trị văn bản. Trong trường hợp này, nếu biến được tham chiếu không rỗng, thì giá trị đó sẽ được dùng làm mẫu. Nếu giá trị được tham chiếu là rỗng, thì giá trị văn bản (trong trường hợp này là {system.uuid}-{messageid}) sẽ được dùng làm mẫu. Mẫu này rất hữu ích để 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 linh động. Ví dụ: một câu lệnh có điều kiện có thể lấy một giá trị từ bản đồ khoá-giá trị và đặt biến được tham chiếu thành giá trị đó:

<AssignMessage name='AV-template-with-fallback'> 
 <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 diễn giải dưới dạng chuỗi ký tự; bạn không thể sử dụng biến luồng làm giá trị, ngay cả khi bạn gói giá trị trong dấu ngoặc ("{}"). Để sử dụng biến luồng, hãy dùng <Ref>.

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

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

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

Cú pháps29

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

Ví dụ 1

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

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

Ví dụ 2

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

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

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

<Copy>

Sao chép các giá trị từ thông báo được chỉ định bằng thuộc tính source vào thông báo được chỉ định bằng phần tử <AssignTo>. 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í thực thi chính sách này trong luồng.

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

Nếu bạn không chỉ định phần tử con nào bên dưới phần tử <Copy>, thì phần tử này sẽ sao chép tất cả các phần của thông báo nguồn được chỉ định.

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

Cú pháps30

<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ụ 1s31

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

<AssignMessage name="AM-copy-1">
  <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo>
  <Copy source="request">
    <Headers>
      <Header name="Header_Name_1"/>
    </Headers>
    <FormParams>
      <FormParam name="Form_Param_Name_1"/>
      <FormParam name="Form_Param_Name_2"/>
      <FormParam name="Form_Param_Name_3"/>
    </FormParams>
    <Path>true</Path>
    <QueryParams/>
  </Copy>
</AssignMessage>

Vì các phần tử như <Payload> và <Verb> không có sẵn, nên chính sách này không sao chép các phần đó của thông báo.

Ví dụ 2s32

Ví dụ sau đây trước tiên sẽ xoá mọi nội dung trong thông báo response hiện có, sau đó sao chép tất cả giá trị từ một thông báo khác có tên là secondResponse vào thông báo response:

<AssignMessage name='AM-Copy-Response'>
  <AssignTo createNew="false" transport="http" type="response">response</AssignTo>
  <!-- first remove any existing values -->
  <Remove/>
  <!-- then copy everything from the designated message -->
  <Copy source="secondResponse"/>
</AssignMessage>

Phần tử <Copy> có một thuộc tính duy nhất:

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

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

  • Nếu bạn không chỉ định source, thì giá trị mặc định sẽ là message, giá trị này sẽ thay đổi tuỳ thuộc vào luồng thực thi chính sách. Nếu chính sách thực thi trong luồng yêu cầu, thì biến message sẽ tham chiếu đến đối tượng request. Nếu chính sách thực thi trong luồng phản hồi, thì biến message sẽ tham chiếu đến đối tượng response.
  • Nếu không thể phân giải biến nguồn hoặc phân giải thành một loại không phải thông báo, 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 được chỉ định bằng thuộc tính source của phần tử <Copy> vào yêu cầu được chỉ định bằng phần tử <AssignTo>. Phần tử này không ảnh hưởng đến phản hồi.

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

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

Cú pháps33

<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ụ 1s34

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

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

Ví dụ 2s35

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

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

Ví dụ 3s36

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

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

Ví dụ 4s37

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

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

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

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

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

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

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

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

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

<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ụ 1s39

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

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

Ví dụ 2s40

Để 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ụ 3s41

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

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

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

<Path> (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 là "true", 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 vào 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ụ 1s42

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

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

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

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

<Payload> (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 là "true", chính sách này sẽ sao chép tải trọng từ thông báo do thuộc tính source của phần tử <Copy> chỉ định 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áps43

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

Ví dụ 1s44

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

<AssignMessage name="AM-copy-payload-1">
  <Copy source="request">
    <Payload>true</Payload>
  </Copy>
  <AssignTo>response</AssignTo>
</AssignMessage>

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

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

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

<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ụ 1s46

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

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

Ví dụ 2s47

Ví dụ sau đây 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 mới, tuỳ chỉnh:

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

Ví dụ 3s48

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

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

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

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

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

<ReasonPhrase> (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 là "true", chính sách này sẽ sao chép ReasonPhrase từ phản hồi được chỉ định bằng thuộc tính source của phần tử <Copy> sang phản hồi được chỉ định bằng 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ử <ReasonPhrase> sử dụng cú pháp sau:

Cú pháps49

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

Ví dụ 1s50

Ví dụ sau đây đặt <ReasonPhrase> thành true. Với phần tử nguồn và <AssignTo> như đã chỉ định, điều này khiến <Copy> sao chép cụm từ lý do từ thông báo phản hồi được đặt tên sang đối tượng response:

<AssignMessage name="AM-copy-reasonphrase-1">
  <Copy source="serviceCalloutResponse">
    <ReasonPhrase>true</ReasonPhrase>
  </Copy>
  <AssignTo>response</AssignTo>
</AssignMessage>

Bạn chỉ có thể sử dụng <ReasonPhrase> khi thông báo nguồn và đích thuộc loại 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 sang phản hồi đích hay không. Phần tử này không ảnh hưởng đến yêu cầu.

Nếu là "true", chính sách này sẽ sao chép mã trạng thái từ thông báo phản hồi được chỉ định bởi thuộc tính source của phần tử <Copy> vào thông báo phản hồi được chỉ định bởi 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ử <StatusCode> sử dụng cú pháp sau:

Cú pháps52

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

Ví dụ 1s53

Ví dụ sau đây đặt <StatusCode> thành "true", sao chép mã trạng thái từ đối tượng phản hồi mặc định sang một đối tượng phản hồi 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 thông báo nguồn và đích thuộc loại Phản hồi.

Một cách sử dụng phổ biến của <StatusCode> là đặt mã trạng thái phản hồi của proxy thành một giá trị khác với giá trị nhận được từ mục tiêu.

<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 là "true", sao chép động từ tìm thấy trong thuộc tính source của phần tử <Copy> vào yêu cầu được chỉ định trong phần tử <AssignTo>.

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

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

Cú pháps54

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

Ví dụ 1s55

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

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

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

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

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

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

Nếu là "true", 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 được chỉ định bởi 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ử <Version> sử dụng cú pháp sau:

Cú pháps56

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

Ví dụ 1s57

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

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

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

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

<DisplayName>

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

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

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

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

Cú pháp

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

Ví dụ

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

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

<IgnoreUnresolvedVariables>

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

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

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

Việc đặt <IgnoreUnresolvedVariables> thành true khác với việc đặt continueOnError của <AssignMessage> thành true ở chỗ việc này chỉ dành riêng cho việc đặt và lấy giá trị của các biến. Nếu bạn đặt continueOnError thành true, thì Edge sẽ bỏ qua tất cả lỗi, 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áps58

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

Ví dụ 1s59

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

<AssignMessage name="AM-Set-Headers">
  <Set>
    <Headers>
      <Header name='new-header'>{possibly-defined-variable}<Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>true
  </IgnoreUnresolvedVariables>
</AssignMessage>

Vì <IgnoreUnresolvedVariables> được đặt thành true, nên nếu biến possibly-defined-variable không được xác định, chính sách này sẽ không báo lỗi.

<Remove>

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

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

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

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

Cú pháps60

<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ụ 1s61

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

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

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

Ví dụ 2s62

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

<AssignMessage name="AM-remove-2">
  <Remove>
    <!-- Empty (<FormParams/>) removes all form parameters -->
    <FormParams/>
    <QueryParams>
      <QueryParam name="qp1"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 3s63

Ví dụ sau đây xoá mọi thứ khỏi đối tượng thông báo:

<AssignMessage name="AM-remove-3">
  <Remove/>
  <AssignTo>request</AssignTo>
</AssignMessage>

Thông thường, bạn chỉ làm việc này nếu định sử dụng phần tử <Set> hoặc phần tử <Copy> để đặt một số giá trị thay thế trong thông báo.

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

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

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

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

Cú pháps64

<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ụ 1s65

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

<AssignMessage name="AM-remove-formparams-1">
  <Remove>
    <FormParams>
      <FormParam name="form_param_1"/>
      <FormParam name="form_param_2"/>
      <FormParam name="form_param_3"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s66

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

<AssignMessage name="AM-remove-formparams-2">
  <Remove>
    <FormParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 3s67

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

<AssignMessage name="AM-remove-formparams-3">
  <Remove>
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

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

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

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

Cú pháp

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

Ví dụ 1s68

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

<AssignMessage name="AM-remove-one-header">
  <Remove>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s69

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

<AssignMessage name="AM-remove-all-headers">
  <Remove>
    <Headers/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 3s70

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

<AssignMessage name="AM-remove-headers-3">
  <Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

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

Cú pháp

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

Ví dụ 1s71

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

<AssignMessage name="AM-remove-payload-1">
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

Cú pháps72

<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ụ 1s73

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

<AssignMessage name="AM-remove-queryparams-1">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s74

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

<AssignMessage name="AM-remove-queryparams-2">
  <Remove>
      <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 3s75

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="AM-remove-queryparams-3">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
        <QueryParam name="qp2"/>
        <QueryParam name="qp3.2"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

Ví dụ: 4s76

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

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

<Set>

Đặt thông tin trong thông báo yêu cầu hoặc phản hồi, được chỉ định bằng phần tử <AssignTo>. <Set> ghi đè các tiêu đề hoặc tham số truy vấn hoặc biểu mẫu đã tồn tại trong thông báo gốc. Tiêu đề, truy vấn và tham số biểu mẫu trong thông báo HTTP có thể chứa nhiều giá trị. Để thêm các giá trị bổ sung cho tiêu đề hoặc tham số, hãy sử dụng phần tử <Add>.

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

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

Cú pháp

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

Ví dụ 1s77

Ví dụ sau đây đặt một tiêu đề cụ thể. Khi được đính kèm trong luồng Yêu cầu, chính sách này sẽ cho phép hệ thống ngược dòng nhận thêm một tiêu đề không có trong yêu cầu gửi đến ban đầu.

<AssignMessage name="AM-Set-Header">
  <Set>
    <Headers>
        <Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
    </Headers>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s78

Ví dụ sau đây ghi đè tải trọng cho một phản hồi, cũng như tiêu đề Content-Type.

<AssignMessage name="AM-Overwrite-Payload">
  <Set>
    <Payload contentType="application/json">{ "status" : 42 }</Payload>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

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

Ghi đè các tham số biểu mẫu hiện có trong một 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 có
Bắt buộc? Không bắt buộc
Loại Mảng gồm <FormParam> phần tử
Phần tử mẹ <Set>
Phần tử con <FormParam>

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

Cú pháps79

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

Ví dụ 1s80

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

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

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

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

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

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

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

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

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

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

Cú pháps81

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

Ví dụ 1s81

Ví dụ sau đây đặt tiêu đề x-ratelimit-remaining thành giá trị của biến ratelimit.Quota-1.available.count:

<AssignMessage name="AM-Set-RateLimit-Header">
  <Set>
    <Headers>
      <Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header>
    </Headers>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Nếu bạn xác định tiêu đề trống trong chính sách (<Set><Headers/></Set>), thì chính sách này sẽ không đặt bất kỳ tiêu đề nào. Việc này sẽ có hiệu lực tương tự như việc bỏ qua <Headers>.

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

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

Xác định nội dung thư cho một yêu cầu hoặc phản hồi, được chỉ định bằng phần tử <AssignTo>. Nội dung tải trọng có thể là bất kỳ loại nội dung hợp lệ nào, chẳng hạn như văn bản thuần túy, 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áps82

<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ụ 1s83

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

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

Ví dụ 2s84

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

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

Ví dụ 3s85

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

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

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

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

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

Ví dụ 4s86

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

Ví dụ sau đây sử dụng cú pháp dấu ngoặc nhọn để đặt một phần 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 Mô tả Tỷ lệ hiển thị Loại
contentType

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

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

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

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

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

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

Cú pháps87

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

Ví dụ 1s88

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

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

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

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

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

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

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

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

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

Cú pháps89

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

Ví dụ 1s90

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

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

Ví dụ 2s91

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

<AssignMessage name="AM-set-reasonphrase-2">
  <Set>
    <ReasonPhrase>{calloutresponse.reason.phrase}</ReasonPhrase>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

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

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

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

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

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

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

Cú pháps92

<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="AM-set-statuscode-404">
  <Set>
    <StatusCode>404</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Ví dụ 2

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

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

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

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

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

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

Cú pháp

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

Ví dụ 1s93

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

<AssignMessage name="AM-set-verb-1">
  <Set>
    <Verb>POST</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ví dụ 2s94

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

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

<AssignMessage name="AM-set-verb-to-dynamic-value">
  <Set>
    <Verb>{my_variable}</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

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

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

Cú pháps95

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

Ví dụ 1s96

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

<AssignMessage name="AM-set-version-1">
  <Set>
    <Version>1.1</Version>
  </Set>
 </AssignMessage>

Ví dụ 2

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

<AssignMessage name="AM-set-version-2">
  <Set>
    <Version>{my_version}</Version>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

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

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

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

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

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

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

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

Theo mặc định, Edge không làm gì với thông báo yêu cầu tuỳ chỉnh. Sau khi tạo, Edge sẽ tiếp tục 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 như chính sách ServiceCallout vào proxy của bạn để có thể chuyển yêu cầu tuỳ chỉnh đến một dịch vụ bên ngoài.

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

Ví dụ 1s97

Ví dụ sau đây tạo một đối tượng yêu cầu tuỳ chỉnh bằng chính sá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ụ này:

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

Ví dụ 2s98

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 chính sách Assign Message:

<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> và <Payload> cho yêu cầu mới.

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

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

Video

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

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

Mã lỗi

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

Lỗi thời gian chạy

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

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

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

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

steps.assignmessage.UnresolvedVariable 500

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

  • ngoài phạm vi (không có trong quy trình cụ thể nơi chính sách đang được thực thi)
  • hoặc
  • không thể giải quyết (không xác định)

Lỗi triển khai

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

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

Biến lỗi

Các biến này được đặt khi chính sách này kích hoạt lỗi trong thời gian chạy. Để biết thêm thông tin, xem phần Bạn cần biết về các lỗi chính sách.

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

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

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

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

    <FaultRule name="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>

Lược đồ

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

Chủ đề có liên quan

Các mẫu hoạt động của chính sách AssignMessage có trong Mẫu nền tảng API.

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

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