שימוש ביצירה של מדיניות

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

בנושא הזה תלמדו איך ליצור mashup באמצעות כתיבת מדיניות. הרכב המדיניות הוא תבנית שרת proxy של Apigee שמאפשרת לשלב תוצאות מכמה קצה עורפי מטורגטים בתגובה אחת באמצעות כללי מדיניות.

סקירה כללית של הרכב המדיניות זמינה במאמר 'דפוס הרכב המדיניות' בספר המתכונים ל-API של שרת Proxy דפוסים.

כדאי להוריד את הקוד לדוגמה ולנסות אותו

מידע על הדוגמה הזו לספר המתכונים

בדוגמה הזו בספר המתכונים הזה מתוארת תבנית של שרת proxy ל-API שנקראת הרכבה של מדיניות. הדפוס הזה מספק דרך אחת (יש עוד דרכים) למזג נתונים מכמה מקורות בקצה העורפי. באופן כללי, הנושא הזה מדגים איך אפשר לשלב כללי מדיניות ולשרשר אותם יחד כדי תפיק תוצאה רצויה. לסקירה כללית של הדפוס הזה ושל דפוסים קשורים אחרים: המדריך ל-API של שרת Proxy דפוסים.

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

  • הקידוד הגיאוגרפי של Google API: ה-API הזה ממיר כתובות (לדוגמה "1600 Amphitheatre Parkway, Mountain View, CA") לקואורדינטות גיאוגרפיות (כמו קו הרוחב 37.423021 וקו האורך 122.083739).
  • הגובה של Google API ה-API הזה מספק ממשק פשוט לשליחת שאילתות לגבי מיקומים בכדור הארץ לצורך קביעת גובה. . בדוגמה הזו, הקואורדינטות שהוחזרו מ-Geocoding API ישמשו כקלט ל-API הזה.

מפתחי אפליקציות יקראו לשרת ה-proxy הזה ל-API עם שני פרמטרים של שאילתה: מיקוד ומדינה מזהה:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

התגובה היא אובייקט JSON שכולל את המיקום המקודד (קו רוחב/קו אורך) של המרכז של אזור המיקוד שסופק עם הגובה של אותו אזור מיקוד גיאוגרפי המיקום.

{  
   "ElevationResponse":{  
      "status":"OK",
      "result":{  
         "location":{  
            "lat":"39.7500713",
            "lng":"-74.1357407"
         },
         "elevation":"0.5045232",
         "resolution":"76.3516159"
      }
   }
}

לפני שמתחילים

אם אתם רוצים לקרוא סקירה כללית קצרה של דפוס ההרכב של המדיניות, אפשר לעיין בקטע 'המדיניות קומפוזיציה" בספר המתכונים ל-API של שרת Proxy דפוסים.

לפני שתעיינו בדוגמה הזו מספר המתכונים הזה, חשוב שתכירו גם את של המושגים:

  • מהי מדיניות ואיך לצרף אותה לשרתי proxy. להיכרות טובה עם המדיניות, ראו מהו ?
  • המבנה של תהליך proxy ל-API, כמו שמוסבר במאמר הגדרת תהליכי עבודה. דפי זרימה מאפשרים לך לציין את הרצף שבו מדיניות מופעלת על ידי שרת proxy ל-API. במשפט הזה, כמה כללי המדיניות נוצרים ונוספים לזרימת ה-proxy של ה-API.
  • איך פרויקט proxy ל-API מאורגן במערכת הקבצים שלכם, כמו שמוסבר ב הסבר על הגדרות של שרת proxy ל-API. הנושא מתוך ספר המתכונים הזה מדגים התפתחות מקומית (קובץ מבוססת-מערכת), בניגוד לפיתוח מבוסס-ענן שבו ניתן להשתמש בממשק המשתמש של הניהול כדי לפתח את ה-proxy ל-API.
  • שימוש באימות של מפתח API. זו הגרסה הפשוטה ביותר של אבטחה מבוססת-אפליקציות שאפשר להשתמש בה להגדיר ממשק API. מידע נוסף זמין בכתובת API . אפשר גם לעיין ב API באמצעות דרישה למפתחות API.
  • ידע בעבודה עם XML. בדוגמה זו, אנחנו בונים את ה-Proxy ל-API ואת את המדיניות באמצעות קובצי XML שנמצאים במערכת הקבצים.

