Chính sách SOAPMessageValidation

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

Chính sách SOAPMessageValidation thực hiện những hoạt động sau:

  • Xác thực mọi thông báo XML dựa trên giản đồ XSD
  • Xác thực thông báo SOAP dựa trên định nghĩa WSDL
  • Xác định định dạng đúng của thông báo JSON và XML

Mặc dù tên của chính sách này trong giao diện người dùng là "Xác thực thông báo SOAP", nhưng chính sách này xác thực nhiều thông tin khác, ngoài thông báo SOAP. Mục này gọi chính sách là "Chính sách xác thực thư".

Phần tử <MessageValidation>

Xác định chính sách Xác thực thư.

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

Cú pháp

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

<MessageValidation
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
    <!-- All MessageValidation child elements are optional -->
    <DisplayName>policy_display_name</DisplayName>
    <Element namespace="element_namespace">element_to_validate</Element>
    <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/>
    <Source>message_to_validate</Source>
    <ResourceURL>validation_WSDL_or_XSD</ResourceURL>

</MessageValidation>

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 Xác thực tin nhắn vào quy trình trong giao diện người dùng Edge:

<MessageValidation continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
  <DisplayName>SOAP Message Validation-1</DisplayName>
  <Properties/>
  <Element namespace="http://sample.com">sampleObject</Element>
  <SOAPMessage/>
  <Source>request</Source>
  <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
</MessageValidation>

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.

Ví dụ

Ví dụ sau đây cho thấy một số cách sử dụng chính sách Xác thực tin nhắn:

1: Xác thực XSD

Bạn có thể dùng chính sách Xác thực thông báo để xác thực tải trọng của yêu cầu thông báo XML dựa trên giản đồ XSD.

  1. Tạo một tệp tài nguyên XSD mới. Ví dụ: "note-schema.mua":
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="note">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  2. Thêm chính sách Xác thực tin nhắn SOAP vào quy trình trước luồng của điểm cuối proxy:
    1. Chỉ định vị trí của tệp tài nguyên XSD bằng phần tử <ResourceURL>. Ví dụ:
      ...
        <ResourceURL>xsd://note-schema.xsd</ResourceURL>
      ...
    2. Xoá các phần tử <SOAPMessage><Element> khỏi định nghĩa theo chính sách.

    Định nghĩa về chính sách của bạn sẽ có dạng như sau:

    <MessageValidation continueOnError="false"
        enabled="true" name="validateXMLRequest">
      <DisplayName>My XML Validator</DisplayName>
      <Properties/>
      <Source>request</Source>
      <ResourceURL>xsd://note-schema.xsd</ResourceURL>
    </MessageValidation>
  3. Gửi yêu cầu POST đến proxy API bằng XML dưới dạng phần tải thông báo, như trong ví dụ sau:
    curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      -d '<note>
      <to>Fred Rogers</to>
      <from>Nick Danger</from>
      <heading>Greetings from my neighborhood</heading>
      <body>Just writing to say hello.</body>
    </note>'

    Lưu ý rằng tiêu đề Content-type được đặt thành "application/xml".

    Bạn cũng có thể tạo tệp dữ liệu cho tải trọng và tham chiếu tệp đó bằng một lệnh tương tự như sau:

    curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      --data '@../examples/note-payload.xml'

Bạn sẽ nhận được phản hồi HTTP 200. Tuỳ thuộc vào điểm cuối mục tiêu, bạn có thể nhận được thêm thông tin chi tiết về yêu cầu. Ví dụ: nếu bạn sử dụng http://httpbin.org/post làm điểm cuối mục tiêu và chỉ định đầu ra -v (chi tiết), thì phản hồi sẽ tương tự như sau:

< HTTP/1.1 200 OK
< Date: Wed, 16 May 2018 21:24:54 GMT
< Content-Type: application/xml
< Content-Length: 431
< Connection: keep-alive
< Server: gunicorn/19.8.1
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Via: 1.1 vegur
{
  "args":{},
  "data":"<note><to>fred</to><from>nick</from><heading>hello</heading>
    <body>Just writing to say hello.</body></note>",
  "files":{},
  "form":{},
  "headers": {
    "Accept":"*/*",
    "Connection":"close",
    "Content-Length":"106",
    "Content-Type":"application/xml",
    "Host":"httpbin.org",
    "User-Agent":"curl/7.58.0"
  },
  "json":null,
  "origin":"10.1.1.1, 104.154.179.1",
  "url":"http://httpbin.org/post"
}

