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 việc sau:

  • Xác thực mọi thông báo XML theo giản đồ XSD
  • Xác thực thông báo SOAP theo định nghĩa WSDL
  • Xác định tính hợp lệ của thông điệp 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 không chỉ xác thực thông báo SOAP. Phần này gọi chính sách này là "Chính sách xác thực thông báo".

Phần tử <MessageValidation>

Xác định chính sách Xác thực thông báo.

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 chế độ cài đặt mặc định khi bạn thêm Chính sách xác thực thông báo vào luồng 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ụ

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 xác thực thông báo:

1: Xác thực XSD

Bạn có thể sử 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.xsd":
    <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 thông báo SOAP vào luồng trước 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 chính sách.

    Định nghĩa 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 với XML làm 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 '<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 quy trình 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 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ể sử 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 thông báo SOAP vào luồng trước 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 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> trong phong bì của yêu cầu SOAP.

      Đặt thuộc tính namespace thành không gian tên cho phần tử 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 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 với phong bì SOAP làm 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 đúng định dạng

Bạn có thể sử dụng chính sách Xác thực thông báo để xác nhận rằng tải trọng thông báo JSON hoặc XML được định dạng đúng cách (không giống 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
  • Nội dung không có ký tự không hợp lệ
  • Các đối tượng và thẻ được lồng đúng cách
  • Thẻ bắt đầu và kết thúc khớp nhau

Cách kiểm tra gói dữ liệu XML hoặc JSON được định dạng đúng:

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

    Định nghĩa 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, 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 xem tệp XML có được định dạng đúng cách hay không, 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 một tải trọng thông báo không chứa XML hoặc JSON được định dạng đúng cách, 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 chính sách trong trình chỉnh sửa proxy giao diện người dùng quản lý bằng một tên khác, nghe tự nhiên hơn.

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

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

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

Cú pháp

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

Ví dụ:

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

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

<Element>

Chỉ định phần tử trong thông báo cần xác thực. Đây là phần tử con đầu tiên trong phần tử <Body> của phong bì 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ử duy nhất cần được 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ử để 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? 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 sẽ đượ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. Không thể tham chiếu đến 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ì thông báo sẽ được kiểm tra để đảm bảo 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ó phần tử con hoặc thuộc tính nào.

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 đặt tiền tố xsd cho tệp XSD đi kèm trong thuộc tính schemaLocation.

Giản đồ mẫu 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

Tệp 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 thông báo sẽ không thành công.

Độ sâu nhập tối đa cho một giản đồ là 10. Nếu bạn vượt quá số lần nhập lồng nhau đó, chính sách Xác thực thông báo sẽ không thành cô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? Mô tả
version Không có Không bắt buộc Phiên bản SOAP mà chính sách này sử 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 9 điểm khác biệt giữa SOAP/1.1 và SOAP Phiên bản 1.2.

<Source>

Xác định thông báo nguồn cần 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>, chính sách này sẽ mặc định là "message" (thông báo). Thông báo này đề cập đến thông báo yêu cầu đầy đủ (trong luồng yêu cầu) hoặc thông báo phản hồi (trong luồng phản hồi), bao gồm mọi tải trọng. Bạn cũng có thể đặt giá trị này thành "yêu cầu" hoặc "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 "message" (thông báo), "request" (yêu cầu) và "response" (phản hồi), bạn có thể đặt giá trị của <Source> thành tên của bất kỳ thông báo nào trong luồng của mình. Tuy nhiên, 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 không thể phân giải 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 điều sau sẽ xảy ra:

  • Nếu là giá trị rỗng: Edge sẽ gửi lỗi steps.messagevalidation.SourceMessageNotAvailable.
  • Nếu không phải loại 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 nào.

Mã lỗi

Các lỗi được trả về từ chính sách Edge tuân theo một định dạng nhất quán như mô tả trong phần Tài liệu tham khảo về 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 lược đồ XML (.xsd). Để tham khảo, bạn có thể xem lược đồ chính sách trên GitHub.

Chủ đề có liên quan