אם הורדת את הקוד לדוגמה, תוכל לאתר את כל הקבצים שמוזכרים כאן בנושא בתיקייה mashup-policy-cookbook. הקטעים הבאים לדון בקוד לדוגמה בפירוט.

ללכת עד הסוף

לפני שנעבור אל המדיניות, נבחן את התהליך העיקרי של הדוגמה שרת proxy ל-API. קוד ה-XML של הזרימה, שמוצג בהמשך, מספר לנו הרבה על שרת ה-proxy הזה, על כללי המדיניות שהוא השימושים שלו, ואת המקומות שבהם נקראות כללי המדיניות האלה.

בהורדה לדוגמה ניתן לראות את קובץ ה-XML הבא בקובץ doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml

<ProxyEndpoint name="default">
  <Flows>
    <Flow name="default">
      <Request>
            <!-- Generate request message for the Google Geocoding API -->
            <Step><Name>GenerateGeocodingRequest</Name></Step>
            <!-- Call the Google Geocoding API -->
            <Step><Name>ExecuteGeocodingRequest</Name></Step>
            <!-- Parse the response and set variables -->
            <Step><Name>ParseGeocodingResponse</Name></Step>
            <!-- Generate request message for the Google Elevation API -->
            <Step><Name>AssignElevationParameters</Name></Step>
      </Request>
      <Response>
            <!-- Parse the response message from the Elevation API -->
            <Step><Name>ParseElevationResponse</Name></Step>
            <!-- Generate the final JSON-formatted response with JavaScript -->
            <Step><Name>GenerateResponse</Name></Step>
      </Response>
    </Flow>
  </Flows>

  <HTTPProxyConnection>
    <!-- Add a base path to the ProxyEndpoint for URI pattern matching-->
    <BasePath>/policy-mashup-cookbook</BasePath>
    <!-- Listen on both HTTP and HTTPS endpoints -->
    <VirtualHost>default</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <!-- Connect ProxyEndpoint to named TargetEndpoint under /targets -->
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

הנה סיכום של רכיבי התהליך.

  • &lt;Request&gt; - <Request> מורכב מכמה &lt;Step&gt; רכיבים. כל שלב קורא לאחד מכללי המדיניות שניצור על ידי השאר בנושא הזה. כללי המדיניות האלה עוסקים ביצירת הודעת בקשה, בשליחתה ניתוח התגובה. בסוף הנושא הזה, תבינו את התפקיד של כל אחד מהנושאים האלה .
  • &lt;Response&gt; - <Response> רכיב זה כולל גם <שלבים>. השלבים האלה גם נוגעים למדיניות שאחראית על עיבוד הנתונים תגובה מנקודת הקצה של היעד (Google Elevation API).
  • &lt;HttpProxyConnection&gt; – אלמנט זה מציין פרטים על האופן שבו אפליקציות יתחברו לשרת ה-proxy הזה של ה-API, כולל <BasePath>, שמציין איך המערכת תקרא ל-API הזה.
  • &lt;RouteRule&gt; – הרכיב הזה מציין מה קורה באופן מיידי לאחר עיבוד הודעות הבקשה הנכנסות. במקרה הזה, מתבצעת קריאה לנקודת הקצה (TargetEndpoint). נדון בהרחבה על שלב חשוב זה בהמשך בנושא זה.

יצירת כללי המדיניות

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

יצירת AssignMessage ראשון מדיניות

המדיניות הראשונה של AssignMessage שמופיע למטה, יוצר הודעת בקשה שתישלח לפונקציית הקואורדינטות של Google לאחר השיפור.

נתחיל עם קוד המדיניות, ולאחר מכן נסביר את הרכיבים שלו בפירוט. ב הקובץ של ההורדה לדוגמה נמצא בקובץ ה-XML doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml

<AssignMessage name="GenerateGeocodingRequest">
  <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
      <QueryParam name="region">{request.queryparam.country}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <!-- Set variables for use in the final response -->
  <AssignVariable>
    <Name>PostalCode</Name>
    <Ref>request.queryparam.postalcode</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

