אתם צופים במסמכי העזרה של Apigee Edge.
כניסה למסמכי העזרה של Apigee X. info

המדיניות SOAPMessageValidation מבצעת את הפעולות הבאות:
- אימות של כל הודעת XML מול סכימות ה-XSD שלה
- אימות הודעות SOAP בהתאם להגדרת WSDL
- בדיקה של תקינות ההגדרות של הודעות JSON ו-XML
השם של המדיניות הזו בממשק המשתמש הוא 'אימות הודעות SOAP', אבל המדיניות מאמתת יותר מאשר רק הודעות SOAP. בקטע הזה המדיניות נקראת 'מדיניות אימות הודעות'.
רכיב <MessageValidation>
הגדרת המדיניות של אימות ההודעות.
ערך ברירת המחדל | בכרטיסייה מדיניות ברירת מחדל שבהמשך |
חובה? | אופציונלי |
סוג | אובייקט מורכב |
רכיב הורה | לא רלוונטי |
רכיבי הצאצאים |
<DisplayName> <Element> <ResourceURL> <SOAPMessage> <Source> |
תחביר
רכיב <MessageValidation>
כולל את התחביר הבא:
<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>
מדיניות ברירת המחדל
בדוגמה הבאה מוצגות הגדרות ברירת המחדל כשמוסיפים מדיניות לאימות הודעות לתהליך בממשק המשתמש של 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>
לרכיב הזה יש את המאפיינים הבאים, המשותפים לכל כללי המדיניות:
מאפיין | ברירת מחדל | חובה? | תיאור |
---|---|---|---|
name |
לא רלוונטי | נדרש |
השם הפנימי של המדיניות. הערך של המאפיין אפשר להשתמש ברכיב |
continueOnError |
false | אופציונלי | צריך להגדיר את הערך 'False' כדי להחזיר שגיאה כשהמדיניות נכשלת. זו התנהגות צפויה ברוב סוגי המדיניות. הערך של הפרמטר הוא TRUE כדי שביצוע הפעולות יתבצע גם אחרי שמדיניות תיכשל. |
enabled |
true | אופציונלי | כדי לאכוף את המדיניות צריך להגדיר את הערך True. מגדירים את המדיניות כ-"false" כדי "להשבית" את המדיניות. המדיניות הזו לא תיאכף גם אם היא תצורף לתהליך. |
async |
false | הוצא משימוש | המאפיין הזה הוצא משימוש. |
דוגמאות
בדוגמאות הבאות מפורטות כמה דרכים שבהן אפשר להשתמש במדיניות של אימות ההודעות:
1: אימות XSD
אפשר להשתמש במדיניות האימות של הודעות כדי לאמת את עומס העבודה של בקשת הודעת ה-XML באמצעות סכימת XSD.
- יוצרים קובץ משאב חדש בפורמט XSD. לדוגמה, "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>
- מוסיפים את המדיניות של אימות הודעות SOAP לתהליך המקדים של נקודת הקצה של שרת ה-proxy:
- מציינים את המיקום של קובץ המשאב XSD באמצעות הרכיב
<ResourceURL>
. לדוגמה:... <ResourceURL>xsd://note-schema.xsd</ResourceURL> ...
- מסירים את הרכיבים
<SOAPMessage>
ו-<Element>
מהגדרת המדיניות.
הגדרת המדיניות אמורה להיראות כך:
<MessageValidation continueOnError="false" enabled="true" name="validateXMLRequest"> <DisplayName>My XML Validator</DisplayName> <Properties/> <Source>request</Source> <ResourceURL>xsd://note-schema.xsd</ResourceURL> </MessageValidation>
- מציינים את המיקום של קובץ המשאב XSD באמצעות הרכיב
- שולחים בקשת
POST
לשרת proxy של ה-API, עם ה-XML כמטען הייעודי של ההודעה, כמו בדוגמה הבאה: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>'
שימו לב שהכותרת
Content-type
מוגדרת כ-'application/xml'.אפשר גם ליצור קובץ נתונים של עומס העבודה ולהפנות אליו באמצעות פקודה שדומה לפקודה הבאה:
curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock --data '@../examples/note-payload.xml'
אמורה להתקבל תגובה מסוג HTTP 200
. בהתאם לנקודת הקצה היעד, יכול להיות שתקבלו פרטים נוספים על הבקשה. לדוגמה, אם משתמשים ב-http://httpbin.org/post
כנקודה הסופית של היעד ומציינים פלט -v
(מפורט), התגובה אמורה להיות דומה לדוגמה הבאה:
< 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" }
כדי לוודא שהאימות של XSD פועל, נסו להוסיף תג אחר לגוף הבקשה. לדוגמה:
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>'
אמורה להופיע שגיאת אימות.
2: אימות SOAP
אפשר להשתמש במדיניות האימות של הודעות כדי לאמת את עומס העבודה של בקשת הודעת ה-SOAP מול WSDL.
- יוצרים קובץ משאב חדש של WSDL. לדוגמה, "example-wsdl.wsdl":
- מוסיפים את המדיניות של אימות הודעות SOAP לתהליך המקדים של נקודת הקצה של שרת ה-proxy:
- מגדירים את המאפיין
version
של האלמנט<SOAPMessage>
לגרסה של פרוטוקול SOAP שרוצים לבצע לו אימות. לדוגמה, "1.1":... <SOAPMessage version="1.1"/> ...
- מגדירים את הערך של הרכיב
<Element>
לרכיב שרוצים לאמת:... <Element namespace="https://example.com/gateway">getID</Element> ...
<Element>
מציין את הצאצא הראשון שמתחת לאלמנט<Body>
בתוך המעטפה של בקשת ה-SOAP.מגדירים את המאפיין
namespace
למרחב השמות של הצאצא הזה. - מציינים את המיקום של קובץ המשאב WSDL באמצעות הרכיב
<ResourceURL>
. לדוגמה:... <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> ...
הגדרת המדיניות אמורה להיראות כך:
<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>
- מגדירים את המאפיין
- שולחים בקשת
POST
לשרת ה-proxy של ה-API, עם מעטפת ה-SOAP בתור המטען הייעודי של ההודעה, כמו בדוגמה הבאה: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>'
שימו לב שהכותרת
Content-type
מוגדרת כ-'application/xml'.אפשר גם ליצור קובץ נתונים של עומס העבודה ולהפנות אליו באמצעות פקודה שדומה לפקודה הבאה:
curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock --data '@../examples/soap-payload.xml'
אמורה להתקבל תגובה מסוג HTTP 200
. בהתאם לנקודת הקצה היעד, יכול להיות שתקבלו פרטים נוספים על הבקשה. לדוגמה, אם משתמשים ב-http://httpbin.org/post
כנקודת הקצה היעד, התגובה אמורה להיראות כך:
< 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 בפורמט תקין
אפשר להשתמש במדיניות האימות של הודעות כדי לוודא שהמטען של הודעה בפורמט JSON או XML בנוי בצורה תקינה (לא זהה לאימות). המדיניות הזו מבטיחה שהמבנה והתוכן עומדים בסטנדרטים המקובלים, כולל:
- יש רכיב בסיס אחד
- התוכן לא מכיל תווים לא חוקיים
- אובייקטים ותגים מוערמים בצורה נכונה
- התגים של ההתחלה והסיום תואמים
כדי לבדוק אם מטען הייעודי (payload) של ה-XML או ה-JSON תקין:
- מוסיפים את המדיניות של אימות הודעות SOAP לתהליך המקדים של נקודת הקצה של שרת ה-proxy.
- מסירים מההגדרה של המדיניות את הרכיבים
<ResourceURL>
,<SOAPMessage>
ו-<Element>
.הגדרת המדיניות אמורה להיראות כך:
<MessageValidation async="false" continueOnError="false" enabled="true" name="validateXMLRequest"> <DisplayName>My JSON Checker</DisplayName> <Properties/> <Source>request</Source> </MessageValidation>
- שולחים בקשת
POST
לשרת ה-proxy של ה-API, כמו בדוגמה הבאה: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." } }'
שימו לב שהכותרת
Content-type
מוגדרת כ-'application/json'.כדי לבדוק אם קובץ XML תקין, משתמשים ב-XML כמטען של ההודעה ומגדירים את
Content-type
לערך 'application/xml'.
אמורה להתקבל תגובה מסוג HTTP 200
. כששולחים עומס נתונים של הודעה שלא מכיל XML או JSON בפורמט תקין, אמורה להופיע הודעת השגיאה steps.messagevalidation.Failed
.
הפניה לרכיב הצאצא
בקטע הזה מתוארים רכיבי הצאצאים של <MessageValidation>
.
<DisplayName>
אפשר להשתמש במאפיין name
כדי לתייג את המדיניות בכלי העריכה של שרת ה-proxy בממשק המשתמש לניהול, בשם שונה שנשמע טבעי יותר.
הרכיב <DisplayName>
הוא משותף לכל כללי המדיניות.
ערך ברירת המחדל | לא רלוונטי |
חובה? | אופציונלי. אם משמיטים את <DisplayName> , המערכת משתמשת בערך של המאפיין name של המדיניות |
סוג | מחרוזת |
רכיב הורה | <PolicyElement> |
רכיבי הצאצאים | ללא |
רכיב <DisplayName>
כולל את התחביר הבא:
תחביר
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
דוגמה
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
לאלמנט <DisplayName>
אין מאפיינים או רכיבי צאצא.
<Element>
מציין את הרכיב בהודעה שרוצים לאמת. זהו הצאצא הראשון שמופיע מתחת לאלמנט <Body>
בתוך המעטפה של בקשת ה-SOAP.
ערך ברירת המחדל | sampleObject |
חובה? | אופציונלי |
סוג | מחרוזת |
רכיב הורה |
<MessageValidation>
|
רכיבי הצאצאים | ללא |
רכיב <Element>
כולל את התחביר הבא:
תחביר
... <Element namespace="element_namespace">element_to_validate</Element> ...
דוגמה 1
בדוגמה הבאה מוגדר רכיב יחיד שצריך לאמת:
... <Element namespace="https://example.com/gateway">getID</Element> ...
דוגמה 2
כדי לציין יותר מרכיב אחד לאימות, מוסיפים כמה רכיבי <Element>
:
... <Element namespace="https://example.com/gateway">getID</Element> <Element namespace="https://example.com/gateway">getDetails</Element> ...
לרכיב <Element>
יש את המאפיינים הבאים:
מאפיין | ברירת מחדל | חובה? | תיאור |
---|---|---|---|
namespace |
"http://sample.com" | אופציונלי | הגדרת מרחב השמות של הרכיב שרוצים לאמת. |
<ResourceURL>
מזהה את הסכימה של XSD או את ההגדרה של WSDL שישמשו לאימות הודעת המקור.
ערך ברירת המחדל | wsdl://display_name.wsdl |
חובה? | אופציונלי |
סוג | מחרוזת |
רכיב הורה |
<MessageValidation>
|
רכיבי הצאצאים | ללא |
רכיב <ResourceURL>
כולל את התחביר הבא:
תחביר
... <ResourceURL>[wsdl|xsd]://validation_WSDL_or_XSD</ResourceURL> ...
דוגמאות
בקובץ XML:
... <ResourceURL>xsd://note-schema.xsd</ResourceURL> ...
עבור WSDL:
... <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> ...
הערך של <ResourceURL>
חייב להפנות לקובץ משאבים בשרת ה-proxy של ה-API. אי אפשר להפנות למשאבים חיצוניים דרך HTTP או HTTPS.
אם לא מציינים ערך ל-<ResourceURL>
, ההודעה נבדקת אם היא בפורמט JSON או XML תקין, אם הכותרת Content-type
היא 'application/json' או 'application/xml', בהתאמה.
לאלמנט <ResourceURL>
אין רכיבי צאצא או מאפיינים.
שימוש ב-XSD לאימות
אם עומס העבודה של ה-XML שאתם מאמתים באמצעות מדיניות אימות ההודעות מפנה לסכימה אחרת, עליכם להוסיף את הקידומת xsd
למאפיין schemaLocation
בקובץ ה-XSD המצורף.
הסכימה לדוגמה הבאה מורכבת מכמה קובצי 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>
שימוש ב-WSDL לאימות
ב-WSDL צריך להגדיר סכימה אחת לפחות. אם לא מצוין בה הפניה לסכימה אחת לפחות, מדיניות אימות ההודעות נכשלת.
עומק הייבוא המקסימלי של סכימה הוא 10. אם תחרגו מהמספר הזה של ייבוא בתצוגת עץ, המדיניות של אימות ההודעות תיכשל.
<SOAPMessage>
הגדרה של גרסת ה-SOAP שבה מתבצע האימות של מדיניות אימות ההודעות.
ערך ברירת המחדל | לא רלוונטי |
חובה? | אופציונלי |
סוג | לא רלוונטי |
רכיב הורה |
<MessageValidation>
|
רכיבי הצאצאים | ללא |
רכיב <SOAPMessage>
כולל את התחביר הבא:
תחביר
... <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/> ...
דוגמה
... <SOAPMessage version="1.1"/> ...
לרכיב <SOAPMessage>
יש את המאפיינים הבאים:
מאפיין | ברירת מחדל | חובה? | תיאור |
---|---|---|---|
version |
ללא | אופציונלי | גרסת ה-SOAP שבה המדיניות הזו משתמשת כדי לאמת הודעות SOAP.
הערכים החוקיים כוללים:
|
מידע נוסף זמין במאמר מ-SOAP/1.1 ל-SOAP גרסה 1.2 ב-9 נקודות.
<Source>
מזהה את הודעת המקור שצריך לאמת. הערך של הרכיב הזה הוא שם ההודעה שרוצים לאמת.
אם לא תגדירו את <Source>
, ערך ברירת המחדל של המדיניות הזו יהיה 'message', שמתייחס להודעת הבקשה המלאה (בתהליך הבקשה) או להודעת התגובה המלאה (בתהליך התגובה), כולל עומס העבודה. אפשר גם להגדיר אותו באופן מפורש כ-'בקשה' או 'תשובה' כדי להפנות לבקשה או לתשובה.
ערך ברירת המחדל | בקשה |
חובה? | אופציונלי |
סוג | מחרוזת |
רכיב הורה |
<MessageValidation>
|
רכיבי הצאצאים | ללא |
רכיב <Source>
כולל את התחביר הבא:
תחביר
... <Source>message_to_validate</Source> ...
דוגמה
... <Source>request</Source> ...
בנוסף לאפשרויות 'message', 'request' ו-'response', אפשר להגדיר את הערך של <Source>
לשם של כל הודעה בתהליך. עם זאת, אם תעשו זאת, תצטרכו ליצור הודעה בהתאמה אישית עם השם הזה בתהליך לפני שהמדיניות הזו תתבצע. אחרת, תופיע הודעת שגיאה.
אם לא ניתן לפתור את הערך של <Source>
בתהליך העברת ההודעה, או שהוא מוגדר כסוג שאינו הודעה, מתרחש אחד מהאירועים הבאים:
- אם הערך הוא null: ב-Edge תוצג שגיאה מסוג
steps.messagevalidation.SourceMessageNotAvailable
. - אם מדובר בסוג שאינו הודעת: Edge יוצר שגיאה מסוג
steps.messagevalidation.NonMessageVariable
.
לאלמנט <Source>
אין מאפיינים או רכיבי צאצא.
קודי שגיאה
השגיאות שמוחזרות ממדיניות Edge עומדות בפורמט עקבי, כפי שמתואר בחומר העזר בנושא קודי שגיאה.
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge 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 Edge
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 |
סכימות
כל סוג מדיניות מוגדר על ידי סכימת XML (.xsd
). לידיעתכם, סכמות המדיניות זמינות ב-GitHub.