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 Nếu muốn, hãy sử dụng phần tử |
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.
- 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>
- 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:
- 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> ...
- Xoá các phần tử
<SOAPMessage>
và<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>
- Chỉ định vị trí của tệp tài nguyên XSD bằng phần tử
- 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.
- Tạo một tệp tài nguyên WSDL mới. Ví dụ: "example-wsdl.wsdl":
- 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:
- Đặ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"/> ...
- Đặ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 đó. - 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>
- Đặt thuộc tính
- 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:
- 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.
- Xoá các phần tử
<ResourceURL>
,<SOAPMessage>
và<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>
- 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à:
|
Để 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ách và Xử 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ử
|
build |
steps.messagevalidation.NonMessageVariable |
500 |
Lỗi này xảy ra nếu phần tử 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 |
build |
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. | build |
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ợ.
|
build |
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.
|
build |
RootElementNameUnspecified |
Phần tử <Element> trong chính sách SOAPMessageValidation không chứa tên của phần tử gốc. |
build |
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ệ. |
build |
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.