הנה תיאור קצר של הרכיבים במדיניות הזו. מידע נוסף זמין במאמר הזה מדיניות בקטע הקצאה מדיניות ההודעות.

  • <AssignMessage name> – מעניק שם למדיניות זו. השם הוא משמש כאשר יש הפניה למדיניות בתהליך.
  • &lt;AssignTo&gt; – יצירת משתנה בעל שם בשם GeocodingRequest. המשתנה הזה כולל את אובייקט הבקשה שיישלח לקצה העורפי על ידי המדיניות בנושא ServiceCallout
  • &lt;QueryParams&gt; - מגדיר את הפרמטרים של השאילתה שדרושים קריאה ל-API בקצה העורפי. במקרה הזה, Geocoding API צריך לדעת את המיקום, מבוטאת מיקוד ומזהה מדינה. משתמש האפליקציה מספק את המידע הזה, אנחנו פשוט מחלצים אותו כאן. הפרמטר sensor נדרש על ידי ה-API, והוא או true או false, וכאן פשוט מקלידים את המחרוזת false.
  • &lt;Verb&gt; - במקרה הזה, אנחנו שולחים בקשת GET פשוטה API.
  • &lt;AssignVariable&gt; – משתנים אלו מאחסנים את הערכים מועברים ל-API. בדוגמה הזו, תתבצע גישה למשתנים בהמשך התשובה שהוחזרו ללקוח.

שליחת הבקשה עם ServiceCallout

השלב הבא ברצף של כתיבת המדיניות הוא יצירת מדיניות ServiceCallout. המדיניות ServiceCallout, שמפורטת בהמשך, שולחת את אובייקט הבקשה שיצרנו במדיניות הקודמת של AssignMessage לשירות Google Geocoding, ושומר את התוצאה שנקרא GeocodingResponse.

כמו קודם, בואו נסתכל על הקוד קודם. הסבר מפורט מופיע בהמשך. אפשר לקרוא למידע נוסף על המדיניות הזו בקטע הסבר על השירות . בהורדה לדוגמה ניתן לראות את קובץ ה-XML הבא בקובץ doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml

<ServiceCallout name="ExecuteGeocodingRequest">
  <Request variable="GeocodingRequest"/>
  <Response>GeocodingResponse</Response>
  <HTTPTargetConnection>
    <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
  </HTTPTargetConnection>
</ServiceCallout>

הנה תיאור קצר של רכיבי המדיניות הזו.

  • &lt;ServiceCallout&gt; - כמו במדיניות הקודמת, במדיניות הזו יש שם.
  • <Request variable> - זהו המשתנה שנוצר ב- מדיניות AssignMessage. הוא כולל את שליחת הבקשה ל-API של הקצה העורפי.
  • &lt;Response&gt; - רכיב זה שם משתנה שבו התגובה נשמר. כמו שאפשר לראות, המשתנה הזה ייגש בשלב מאוחר יותר באמצעות משתנה החילוץ המדיניות בנושא
  • &lt;HTTPTargetConnection&gt; - מציין את כתובת אתר היעד של הקצה העורפי API. במקרה הזה, אנחנו מציינים שה-API מחזיר תגובת JSON.

עכשיו יש לנו שני כללי מדיניות, אחד שמציין את פרטי הבקשה שדרושים כדי להשתמש הקצה העורפי (Geocoding API של Google), והשני ששולח בפועל את הבקשה ממשק ה-API של הקצה העורפי. בשלב הבא נטפל בתגובה.

ניתוח התשובה באמצעות ExtractVariables

המדיניות tractVariables מספקת מנגנון פשוט לניתוח תוכן הודעת תגובה שהתקבלה באמצעות מדיניות ServiceCallout. ניתן להשתמש ב-DataVariables כדי לנתח בפורמט JSON או XML, או שאפשר להשתמש בו כדי לחלץ תוכן מנתיבי URI, מכותרות HTTP, משאילתות ופרמטרים של טופס.

בהמשך מופיעה רשימה של המדיניות extractVariables. מידע נוסף על המדיניות הזו זמין בכתובת חילוץ משתנים . בהורדה לדוגמה ניתן לראות את קובץ ה-XML הבא בקובץ doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml

<ExtractVariables name="ParseGeocodingResponse">
  <Source>GeocodingResponse</Source>
  <VariablePrefix>geocoderesponse</VariablePrefix>
  <JSONPayload>
    <Variable name="latitude">
       <JSONPath>$.results[0].geometry.location.lat</JSONPath>
    </Variable>
    <Variable name="longitude">
       <JSONPath>$.results[0].geometry.location.lng</JSONPath>
    </Variable>
  </JSONPayload>
</ExtractVariables>

