מדיניות SOAPMessageValidation

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

המדיניות 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 לא רלוונטי נדרש

השם הפנימי של המדיניות. הערך של המאפיין name יכול להכיל אותיות, מספרים, רווחים, מקפים, קווים תחתונים ונקודות. האורך המקסימלי של הערך הוא 255 תווים.

אפשר להשתמש ברכיב <DisplayName> כדי להוסיף תווית למדיניות בכלי לעריכת שרת proxy של ממשק המשתמש לניהול, ולהשתמש בשם אחר בשפה טבעית.

continueOnError false אופציונלי צריך להגדיר את הערך 'False' כדי להחזיר שגיאה כשהמדיניות נכשלת. זו התנהגות צפויה ברוב סוגי המדיניות. הערך של הפרמטר הוא TRUE כדי שביצוע הפעולות יתבצע גם אחרי שמדיניות תיכשל.
enabled true אופציונלי כדי לאכוף את המדיניות צריך להגדיר את הערך True. מגדירים את המדיניות כ-"false" כדי "להשבית" את המדיניות. המדיניות הזו לא תיאכף גם אם היא תצורף לתהליך.
async   false הוצא משימוש המאפיין הזה הוצא משימוש.

דוגמאות

בדוגמאות הבאות מוצגות כמה מהדרכים שבהן אפשר להשתמש במדיניות של אימות הודעות:

‫1: אימות XSD

אפשר להשתמש במדיניות לאימות הודעות כדי לאמת את מטען הייעוד של בקשת הודעת XML מול סכימת XSD.

  1. יוצרים קובץ משאבים חדש מסוג 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>
  2. מוסיפים את מדיניות האימות של הודעות SOAP ל-pre-flow של נקודת הקצה של ה-proxy:
    1. מציינים את המיקום של קובץ משאבי ה-XSD באמצעות הרכיב <ResourceURL>. לדוגמה:
      ...
        <ResourceURL>xsd://note-schema.xsd</ResourceURL>
      ...
    2. מסירים את הרכיבים <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>
  3. שולחים בקשת POST ל-proxy ל-API עם ה-XML כמטען ייעודי (payload) של ההודעה, כמו בדוגמה הבאה:
    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.

    אפשר גם ליצור קובץ נתונים עבור מטען הייעודי (payload) ולהפנות אליו באמצעות פקודה שדומה לפקודה הבאה:

    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

אפשר להשתמש במדיניות של אימות הודעות כדי לאמת את מטען הייעודי (payload) של בקשת הודעת SOAP מול WSDL.

  1. יוצרים קובץ משאבים חדש של WSDL. לדוגמה, example-wsdl.wsdl:
  2. מוסיפים את מדיניות האימות של הודעות SOAP ל-pre-flow של נקודת הקצה של ה-proxy:
    1. מגדירים את מאפיין version של רכיב <SOAPMessage> לגרסה של פרוטוקול SOAP שרוצים לאמת. לדוגמה, ‎"1.1":‎
      ...
        <SOAPMessage version="1.1"/>
      ...
    2. מגדירים את הערך של רכיב <Element> לרכיב שרוצים לאמת:
      ...
        <Element namespace="https://example.com/gateway">getID</Element>
      ...

      ‫<Element> מציין את הצאצא הראשון תחת הרכיב <Body> במעטפה של בקשת ה-SOAP.

      מגדירים את מאפיין namespace למרחב השמות של הנכס המשני.

    3. מציינים את המיקום של קובץ משאב ה-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>
  3. שולחים בקשת POST ל-proxy ל-API עם מעטפת ה-SOAP כמטען הייעודי (payload) של ההודעה, כמו בדוגמה הבאה:
    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.

    אפשר גם ליצור קובץ נתונים עבור מטען הייעודי (payload) ולהפנות אליו באמצעות פקודה שדומה לפקודה הבאה:

    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 תקין

אפשר להשתמש במדיניות 'אימות הודעות' כדי לוודא שמטען ייעודי (payload) של הודעת JSON או XML הוא בפורמט תקין (לא מדובר באימות). המדיניות מבטיחה שהמבנה והתוכן יעמדו בסטנדרטים המקובלים, כולל:

  • יש רכיב בסיס יחיד
  • התוכן לא כולל תווים לא חוקיים
  • האובייקטים והתגים מוטמעים בצורה נכונה
  • תגי הפתיחה והסגירה זהים

