Diese Seite gilt für Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen
Die SOAPMessageValidation-Richtlinie führt Folgendes aus:
- Validiert alle XML-Nachrichten anhand ihrer XSD-Schemas
- Überprüft SOAP-Nachrichten anhand einer WSDL-Definition
- Bestimmt die Wohlgeformtheit von JSON- und XML-Nachrichten
Auch wenn der Name dieser Richtlinie in der UI SOAPMessageValidation lautet, validiert die Richtlinie mehr als nur SOAP-Nachrichten. In diesem Abschnitt wird die Richtlinie als MessageValidation-Richtlinie bezeichnet.
Die MessageValidation-Richtlinie bietet folgende Vorteile:
- Informiert umgehend App-Entwickler, die Ihre API verwenden, wenn ihre Anfragen nicht konform oder unvollständig sind.
- Zeigt Probleme in Anfragen an, z. B. XML-Tags, die nicht ordnungsgemäß geschlossen sind.
- Schützt Back-End-Dienste durch Blockieren von XML- oder SOAP-Nachrichten mit Strukturen, die unvorhersehbares Verhalten verursachen können.
- Reduziert den Zeitaufwand für die Fehlerbehebung, die Suche in Foren oder die Beratung durch den technischen Support.
- Entwickler dazu animieren, sich mit der WSDL-Definition des XML-Schemas vertraut zu machen, indem Sie wohlbekanntes XML zu einer Schlüsselkomponente Ihrer API-Dokumentation machen.
Diese Richtlinie ist eine Standardrichtlinie, die in jeder Umgebung bereitgestellt werden kann. Informationen zu Richtlinientypen und zur Verfügbarkeit bei jedem Umgebungstyp finden Sie unter Richtlinientypen.
Videos
In den folgenden Videos erfahren Sie mehr über die MessageValidation-Richtlinie:
| Video | Beschreibung |
|---|---|
| XML-Anfrage validieren | Validieren Sie die XML-Anfrage für eine API mithilfe der MessageValidation-Richtlinie. |
| JSON-Anfrage validieren | Validieren Sie die JSON-Anfrage für eine API mithilfe der MessageValidation-Richtlinie. |
Element <MessageValidation>
Definiert die MessageValidation-Richtlinie.
| Standardwert | Siehe Tab Standardrichtlinie unten. |
| Erforderlich? | Optional |
| Typ | Komplexes Objekt |
| Übergeordnetes Element | – |
| Untergeordnete Elemente |
<DisplayName><Element><ResourceURL><SOAPMessage><Source> |
Syntax
Das <MessageValidation>-Element verwendet die folgende Syntax:
<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>Standardrichtlinie
Das folgende Beispiel zeigt die Standardeinstellungen, wenn Sie in der Apigee-UI Ihrem Ablauf eine MessageValidation-Richtlinie hinzufügen:
<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>
Dieses Element hat folgende Attribute, die allen Richtlinien gemeinsam sind:
| Attribut | Standard | Erforderlich? | Beschreibung |
|---|---|---|---|
name |
- | Erforderlich |
Der interne Name der Richtlinie. Der Wert des Attributs Optional können Sie das Element |
continueOnError |
false | Optional | Legen Sie false fest, um einen Fehler zurückzugeben, wenn eine Richtlinie fehlschlägt. Dies ist für die meisten Richtlinien das erwartete Verhalten. Legen Sie true fest, damit die Ablaufausführung auch nach dem Fehlschlagen einer Richtlinie fortgesetzt wird. Weitere Informationen:
|
enabled |
wahr | Optional | Setzen Sie den Wert auf true, um die Richtlinie zu erzwingen. Legen Sie false fest, um die Richtlinie zu deaktivieren. Die Richtlinie wird nicht durchgesetzt, selbst wenn sie mit einem Ablauf verknüpft ist. |
async |
false | Verworfen | Dieses Attribut wurde verworfen. |
Beispiele
Die folgenden Beispiele zeigen einige Möglichkeiten, wie Sie die MessageValidation-Richtlinie verwenden können:
1: XSD-Validierung
Sie können die MessageValidation-Richtlinie verwenden, um die Nutzlast einer XML-Nachrichtenanfrage mit einem XSD-Schema zu validieren.
- Erstellen Sie eine neue XSD-Ressourcendatei. Zum Beispiel,
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>
- Fügen Sie die MessageValidation-Richtlinie von SOAP dem Pre-Flow Ihres Proxy-Endpunkts hinzu:
- Geben Sie den Speicherort Ihrer XSD-Ressourcendatei mit dem Element
<ResourceURL>an. Beispiel:... <ResourceURL>xsd://note-schema.xsd</ResourceURL> ...
- Entfernen Sie die Elemente
<SOAPMessage>,<Element>anhand der Richtliniendefinition.
Ihre Richtliniendefinition sollte so aussehen:
<MessageValidation continueOnError="false" enabled="true" name="validateXMLRequest"> <DisplayName>My XML Validator</DisplayName> <Properties/> <Source>request</Source> <ResourceURL>xsd://note-schema.xsd</ResourceURL> </MessageValidation> - Geben Sie den Speicherort Ihrer XSD-Ressourcendatei mit dem Element
- Senden Sie eine
POST-Anfrage mit Ihrer XML als Nachrichtennutzlast an Ihren API-Proxy, wie das folgende Beispiel zeigt: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>'
Beachten Sie, dass für den
Content-type-Header der Wertapplication/xmlfestgelegt ist.Sie können auch eine Datendatei für die Nutzlast erstellen und mit einem Befehl wie diesem referenzieren:
curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock --data '@../examples/note-payload.xml'
Sie sollten eine HTTP 200-Antwort erhalten. Abhängig von Ihrem Zielendpunkt erhalten Sie möglicherweise zusätzliche Details zur Anfrage. Wenn Sie zum Beispiel http://httpbin.org/post als Zielendpunkt verwenden und eine -v-Ausgabe (ausführlich) angeben, sollte die Antwort in etwa so aussehen:
< 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" }
Fügen Sie ein anderes Tag in den Text Ihrer Anfrage ein, um zu prüfen, ob die XSD-Validierung funktioniert. Beispiel:
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>'
Sie sollten einen Validierungsfehler erhalten.
2. SOAP-Validierung
Sie können die MessageValidation-Richtlinie zum Validieren der Nutzlast einer SOAP-Nachrichtenanfrage anhand einer WSDL verwenden.
- Erstellen Sie eine neue WSDL-Ressourcendatei. Zum Beispiel "example-wsdl.wsdl":
- Fügen Sie die MessageValidation-Richtlinie von SOAP dem Pre-Flow Ihres Proxy-Endpunkts hinzu:
- Setzen Sie das Attribut
versiondes Elements<SOAPMessage>auf die Version des SOAP-Protokolls, das Sie zur Validierung verwenden möchten. Zum Beispiel 1.1:... <SOAPMessage version="1.1"/> ...
- Setzen Sie den Wert des Elements
<Element>auf das Element, das Sie validieren möchten:... <Element namespace="https://example.com/gateway">getID</Element> ...
<Element>gibt das erste untergeordnete Element unter<Body>im Envelope der SOAP-Anfrage an.Setzen Sie das Attribut
namespaceauf den Namespace für dieses untergeordnete Element. - Geben Sie den Speicherort Ihrer WSDL-Ressourcendatei mit dem Element
<ResourceURL>an. Beispiel:... <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> ...
Ihre Richtliniendefinition sollte so aussehen:
<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> - Setzen Sie das Attribut
- Senden Sie eine
POST-Anfrage mit dem SOAP-Envelope als Nachrichtennutzlast an Ihren API-Proxy, wie das folgende Beispiel zeigt: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>'
Beachten Sie, dass der Header
Content-typeauf "application/xml" gesetzt ist.Sie können auch eine Datendatei für die Nutzlast erstellen und mit einem Befehl wie diesem referenzieren:
curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock --data '@../examples/soap-payload.xml'
Sie sollten eine HTTP 200-Antwort erhalten. Abhängig von Ihrem Zielendpunkt erhalten Sie möglicherweise zusätzliche Details zur Anfrage. Wenn Sie beispielsweise http://httpbin.org/post als Zielendpunkt verwenden, sollte die Antwort in etwa so aussehen:
< 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: Wohlgeformtes XML/JSON
Mit der MessageValidation-Richtlinie können Sie überprüfen, ob die Nutzlast einer JSON- oder XML-Nachricht wohlgeformt ist (nicht dasselbe wie Validierung). Die Richtlinie stellt sicher, dass die Struktur und der Inhalt anerkannten Standards entsprechen, einschließlich:
- Es gibt ein einziges Stammelement.
- Der Inhalt enthält keine unzulässigen Zeichen.
- Objekte und Tags sind ordnungsgemäß verschachtelt.
- Start- und End-Tags stimmen überein.
So prüfen Sie eine wohlgeformte XML- oder JSON-Nutzlast:
- Fügen Sie die MessageValidation-Richtlinie von SOAP dem Pre-Flow Ihres Proxy-Endpunkts hinzu.
- Entfernen Sie die Elemente
<ResourceURL>,<SOAPMessage>und<Element>anhand der Richtliniendefinition.Ihre Richtliniendefinition sollte so aussehen:
<MessageValidation async="false" continueOnError="false" enabled="true" name="validateXMLRequest"> <DisplayName>My JSON Checker</DisplayName> <Properties/> <Source>request</Source> </MessageValidation> - Senden Sie eine
POST-Anfrage an Ihren API-Proxy, wie das folgende Beispiel zeigt: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." } }'Beachten Sie, dass für den
Content-type-Header der Wertapplication/jsonfestgelegt ist.Um eine XML-Datei auf Wohlgeformtheit zu prüfen, verwenden Sie XML als Nachrichtennutzlast und setzen Sie
Content-typeaufapplication/xml.
Sie sollten eine HTTP 200-Antwort erhalten. Wenn Sie eine Nachrichtennutzlast senden, die kein korrekt formatiertes XML- oder JSON-Format enthält, sollten Sie den Fehler steps.messagevalidation.Failed erhalten.
Verweis auf untergeordnetes Element
In diesem Abschnitt werden die untergeordneten Elemente von <MessageValidation> beschrieben.
<DisplayName>
Wird zusätzlich zum Attribut name verwendet, um die Richtlinie im Proxy-Editor der Verwaltungs-UI mit einem anderen, natürlicher klingenden Namen zu versehen.
Das Element <DisplayName> ist für alle Richtlinien gleich.
| Standardwert | – |
| Erforderlich? | Optional. Wenn Sie <DisplayName> weglassen, wird der Wert des Attributs name der Richtlinie verwendet. |
| Typ | String |
| Übergeordnetes Element | <PolicyElement> |
| Untergeordnete Elemente | Keine |
Das <DisplayName>-Element verwendet die folgende Syntax:
Syntax
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
Beispiel
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
Das <DisplayName>-Element hat keine Attribute oder untergeordneten Elemente.
<Element>
Gibt das zu validierende Element in der Nachricht an. Dies ist das erste untergeordnete Element unter <Body> im Envelope der SOAP-Anfrage.
| Standardwert | sampleObject |
| Erforderlich? | Optional |
| Typ | String |
| Übergeordnetes Element |
<MessageValidation>
|
| Untergeordnete Elemente | Keine |
Das Element <Element> verwendet die folgende Syntax:
Syntax
... <Element namespace="element_namespace">element_to_validate</Element> ...
Beispiel 1
Im folgenden Beispiel wird ein einzelnes zu validierendes Element definiert:
... <Element namespace="https://example.com/gateway">getID</Element> ...
Beispiel 2
Sie können mehrere Elemente für die Überprüfung angeben, indem Sie mehrere <Element>-Elemente hinzufügen:
... <Element namespace="https://example.com/gateway">getID</Element> <Element namespace="https://example.com/gateway">getDetails</Element> ...
Das <Element>-Element hat die folgenden Attribute:
| Attribut | Standard | Erforderlich? | Beschreibung |
|---|---|---|---|
namespace |
"http://sample.com" | Optional | Definiert den Namespace des zu validierenden Elements. |
<ResourceURL>
Gibt das XSD-Schema oder die WSDL-Definition an, die zur Validierung der Quellnachricht verwendet werden soll.
| Standardwert | wsdl://display_name.wsdl |
| Erforderlich? | Optional |
| Typ | String |
| Übergeordnetes Element |
<MessageValidation>
|
| Untergeordnete Elemente | Keine |
Das Element <ResourceURL> verwendet die folgende Syntax:
Syntax
... <ResourceURL>[wsdl|xsd]://validation_WSDL_or_XSD</ResourceURL> ...
Beispiele
Für eine XML-Datei:
... <ResourceURL>xsd://note-schema.xsd</ResourceURL> ...
Für eine WSDL-Datei:
... <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> ...
Der Wert von <ResourceURL> muss auf eine Ressourcendatei in Ihrem API-Proxy verweisen. Er kann nicht über HTTP oder HTTPS auf externe Ressourcen verweisen.
Wenn Sie keinen Wert für <ResourceURL> angeben, wird die Nachricht auf wohlgeformte JSON oder XML überprüft, wenn der Content-type-Header application/json oder application/xml.
Das <ResourceURL>-Element hat keine untergeordneten Elemente oder Attribute.
XSDs zur Validierung verwenden
Wenn die XML-Nutzlast, die Sie mit der MessageValidation-Richtlinie validieren, auf ein anderes Schema verweist, müssen Sie der enthaltenen XSD-Datei im Attribut schemaLocation das Präfix xsd voranstellen.
Das folgende Beispielschema besteht aus mehreren XSD-Dateien:
<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>
WSDLs zur Validierung verwenden
Eine WSDL-Datei muss mindestens ein Schema definieren. Wenn sie nicht auf mindestens ein Schema verweist, schlägt die MessageValidation-Richtlinie fehl.
Die maximale Importtiefe für ein Schema beträgt 10. Wenn Sie diese Anzahl von verschachtelten Importen überschreiten, schlägt die MessageValidation-Richtlinie fehl.
<SOAPMessage>
Definiert die SOAP-Version, die zur Validierung der MessageValidation-Richtlinie verwendet wird.
| Standardwert | – |
| Erforderlich? | Optional |
| Typ | – |
| Übergeordnetes Element |
<MessageValidation>
|
| Untergeordnete Elemente | Keine |
Das Element <SOAPMessage> verwendet die folgende Syntax:
Syntax
... <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/> ...
Beispiel
... <SOAPMessage version="1.1"/> ...
Das <SOAPMessage>-Element hat die folgenden Attribute:
| Attribut | Standard | Erforderlich? | Beschreibung |
|---|---|---|---|
version |
Keine | Optional | Die SOAP-Version, die von dieser Richtlinie zum Validieren der SOAP-Nachrichten verwendet wird. Gültige Werte sind:
|
Weitere Informationen finden Sie unter Von SOAP/1.1 zu SOAP-Version 1.2 in 9 Punkten.
<Source>
Gibt die zu validierende Quellnachricht an. Der Wert dieses Elements ist der Name der Nachricht, die Sie überprüfen möchten.
Wenn Sie <Source> nicht festlegen, wird diese Richtlinie standardmäßig auf message gesetzt. Dies bezieht sich auf die gesamte Anfragenachricht (in einem Anfrageablauf) oder auf die Antwortnachricht (in einem Antwortablauf), einschließlich der Nutzlast. Sie können sie auch explizit auf request oder response setzen, um auf die Anfrage oder Antwort zu verweisen.
| Standardwert | Anfrage |
| Erforderlich? | Optional |
| Typ | String |
| Übergeordnetes Element |
<MessageValidation>
|
| Untergeordnete Elemente | Keine |
Das Element <Source> verwendet die folgende Syntax:
Syntax
... <Source>message_to_validate</Source> ...
Beispiel
... <Source>request</Source> ...
Zusätzlich zu message, request und response können Sie den Wert von <Source> auf den Namen einer beliebigen Nachricht in Ihrem Ablauf festlegen. In diesem Fall müssen Sie jedoch vor dem Ausführen dieser Richtlinie eine benutzerdefinierte Nachricht mit diesem Namen erstellen. Andernfalls erhalten Sie eine Fehlermeldung.
Wenn der Wert von <Source> nicht im Nachrichtenfluss aufgelöst werden kann oder in einen Nicht-Nachrichtentyp aufgelöst wird, tritt einer der folgenden Fälle ein:
- Bei einem Nullwert: Apigee gibt einen
steps.messagevalidation.SourceMessageNotAvailable-Fehler aus. - Bei einem Nicht-Nachrichtentyp: Apigee gibt einen
steps.messagevalidation.NonMessageVariable-Fehler aus.
Das <Source>-Element hat keine Attribute oder untergeordneten Elemente.
Fehlercodes
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
steps.messagevalidation.SourceMessageNotAvailable |
500 |
This error occurs if a variable specified in the
|
build |
steps.messagevalidation.NonMessageVariable |
500 |
This error occurs if the Message type variables represent entire HTTP requests and responses. The built-in Apigee
flow variables |
build |
steps.messagevalidation.Failed |
500 | This error occurs if the SOAPMessageValidation policy fails to validate the input message payload against the XSD schema or WSDL definition. It will also occur if there is malformed JSON or XML in the payload message. | build |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidResourceType |
The <ResourceURL> element in the SOAPMessageValidation policy is set to a resource type
not supported by the policy.
|
build |
ResourceCompileFailed |
The resource script referenced in the <ResourceURL> element of the SOAPMessageValidation
policy contains an error that prevents it from compiling.
|
build |
RootElementNameUnspecified |
The <Element> element in the SOAPMessageValidation policy does not contain the root
element's name. |
build |
InvalidRootElementName |
The <Element> element in the SOAPMessageValidation policy contains a root element name
that does not adhere to XML rules for valid element naming. |
build |
Schemas
Jeder Richtlinientyp wird durch ein XML-Schema (.xsd) definiert. Zu Referenzzwecken sind Richtlinienschemas auf GitHub verfügbar.
Weitere Informationen
- XMLThreatProtection-Richtlinie
- "XML-to-JSON"-Richtlinie
- "JSON-to-XML"-Richtlinie
- JSON-Richtlinie zum Schutz vor Bedrohungen