הרכיבים העיקריים במדיניות CSVVariable הם:

  • <חילוץVariables name> - שוב, שם המדיניות משמש כדי להתייחס למדיניות כאשר משתמשים בה בתהליך.
  • &lt;Source&gt; - מציין את משתנה התגובה שיצרנו בו מדיניות ServiceCallout. זהו המשתנה שממנו המדיניות הזו שולפת נתונים.
  • &lt;VariablePrefix&gt; - קידומת המשתנה מציינת מרחב שמות עבור משתנים אחרים שנוצרו במדיניות הזו. הקידומת יכולה להיות כל שם, חוץ מהטקסט השמור שמות שמוגדרים על ידי Edge משתנים מוגדרים מראש.
  • &lt;JSONPayload&gt; - רכיב זה מאחזר את נתוני התגובה שמעניין אותנו ושמה אותו במשתנים בעלי שם. למעשה, Geocoding API מחזיר יותר מאשר קו רוחב וקו אורך. עם זאת, אלה הערכים היחידים שאנחנו צריכים בדוגמה הזו. אפשר לראות רינדור מלא של ה-JSON שמוחזר על ידי Geocoding API בממשקי API תיעוד. הערכים של geometry.location.lat ו-geometry.location.lng הם פשוט שניים מתוך השדות הרבים באובייקט JSON המוחזר.

זה אולי לא ברור מאליו, אבל חשוב לראות ש-CSV Variables מייצר משתנים שהשמות שלהם מכילים את תחילית המשתנה (georesponse) ואת שמות המשתנים שמצוינים במדיניות. המשתנים האלה מאוחסנים שרת ה-proxy ל-API, יהיה זמין לכללי מדיניות אחרים במסגרת תהליך ה-proxy, לראות. המשתנים הם:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

רוב העבודה כבר הושלמה. יצרנו שילוב של שלושה כללי מדיניות שיוצרים מבקשים, מפעילים API לקצה עורפי ומנתחים את נתוני ה-JSON שהוחזרו. בשלבים האחרונים, נתונים מהחלק הזה של התהליך למדיניות AssignMessage אחרת, מפעילים את הקצה העורפי API (Google level API), ומחזירים את הנתונים המעובדים שלנו למפתח האפליקציה.

יצירת ההגדרה השנייה בקשה באמצעות AssignMessage

במדיניות הבאה של AssignMessage משתמשים במשתנים שהוחזרו מהקצה העורפי הראשון (Google קידוד גיאוגרפי) שאחסנו, ומחבר אותם לבקשה שמיועדת ל-API השני (Google גובה). כפי שציינו קודם, המשתנים האלה הם Georesponse.latitude ו- geocoderesponse.longitude.

בהורדה לדוגמה ניתן לראות את קובץ ה-XML הבא בקובץ doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml

<AssignMessage name="AssignElevationParameters">
<Remove>
    <QueryParams>
      <QueryParam name="country"/>
      <QueryParam name="postalcode"/>
    </QueryParams>
  </Remove>
  <Set>
    <QueryParams>
      <QueryParam name="locations">{geocoderesponse.latitude},{geocoderesponse.longitude}</QueryParam>
      <QueryParam name="sensor">false</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

