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 (Xác thực SOAPMessageValidation) thực hiện những việc 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 theo đị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 thêm so với chỉ thông báo SOAP. Chính sách này được gọi là "Chính sách xác thực thư".

<MessageValidation> phần tử

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

Giá trị mặc định Xem tab 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 thư vào quy trình của bạn 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 minh hoạ một số cách bạn có thể sử dụng tính năng Xác thực tin nhắn chính sách của Google:

1: Xác thực XSD

Bạn có thể sử dụng Chính sách xác thực tin nhắn để 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 tệp tài nguyên XSD mới. Cho 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 quy trình 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 <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.

    Chính sách của bạn có định nghĩa 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 của bạn dưới dạng thông báo XML tải trọng, 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>'

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

    Bạn cũng có thể tạo một 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 -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 quá trình xác thực XSD đ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 của bạn. 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 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 tin nhắn để 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 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 quy trình trước của điểm cuối proxy:
    1. Đặt thuộc tính version của phần tử <SOAPMessage> thành giá trị 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ử 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 <ResourceURL> . Ví dụ:
      ...
        <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL>
      ...

    Chính sách của bạn có định nghĩa 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 phong bì SOAP dưới dạng tải trọng của thư, như trong ví dụ sau đây:
    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>'

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

    Bạn cũng có thể tạo một 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, phản hồi phải tương tự thành các chỉ số 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 tốt

Bạn có thể sử dụng Chính sách xác thực thư để xác nhận rằng tải trọng thư JSON hoặc XML được định dạng đúng (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
  • 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ẻ bắt đầu và thẻ kết thúc trùng khớp với nhau

Cách kiểm tra xem có tải trọng XML hoặc JSON được tạo đúng cách hay khô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á <ResourceURL>, <SOAPMessage>, và <Element> trong định nghĩa về chính sách.

    Chính sách của bạn có định nghĩa như sau:

    <MessageValidation async="false" continueOnError="false"
        enabled="true" name="validateXMLRequest">
      <DisplayName>My JSON Checker</DisplayName>
      <Properties/>
      <Source>request</Source>
    </MessageValidation>
  3. Gửi một 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."
      }
    }'

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

    Để kiểm tra tệp XML xem có đúng định dạng hay không, hãy sử dụng XML làm tải trọng thư và đặt Content-type thành "application/xml".

Bạn sẽ nhận được phản hồi HTTP 200. Khi bạn gửi một gói dữ liệu thư không chứa XML hoặc JSON có định dạng tốt, bạn sẽ nhận được một lỗi steps.messagevalidation.Failed lỗi.

Tham chiếu phần tử con

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

<DisplayName>

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

Phần tử <DisplayName> áp dụng 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 được dùng
Loại Chuỗi
Phần tử mẹ &lt;PolicyElement&gt;
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à trẻ đầu tiên dưới Phần tử <Body> trong 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ử 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 <Element> phần tử:

...
<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 &quot;http://sample.com&quot; Không bắt buộc Xác định không gian tên của phần tử cần được xác thực.

<ResourceURL>

Xác định giản đồ XSD hoặc định nghĩa WSDL 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ài nguyên trong proxy API của bạn. URL 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ì hệ thống sẽ kiểm tra thông báo để tìm JSON có định dạng hợp lệ hoặc XML nếu tiêu đề Content-type là "application/json" hoặc "application/xml", .

Phần tử <ResourceURL> không có các phần tử hoặc thuộc tính 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 tin nhắn có tham chiếu đến một giản đồ khác, bạn phải thêm tiền tố xsd vào tệp XSD đi kèm trong Thuộc tính schemaLocation.

Giản đồ mẫu sau 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 mã này không tham chiếu đến ít nhất một giản đồ, Chính sách Xác thực thư không thành công.

Chiều 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ư không thành công.

<SOAPMessage>

Xác định phiên bản SOAP mà chính sách Xác thực tin nhắn 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 Từ SOAP/1.1 thành SOAP Phiên bản 1.2 trong 9 điểm.

<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 mà bạn muốn xác thực.

Nếu bạn không đặt <Source>, chính sách này sẽ được đặt mặc định thành "thông báo", tức là thông báo hoàn chỉnh thông báo yêu cầu (trong quy trình yêu cầu) hoặc thông báo phản hồi (trong quy trình phản hồi), bao gồm bất kỳ thông báo nào tải trọng. Bạn cũng có thể đặt thành "yêu cầu" một cách rõ ràng hoặc "phản hồi" đề cập đến yêu cầu hoặc của bạn.

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

Nếu giá trị của <Source> không thể phân giải được trong luồng tin nhắn hoặc phân giải thành một tin nhắn không phải là tin nhắn thì một trong các trường hợp sau sẽ xảy ra:

  • Nếu có giá trị rỗng: Edge sẽ gửi ra steps.messagevalidation.SourceMessageNotAvailable lỗi.
  • Nếu loại thông báo không phải là tin nhắn: Edge sẽ gửi một thông báo steps.messagevalidation.NonMessageVariable lỗi.

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

Mã lỗi

Các lỗi do chính sách của Edge trả về sẽ có 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 giản đồ XML (.xsd). Giản đồ chính sách để tham khảo đều có trên GitHub.

Chủ đề có liên quan