כדי לבדוק אם מטען ייעודי (payload) של XML או JSON מעוצב בצורה תקינה:

  1. מוסיפים את מדיניות האימות של הודעות SOAP ל-pre-flow של נקודת הקצה של ה-proxy.
  2. מסירים את הרכיבים <ResourceURL>, <SOAPMessage> ו-<Element> מהגדרת המדיניות.

    הגדרת המדיניות צריכה להיראות כך:

    <MessageValidation async="false" continueOnError="false"
        enabled="true" name="validateXMLRequest">
      <DisplayName>My JSON Checker</DisplayName>
      <Properties/>
      <Source>request</Source>
    </MessageValidation>
  3. שולחים בקשת 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 כמטען הייעודי (payload) של ההודעה ולהגדיר את Content-type לערך application/xml.

אמורה להתקבל תגובה HTTP 200. כששולחים מטען ייעודי (payload) של הודעה שלא מכיל XML או JSON בפורמט תקין, אמורה להתקבל שגיאה steps.messagevalidation.Failed.

הפניה לרכיב צאצא

בקטע הזה מתוארים רכיבי הצאצא של <MessageValidation>.

<DisplayName>

אפשר להשתמש במאפיין הזה בנוסף למאפיין name כדי לתת למדיניות שם אחר, שנשמע יותר טבעי, בתווית של עורך הפרוקסי בממשק המשתמש לניהול.

הרכיב <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 לקובץ ה-XSD הכלול במאפיין schemaLocation.

סכימת הדוגמה הבאה מורכבת מכמה קובצי 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.

הערכים החוקיים כוללים:

  • ‪"1.1"
  • ‪"1.2"
  • ‪"1.1/1.2"

מידע נוסף זמין במאמר From SOAP/1.1 to SOAP Version 1.2 in 9 points (מ-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 הן בפורמט עקבי, כפי שמתואר בהפניה לקודי שגיאה.

בקטע הזה מתוארים קודי התקלות והודעות השגיאה שמוחזרים, ומשתני השגיאה שמוגדרים על ידי Edge כשהמדיניות הזו גורמת לשגיאה. חשוב לדעת אם אתם מפתחים כללים לתיקון תקלות. מידע נוסף זמין במאמר מה צריך לדעת על שגיאות מדיניות ועל טיפול בפגמים.

שגיאות בזמן ריצה

השגיאות האלה יכולות להתרחש כשהמדיניות מופעלת.

קוד שגיאה סטטוס HTTP סיבה תיקון
steps.messagevalidation.SourceMessageNotAvailable 500

השגיאה הזו מתרחשת אם משתנה שצוין ברכיב <Source> של המדיניות הוא:

  • מחוץ להיקף (לא זמין בתהליך הספציפי שבו המדיניות מיושמת)
  • או
  • לא ניתן לפענח (אינו מוגדר)
steps.messagevalidation.NonMessageVariable 500

השגיאה הזו מתרחשת אם הרכיב <Source> במדיניות SOAPMessageAuthentication מוגדר למשתנה שאינו מסוג message.

משתנים של סוגי הודעות מייצגים את כל הבקשות והתגובות של HTTP. משתני הזרימה המובנים של Edge request, response ו-message הם מסוג הודעה. מידע נוסף על משתני הודעות זמין בחומר העזר בנושא משתנים.

steps.messagevalidation.Failed 500 השגיאה הזו מתרחשת אם המדיניות SOAPMessageValidation לא מאמתת את המטען הייעודי (payload) של הודעת הקלט מול סכימת XSD או ההגדרה של WSDL. זה יקרה גם אם בהודעת המטען הייעודי (payload) יש JSON או XML לא תקינים.

שגיאות בפריסה

השגיאות האלה יכולות להתרחש כשפורסים שרת proxy שכולל את המדיניות הזו.

שם השגיאה סיבה תיקון
InvalidResourceType הרכיב <ResourceURL> במדיניות SOAPMessageValidation מוגדר לסוג משאב שלא נתמך במדיניות.
ResourceCompileFailed סקריפט המשאב שמפנה לרכיב <ResourceURL> במדיניות SOAPMessageValidation מכיל שגיאה שמונעת את ההידור שלו.
RootElementNameUnspecified הרכיב <Element> במדיניות SOAPMessageValidation לא מכיל את השם של רכיב הבסיס.
InvalidRootElementName הרכיב <Element> במדיניות SOAPMessageValidation מכיל שם של רכיב בסיס שלא תואם לכללי ה-XML למתן שמות חוקיים לרכיבים.

סכימות

כל סוג מדיניות מוגדר על ידי סכימת XML ‏ (.xsd). סכימות מדיניות זמינות ב-GitHub.

נושאים קשורים