Để xác minh rằng phương thức xác thực XSD của bạn đang hoạt động, hãy thử chèn một thẻ khác vào phần nội dung của yêu cầu. Ví dụ:

curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock
  -d '<note>
  <to>Fred Rogers</to>
  <from>Nick Danger</from>
  <heading>Greetings from my neighborhood</heading>
  <body>Just writing to say hello.</body>
  <badTag>Not good</badTag>
</note>'

Bạn sẽ nhận được thông báo lỗi xác thực.

2: Xác thực SOAP

Bạn có thể dùng chính sách Xác thực thông báo để xác thực tải trọng của yêu cầu thông báo SOAP dựa trên WSDL.

  1. Tạo một tệp tài nguyên WSDL mới. Ví dụ: "example-wsdl.wsdl":
  2. Thêm chính sách Xác thực tin nhắn SOAP vào quy trình trước luồng của điểm cuối proxy:
    1. Đặt thuộc tính version của phần tử <SOAPMessage> thành phiên bản của giao thức SOAP mà bạn muốn xác thực. Ví dụ: "1.1":
      ...
        <SOAPMessage version="1.1"/>
      ...
    2. Đặt giá trị của phần tử <Element> thành phần tử mà bạn muốn xác thực:
      ...
        <Element namespace="https://example.com/gateway">getID</Element>
      ...

      <Element> chỉ định phần tử con đầu tiên trong phần tử <Body> trên phong bì của yêu cầu SOAP.

      Đặt thuộc tính namespace thành không gian tên cho thành phần con đó.

    3. Chỉ định vị trí của tệp tài nguyên WSDL bằng phần tử <ResourceURL>. Ví dụ:
      ...
        <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
      ...

    Định nghĩa về chính sách của bạn sẽ có dạng như sau:

    <MessageValidation continueOnError="false"
        enabled="true" name="validateSOAPRequest">
      <DisplayName>My SOAP Validator</DisplayName>
      <Properties/>
      <Source>request</Source>
      <SOAPMessage version="1.1"/>
      <Element namespace="https://example.com/gateway">getID</Element>
      <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
    </MessageValidation>
  3. Gửi yêu cầu POST đến proxy API của bạn bằng đường bao SOAP dưới dạng tải trọng thông báo, như trong ví dụ sau:
    curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:prox="https://example.com/gateway" xmlns:typ="https://example.com/gateway/types">
      <soapenv:Header/>
      <soapenv:Body>
        <prox:getID>
          <typ:MyType>
            <typ:ID>42</typ:ID>
          </typ:MyType>
        </prox:getID>
      </soapenv:Body>
    </soapenv:Envelope>'

    Lưu ý rằng tiêu đề Content-type được đặt thành "application/xml".

    Bạn cũng có thể tạo tệp dữ liệu cho tải trọng và tham chiếu tệp đó bằng một lệnh tương tự như sau:

    curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock
      --data '@../examples/soap-payload.xml'

Bạn sẽ nhận được phản hồi HTTP 200. Tuỳ thuộc vào điểm cuối mục tiêu, bạn có thể nhận được thêm thông tin chi tiết về yêu cầu. Ví dụ: nếu bạn sử dụng http://httpbin.org/post làm điểm cuối mục tiêu, thì phản hồi sẽ tương tự như sau:

< HTTP/1.1 200 OK
< Date: Wed, 16 May 2018 21:24:54 GMT
< Content-Type: application/xml
< Content-Length: 431
< Connection: keep-alive
< Server: gunicorn/19.8.1
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
< Via: 1.1 vegur
{
  "args":{},
  "data":"<note><to>fred</to><from>nick</from><heading>hello</heading>
    <body>Just writing to say hello.</body></note>",
  "files":{},
  "form":{},
  "headers": {
    "Accept":"*/*",
    "Connection":"close",
    "Content-Length":"106",
    "Content-Type":"application/xml",
    "Host":"httpbin.org",
    "User-Agent":"curl/7.58.0"
  },
  "json":null,
  "origin":"10.1.1.1, 104.154.179.1",
  "url":"http://httpbin.org/post"
}

3: XML/JSON được định dạng đúng

Bạn có thể dùng chính sách Xác thực thông báo để xác nhận rằng trọng tải thông báo JSON hoặc XML được định dạng đúng (không giống với quy trình xác thực). Chính sách này đảm bảo rằng cấu trúc và nội dung đáp ứng các tiêu chuẩn được chấp nhận, bao gồm:

  • Có một phần tử gốc duy nhất
  • Không có ký tự không hợp lệ trong nội dung
  • Các đối tượng và thẻ được lồng đúng cách
  • Thẻ mở đầu và thẻ kết thúc khớp nhau