אם תבדקו את Google Heightion API, תראו שהוא מקבל שני פרמטרים של שאילתה. הראשון נקרא locations והערך שלו הוא קו הרוחב וקו האורך (ערכים המופרדים בפסיקים). הפרמטר השני הוא sensor, והוא חובה יהיה נכון או לא נכון. הדבר שהכי חשוב לציין בשלב הזה הוא שהבקשה שאנחנו יוצרים כאן לא מחייבת ServiceCallout. אנחנו לא צריכים לקרוא לשנייה ל-API מ-ServiceCallout עליו בשלב הזה כי אנחנו יכולים לקרוא לממשק ה-API של הקצה העורפי נקודת קצה ביעד. אם חושבים על זה, יש לנו את כל הנתונים שדרושים לנו כדי לקרוא ל-Google Heights API להודעת הבקשה שנוצרה בשלב הזה לא נדרשת ServiceCallout, שנוצרה עבור צינור עיבוד הבקשות הראשי, ולכן פשוט תועבר על ידי ProxyEndpoint ל-TargetEndpoint, לאחר ה-RouteRule שהוגדר עבור שרת ה-proxy ל-API הזה. נקודת הקצה (TargetEndpoint) מנהלת את החיבור עם ה-API המרוחק. (חשוב לזכור שכתובת ה-URL של גובה ה-API מוגדר ב-HTTPConnection של TargetEndpoint. ממשק API של גובה אם תרצו לקבל מידע נוסף. ה-QueryParams שאחסנו קודם, אין יותר צורך ב-country וב-postalcode ולכן אנחנו מסירים אותם כאן.

השהיה קצרה: חזרה לזרימה

בשלב הזה, יכול להיות שתהיתם למה אנחנו לא יוצרים מדיניות נוספת של ServiceCallout. אחרי יצרנו הודעה נוספת. איך ההודעה נשלחת ליעד, liftion API? התשובה נמצאת ב-<RouteRule> של הזרימה. &lt;RouteRule&gt; מציין מה לעשות עם הודעות הבקשה שנותרו לאחר <Request> חלק מ- שהזרימה בוצעה. נקודת הקצה (TargetEndpoint) שצוינה על ידי <RouteRule> אומרת ל שרת proxy ל-API להעברת ההודעה אל http://maps.googleapis.com/maps/api/elevation/xml.

אם הורדתם את ה-Proxy ל-API לדוגמה, תוכלו למצוא בקובץ את ה-XML של TargetProxy doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml

<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <!-- This is where we define the target. For this sample we just use a simple URL. -->
    <URL>http://maps.googleapis.com/maps/api/elevation/xml</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

עכשיו צריך רק לעבד את התגובה מ-Google Elevation API בוצע.

ממירים את התגובה מ-XML ל- JSON

בדוגמה הזו, התשובה מ-Google Elevation API מוחזרת כ-XML. עבור 'extra' אשראי," נוסיף עוד מדיניות אחת לרכיב המורכב שלנו כדי להפוך את התגובה מ-XML JSON.

בדוגמה הזו נעשה שימוש במדיניות JavaScript שנקראת GenerateResponse, עם קובץ משאבים שמכיל את קוד ה-JavaScript, כדי לבצע את ההמרה. למטה מוצגת הגדרת המדיניות GenerateResponse

<Javascript name="GenerateResponse" timeout="10000">
  <ResourceURL>jsc://GenerateResponse.js</ResourceURL>
</Javascript>

קובץ המשאב GenerateResponse.js כולל את ה-JavaScript המשמש לביצוע להמרה. אפשר לראות את הקוד הזה קובץ doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.

Apigee מספקת גם מדיניות מוכנה מראש, XMLToJSON, כדי להמיר XML ל-JSON. אפשר צריך לערוך את ProxyEndpoint כך שיעשה שימוש במדיניות xmltojson שמוצגת למטה במקום זאת.

<XMLToJSON name="xmltojson">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

בדיקת הדוגמה

אם עדיין לא עשיתם זאת, נסו להוריד, לפרוס ולהפעיל את דוגמה של policy-mashup-cookbook, שנמצאת בתיקיית Docs-Sample שבמאגר הדוגמאות של Apigee Edge ב-GitHub. יישור פועלים לפי ההוראות בקובץ ה-README שבתיקייה policy-mashup-cookbook. או בצעו את ההוראות הקצרות הבאות: שרתי proxy ל-API לדוגמה.

לסיכום, אפשר לקרוא ל-API המורכב באופן הבא. צריך להחליף את {myorg} ב שם הארגון:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

התגובה כוללת את המיקום הקואורדינטות של מרכז המיקוד שסופק על ידי משתמש הקצה באפליקציה, בשילוב עם הגובה באותו מיקום גיאוגרפי. הנתונים היו אוחזרו משני ממשקי API בקצה העורפי, יחד עם כללי מדיניות שמצורפים לשרת ה-proxy ל-API, וגם שהוחזרו ללקוח בתגובה אחת.

{  
   "country":"us",
   "postalcode":"08008",
   "elevation":{  
      "meters":0.5045232,
      "feet":1.6552599030345978
   },
   "location":{  
      "latitude":39.75007129999999,
      "longitude":-74.1357407
   }
}

סיכום

נושא זה בספר המתכונים הזה מסביר כיצד להשתמש בתבנית הרכבה של המדיניות כדי ליצור mashup של נתונים מכמה מקורות קצה עורפי. הרכב המדיניות הוא דפוס נפוץ המשמש ב-API פיתוח proxy להוספת פונקציונליות של קריאייטיב ל-API.