Cách kiểm tra tải trọng XML hoặc JSON được định dạng đúng:

  1. Thêm chính sách Xác thực thư SOAP vào quy trình trước luồng của điểm cuối proxy.
  2. Xoá các phần tử <ResourceURL>, <SOAPMessage><Element> khỏi định nghĩa về chính sách.

    Định nghĩa về chính sách của bạn sẽ có dạng như sau:

    <MessageValidation async="false" continueOnError="false"
        enabled="true" name="validateXMLRequest">
      <DisplayName>My JSON Checker</DisplayName>
      <Properties/>
      <Source>request</Source>
    </MessageValidation>
  3. Gửi yêu cầu POST đến proxy API của bạn, như trong ví dụ sau:
    curl -v -X POST -H 'Content-Type: application/json' http://my-test.apigee.net/v1/xsd-mock
      -d '{
    "note": {
      "to": "Fred Rogers",
      "from": "Nick Danger",
      "header": "Greetings from my neighborhood",
      "body": "Just writing to say hello."
      }
    }'

    Lưu ý rằng tiêu đề Content-type được đặt thành "application/json".

    Để kiểm tra tệp XML về định dạng phù hợp, hãy sử dụng XML làm tải trọng thông báo và đặt Content-type thành "application/xml".

Bạn sẽ nhận được phản hồi HTTP 200. Khi gửi tải trọng thông báo không chứa XML hoặc JSON được định dạng đúng, bạn sẽ nhận được lỗi steps.messagevalidation.Failed.

Tham chiếu phần tử con

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

<DisplayName>

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

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

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

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

Cú pháp

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

Ví dụ:

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

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

<Element>

Chỉ định phần tử trong thông báo để xác thực. Đây là phần tử con đầu tiên trong phần tử <Body> trên phong bì của yêu cầu SOAP.

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

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

Cú pháp

...
  <Element namespace="element_namespace">element_to_validate</Element>
...

Ví dụ 1

Ví dụ sau đây xác định một phần tử cần xác thực:

...
<Element namespace="https://example.com/gateway">getID</Element>
...

Ví dụ 2

Bạn có thể chỉ định nhiều phần tử cần xác thực bằng cách thêm nhiều phần tử <Element>:

...
<Element namespace="https://example.com/gateway">getID</Element>
<Element namespace="https://example.com/gateway">getDetails</Element>
...

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

Thuộc tính Mặc định Bắt buộc? Nội dung mô tả
namespace "http://sample.com" Không bắt buộc Xác định không gian tên của phần tử cần xác thực.

<ResourceURL>

Xác định giản đồ XSD hoặc định nghĩa WSDL được dùng để xác thực thông báo nguồn.

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

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

Cú pháp

...
  <ResourceURL>[wsdl|xsd]://validation_WSDL_or_XSD</ResourceURL>
...

Ví dụ

Đối với tệp XML:

...
<ResourceURL>xsd://note-schema.xsd</ResourceURL>
...

Đối với WSDL:

...
<ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
...

Giá trị của <ResourceURL> phải trỏ đến một tệp tài nguyên trong proxy API của bạn. Mô-đun này không được tham chiếu đến các tài nguyên bên ngoài qua HTTP hoặc HTTPS.

Nếu bạn không chỉ định giá trị cho <ResourceURL>, thông báo sẽ được kiểm tra đối với JSON hoặc XML có định dạng đúng nếu tiêu đề Content-type lần lượt là "application/json" hoặc "application/xml".

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

Sử dụng XSD để xác thực

Nếu tải trọng XML mà bạn xác thực bằng chính sách Xác thực thông báo tham chiếu đến một giản đồ khác, thì bạn phải thêm xsd vào tiền tố tệp XSD cho tệp XSD trong thuộc tính schemaLocation.

Giản đồ ví dụ sau đây bao gồm nhiều XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:include schemaLocation="xsd://note-schema.xsd"/>
  <xs:include schemaLocation="xsd://letter-schema.xsd"/>
  <xs:include schemaLocation="xsd://user-schema.xsd"/>
</xs:schema>

Sử dụng WSDL để xác thực

Mỗi WSDL phải xác định ít nhất một giản đồ. Nếu không tham chiếu đến ít nhất một giản đồ, thì chính sách Xác thực tin nhắn sẽ không thành công.

Chiều sâu nhập tối đa cho giản đồ là 10. Nếu bạn vượt quá số lệnh nhập lồng nhau đó, thì chính sách Xác thực tin nhắn sẽ không hoạt động.

<SOAPMessage>

Xác định phiên bản SOAP mà chính sách Xác thực thông báo sẽ xác thực.

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

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

Cú pháp

...
  <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/>
...

Ví dụ:

...
<SOAPMessage version="1.1"/>
...

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

Thuộc tính Mặc định Bắt buộc? Nội dung mô tả
version Không có Không bắt buộc Phiên bản SOAP mà chính sách này dùng để xác thực thông báo SOAP.

Các giá trị hợp lệ là:

  • "1,1"
  • "1,2"
  • "1,1/1,2"

Để biết thêm thông tin, hãy xem nội dung Từ SOAP/1.1 đến SOAP Phiên bản 1.2 trong 9 điểm.

<Source>

Xác định thông báo nguồn cần được xác thực. Giá trị của phần tử này là tên của thông báo mà bạn muốn xác thực.

Nếu bạn không đặt <Source>, thì chính sách này sẽ mặc định đặt thành "tin nhắn", tức là thông báo yêu cầu hoàn chỉnh (trong một quy trình yêu cầu) hoặc thông báo phản hồi (trong một quy trình phản hồi), bao gồm cả mọi tải trọng. Bạn cũng có thể đặt rõ ràng thành "request" (yêu cầu) hoặc "response" (phản hồi) để tham chiếu đến yêu cầu hoặc phản hồi.

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

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

Cú pháp

...
  <Source>message_to_validate</Source>
...

Ví dụ:

...
<Source>request</Source>
...

Ngoài các "tin nhắn", "yêu cầu" và "phản hồi", bạn có thể đặt giá trị của <Source> thành tên của bất kỳ tin nhắn nào trong quy trình. Nếu làm như vậy, bạn phải tạo một thông báo tuỳ chỉnh có tên đó trong luồng trước khi chính sách này thực thi. Nếu không, bạn sẽ gặp lỗi.

Nếu hệ thống không phân giải được giá trị của <Source> trong luồng thông báo hoặc phân giải thành một loại không phải thông báo, thì một trong những trường hợp sau sẽ xảy ra:

  • Nếu là giá trị rỗng: Edge sẽ gửi lỗi steps.messagevalidation.SourceMessageNotAvailable.
  • Nếu loại thông báo không phải là thông báo: Edge sẽ gửi lỗi steps.messagevalidation.NonMessageVariable.

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

Mã lỗi

Các lỗi trả về từ chính sách Edge có một định dạng nhất quán như mô tả trong Tài liệu tham khảo mã lỗi.

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

Lỗi thời gian chạy

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

Mã lỗi Trạng thái HTTP Nguyên nhân Khắc phục
steps.messagevalidation.SourceMessageNotAvailable 500

Lỗi này xảy ra nếu một biến được chỉ định trong phần tử <Source> của chính sách:

  • ngoài phạm vi (không có trong quy trình cụ thể đang thực thi chính sách)
  • hoặc
  • không thể phân giải (không xác định)
steps.messagevalidation.NonMessageVariable 500

Lỗi này xảy ra nếu phần tử <Source> trong chính sách SOAPMessageValidation được đặt thành một biến không thuộc loại thông báo.

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

steps.messagevalidation.Failed 500 Lỗi này xảy ra nếu chính sách SOAPMessageValidation không xác thực được tải trọng thông báo đầu vào theo giản đồ XSD hoặc định nghĩa WSDL. Điều này cũng sẽ xảy ra nếu thông báo tải trọng có định dạng JSON hoặc XML không đúng định dạng.

Lỗi triển khai

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

Tên lỗi Nguyên nhân Khắc phục
InvalidResourceType Phần tử <ResourceURL> trong chính sách SOAPMessageValidation được đặt thành một loại tài nguyên không được chính sách này hỗ trợ.
ResourceCompileFailed Tập lệnh tài nguyên được tham chiếu trong phần tử <ResourceURL> của chính sách SOAPMessageValidation có chứa một lỗi ngăn cản quá trình biên dịch.
RootElementNameUnspecified Phần tử <Element> trong chính sách SOAPMessageValidation không chứa tên của phần tử gốc.
InvalidRootElementName Phần tử <Element> trong chính sách SOAPMessageValidation chứa tên thành phần gốc không tuân thủ các quy tắc XML về cách đặt tên thành phần hợp lệ.

Giản đồ

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

Chủ đề có liên quan