درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
در این موضوع، یاد خواهید گرفت که چگونه بااستفاده از ترکیب خطمشی یک ریمیکس ایجاد کنید. ترکیب خطمشی یک الگوی پراکسی Apigee است که به شما امکان میدهد نتایج چندین هدف زیرینه را بااستفاده از خطمشیها در یک پاسخ واحد ترکیب کنید.
برای نمای کلی عمومی از ترکیب خطمشی، به «الگوی ترکیب خطمشی» در کتاب آشپزی پراکسی API الگوها مراجعه کنید.
بارگیری و امتحان کردن کد نمونه
درباره این نمونه کتاب آشپزی
این مثال کتاب آشپزی الگوی کارگزار میانای برنامهسازی کاربردی بهنام ترکیب خطمشی را نشان میدهد. این الگو روشی (روشهای دیگری هم وجود دارد) برای ترکیب کردن دادهها از چندین منبع زیرینه ارائه میدهد. بهطور کلیتر، این موضوع نشان میدهد که چگونه میتوان خطمشیها را ترکیب و بههم متصل کرد تا نتیجه مطلوب بهدست آید. برای نمای کلی این الگو و الگوهای مرتبط دیگر، الگوهای کتاب آشپزی پراکسی API را ببینید.
مثالی که در اینجا بحث میشود از ترکیب خطمشی برای ترکیب دادههای این دو میانای برنامهسازی کاربردی عمومی جداگانه استفاده میکند:
- میانای برنامهسازی کاربردی «زمینکدینگ Google»: این میانای برنامهسازی کاربردی نشانیها (مثل «1600 Amphitheatre Parkway, Mountain View, CA») را به مختصات جغرافیایی (مثل عرض جغرافیایی 37.423021 و طول جغرافیایی -122.083739) تبدیل میکند.
- میانای برنامهسازی کاربردی ارتفاع Google این میانای برنامهسازی کاربردی یک رابط ساده برای پُرسمان کردن مکانهای زمین برای دادههای ارتفاع ارائه میدهد. در این مثال، مختصات برگشتی از Geocoding API بهعنوان ورودی در این 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 ببینید.
پیشاز اینکه این مثال دستورالعمل را کاوش کنید، باید با این مفاهیم اساسی نیز آشنا باشید:
- خطمشیها چیستند و چگونه آنها را به پراکسیها پیوست کنید. برای آشنایی با خطمشیها، خطمشی چیست؟ را ببینید.
- ساختار جریان پراکسی API، همانگونه که در پیکربندی جریانها توضیح داده شده است. جریانها به شما امکان میدهند ترتیب اجرای خطمشیها توسط پراکسی میانای برنامهسازی کاربردی را مشخص کنید. در این مثال، چندین خطمشی ایجاد شده و به جریان پراکسی API اضافه میشود.
- نحوه سازماندهی پروژه پراکسی API در سیستم فایل شما، همانطور که در مرجع پیکربندی پراکسی API توضیح داده شده است. این موضوع کتاب آشپزی توسعه محلی (سیستم مبتنی بر فایل) را در مقابل توسعه مبتنی بر ابر نشان میدهد، جایی که میتوانید از رابط کاربری مدیریت برای توسعه پراکسی API استفاده کنید.
- استفاده از اعتبارسنجی کلید API. این سادهترین شکل امنیت مبتنی بر برنامه است که میتوانید برای یک API پیکربندی کنید. برای اطلاعات بیشتر، کلیدهای میانای برنامهسازی کاربردی را ببینید. همچنین میتوانید آموزش گامبهگام ایمنسازی میانای برنامهسازی کاربردی با الزام به استفاده از کلیدهای میانای برنامهسازی کاربردی را دنبال کنید.
- آشنایی با XML. در این مثال، پراکسی API و خطمشیهای آن را با فایلهای XML که در سیستم فایل قرار دارند میسازیم.
اگر کد نمونه را بارگیری کردهاید، میتوانید همه فایلهای مورد بحث در این موضوع را در پوشه نمونه mashup-policy-cookbook پیدا کنید. بخشهای زیر کد نمونه را بهطور مفصل توضیح میدهند.
حرکت با جریان
قبلاز پرداختن به خطمشیها، بیایید نگاهی به جریان اصلی پراکسی API نمونهمان بیندازیم. XML جریان که در زیر نشان داده شده است اطلاعات زیادی درباره این پراکسی، خطمشیهایی که استفاده میکند، و مکان فراخوانی این خطمشیها به ما میدهد.
در بارگیری نمونه، میتوانید این 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>
در اینجا خلاصهای از عناصر جریان ارائه شده است.
- <Request> - عنصر <Request> از چندین عنصر <Step> تشکیل شده است. هر مرحله یکی از خطمشیهایی را که در بقیه این موضوع ایجاد خواهیم کرد فرا میخواند. این خطمشیها مربوط به ایجاد پیام درخواست، ارسال آن، و تجزیه پاسخ است. در پایان این موضوع، نقش هریک از این خطمشیها را درک خواهید کرد.
- <Response> - عنصر <Response> همچنین شامل <Steps> میشود. این مراحل همچنین خطمشیهایی را فرا میخوانند که مسئول پردازش پاسخ نهایی از نقطه پایانی هدف (Google Elevation API) هستند.
- <HttpProxyConnection> - این عنصر جزئیاتی درباره نحوه اتصال برنامهها به این پراکسی API، ازجمله <BasePath>، که نحوه فراخوانی این API را مشخص میکند، ارائه میدهد.
- <RouteRule> - این عنصر مشخص میکند که بلافاصله پساز پردازش پیامهای درخواست ورودی چه اتفاقی میافتد. در این مورد، 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> - به این خطمشی نامی میدهد. وقتی خطمشی در جریانی ارجاع داده میشود، از این نام استفاده میشود.
- <AssignTo> - متغیر نامگذاریشدهای بهنام GeocodingRequest ایجاد میکند. این متغیر شیء درخواستی را که توسط خطمشی ServiceCallout به زیرینه ارسال خواهد شد دربرمیگیرد.
- <QueryParams> - پارامترهای پُرسمانی را که برای
فراخوانی API زیرینه لازم است تنظیم میکند. در این مورد، «میانای برنامهسازی کاربردی Geocoding» باید مکان را بداند، که
با کد پستی و شناسه کشور بیان میشود. کاربر برنامه این اطلاعات را ارائه میدهد و
ما صرفاً آن را در اینجا استخراج میکنیم. میانای برنامهسازی کاربردی به پارامتر
sensorنیاز دارد و این پارامتر یا درست است یا نادرست، و ما آن را در اینجا بهصورت نادرست کدبندی سخت میکنیم. - <Verb> - در این مورد، ما یک درخواست GET ساده به API ارسال میکنیم.
- <AssignVariable> - این متغیرها مقادیری را که به API ارسال میکنیم ذخیره میکنند. در این مثال، متغیرها بعداً در پاسخی که به مشتری برگردانده میشود دسترسی خواهند داشت.
ارسال درخواست با «خدمات پیامکی»
مرحله بعدی در توالی ترکیب خطمشی، ایجاد خطمشی ServiceCallout است. خطمشی ServiceCallout که در زیر فهرست شده است، شیء درخواستی را که در خطمشی AssignMessage قبلی ایجاد کردهایم به سرویس «زمینکدیابی Google» ارسال میکند و نتیجه را در متغیری به نام 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>
در اینجا شرح مختصری از عناصر این خطمشی ارائه شده است.
- <ServiceCallout> - مانند خطمشی قبلی، این خطمشی نیز نام دارد.
- <Request variable> - این متغیری است که در خطمشی «تخصیص پیام» ایجاد شده است. این کلاس درخواست رفتن به API زیرینه را کپسوله میکند.
- <Response> - این عنصر متغیری را نامگذاری میکند که پاسخ در آن ذخیره میشود. همانطور که خواهید دید، این متغیر بعداً توسط خطمشی ExtractVariables قابلدسترسی خواهد بود.
- <HTTPTargetConnection> - نشانی وب هدف میانای برنامهسازی کاربردی زیرینه را مشخص میکند. در این مورد، مشخص میکنیم که «میانای برنامهسازی کاربردی» پاسخ JSON برگرداند.
اکنون دو خطمشی داریم، یکی که اطلاعات درخواست موردنیاز برای استفاده از میانای برنامهسازی کاربردی زیرینه (میانای برنامهسازی کاربردی «نمای جغرافیایی Google») را مشخص میکند، و دیگری که درخواست را به میانای برنامهسازی کاربردی زیرینه ارسال میکند. سپس، ما پاسخ را مدیریت خواهیم کرد.
تجزیه کردن پاسخ با ExtractVariables
خطمشی ExtractVariables (استخراج متغیرها) سازوکار سادهای برای تجزیه محتوای پیام پاسخ دریافتی از خطمشی ServiceCallout (فراخوانی سرویس) ارائه میدهد. از ExtractVariables میتوان برای تجزیه کردن 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>
عناصر کلیدی خطمشی ExtractVariable عبارتاند از:
- <ExtractVariables name> - دوباره، نام خطمشی برای ارجاع به خطمشی هنگام استفاده از آن در جریان استفاده میشود.
- <Source> - متغیر پاسخی را که در خطمشی «تماس با سرویس» ایجاد کردهایم مشخص میکند. این متغیری است که این خطمشی از آن داده استخراج میکند.
- <VariablePrefix> - پیشوند متغیر فضای نامی را برای متغیرهای دیگری که در این خطمشی ایجاد شدهاند مشخص میکند. پیشوند میتواند هر نامی باشد، بهجز نامهای رزروشدهای که توسط متغیرهای ازپیشتعریفشده Edge تعریف شدهاند.
- <JSONPayload> - این عنصر دادههای پاسخی را که برای ما جالب است بازیابی میکند و آن را در متغیرهای نامگذاریشده قرار میدهد. درواقع، Geocoding API اطلاعات بسیار بیشتری نسبتبه طول و عرض جغرافیایی برمیگرداند. بااینحال، اینها تنها مقادیری هستند که برای این نمونه نیاز داریم. میتوانید پردازشی کامل از JSON برگشتی از Geocoding API را در مستندات API ببینید. مقادیر geometry.location.lat و geometry.location.lng صرفاً دو مورد از فیلدهای بسیار زیاد در شیء JSON برگرداندهشده هستند.
ممکن است واضح نباشد، اما مهم است که ببینید ExtractVariables دو متغیر تولید میکند که نام آنها از پیشوند متغیر (geocoderesponse) و نامهای متغیر واقعی که در خطمشی مشخص شدهاند تشکیل شده است. این متغیرها در کارگزار نیابتی API ذخیره میشوند و همانطور که خواهید دید، برای خطمشیهای دیگر در جریان کارگزار نیابتی دردسترس خواهند بود. متغیرها عبارتاند از:
- geocoderesponse.latitude
- geocoderesponse.longitude
اکثر کارها اکنون انجام شده است. ترکیبی از سه خطمشی ایجاد کردهایم که یک درخواست را تشکیل میدهند، میانای برنامهسازی کاربردی زیرینه را فرا میخوانند، و دادههای JSON برگشتی را تجزیه میکنند. در مراحل نهایی، دادههای این بخش از جریان را به خطمشی AssignMessage دیگری وارد میکنیم، میانای برنامهسازی کاربردی زیرینه دوم (میانای برنامهسازی کاربردی Google Elevation) را فرا میخوانیم، و دادههای ترکیبشده خود را به توسعهدهنده برنامه برمیگردانیم.
تولید درخواست دوم با AssignMessage
خطمشی AssignMessage زیر از متغیرهای برگشتی از اولین زیرینه (Google Geocoding) که ذخیره کردهایم استفاده میکند و آنها را در درخواستی که برای دومین API (Google Elevation) درنظر گرفته شده است قرار میدهد. همانطور که قبلاً اشاره شد، این متغیرها عبارتاند از geocoderesponse.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» را بررسی کنید، خواهید دید که دو پارامتر پُرسمان میگیرد.
اولی locations نام دارد و مقدار آن عرض و طول جغرافیایی است
(مقادیر با ویرگول از هم جدا میشوند). پارامتر دیگر sensor است که الزامی است و باید
درست یا نادرست باشد. مهمترین نکتهای که در این مرحله باید به آن توجه کنید این است که پیام درخواست
که در اینجا ایجاد میکنیم به ServiceCallout نیاز ندارد. در این مرحله نیازی نیست که
API دوم را از ServiceCallout فراخوانی کنیم زیرا میتوانیم API زیرینه را از
TargetEndpoint کارگزار فراخوانی کنیم. اگر به آن فکر کنید، ما همه دادههای موردنیاز برای فراخوانی «میانای برنامهسازی کاربردی ارتفاعات Google» را داریم
پیام درخواست تولیدشده در این مرحله به ServiceCallout نیاز ندارد، زیرا
درخواست برای خط لوله درخواست اصلی تولید شده است و بنابراین بهسادگی توسط
ProxyEndpoint به TargetEndpoint ارسال میشود و از RouteRule پیکربندیشده برای این میانای برنامهسازی کاربردی پیروی میکند.
TargetEndpoint اتصال با «میانای برنامهسازی کاربردی» از دور را مدیریت میکند. (بهیاد داشته باشید که نشانی وب
میانای برنامهسازی کاربردی ارتقا در HTTPConnection برای TargetEndpoint تعریف شده است. اگر میخواهید اطلاعات بیشتری کسب کنید،
مستندات Elevation API را ببینید. QueryParams که قبلاً ذخیره کردهایم،
country و postalcode، دیگر لازم نیستند، بنابراین آنها را
در اینجا برمیداریم.
مکث کوتاه: برگشتن به جریان
در این نقطه، ممکن است تعجب کنید که چرا خطمشی «دعوت به اقدام سرویس» دیگری ایجاد نمیکنیم. بههرحال، پیام دیگری ایجاد کردیم. چگونه آن پیام به هدف، یعنی
«میانای برنامهسازی کاربردی ارتفاع Google» ارسال میشود؟ پاسخ در عنصر <RouteRule> جریان است. <RouteRule>
مشخص میکند که با پیامهای درخواست باقیمانده پساز اجرای بخش <Request> از
جریان چه کاری انجام شود. TargetEndpoint مشخصشده توسط این <RouteRule> به
پراکسی API میگوید پیام را
به http://maps.googleapis.com/maps/api/elevation/xml تحویل دهد.
اگر نمونه پراکسی 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» بهصورت XML برگردانده میشود. برای «اعتبار اضافی»، یک خطمشی دیگر به ترکیب خود اضافه میکنیم تا پاسخ را از XML به JSON تبدیل کنیم.
این مثال از خطمشی JavaScript بهنام GenerateResponse، با فایل منبعی حاوی کد JavaScript، برای انجام تبدیل استفاده میکند. در زیر، تعریف خطمشی «تولید پاسخ» نشان داده شده است:
<Javascript name="GenerateResponse" timeout="10000"> <ResourceURL>jsc://GenerateResponse.js</ResourceURL> </Javascript>
فایل منبع GenerateResponse.js شامل «جاوا اسکریپت» استفادهشده برای انجام تبدیل است. میتوانید آن کد را در فایل 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 را بارگیری، پیادهسازی، و اجرا کنید. این نمونه را میتوانید در doc-samples folder در مخزن نمونههای Apigee Edge در GitHub پیدا کنید. کافی است دستورالعملهای فایل README در پوشه policy-mashup-cookbook را دنبال کنید. یا، دستورالعملهای مختصر اینجا را دنبال کنید: استفاده از پراکسیهای API نمونه.
بهطور خلاصه، میتوانید API ترکیبی را بهصورت زیر فراخوانی کنید. {myorg} را با نام سازمانتان جایگزین کنید:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
پاسخ شامل مکان زمینکدشده برای مرکز کد پستی ارائهشده توسط کاربر نهایی برنامه، همراه با ارتفاع در آن مکان زمینکدشده است. دادهها از دو میانای برنامهسازی کاربردی زیرینه بازیابی شد، با خطمشیهای پیوستشده به پراکسی میانای برنامهسازی کاربردی ترکیب شد، و در یک پاسخ واحد به کارخواه برگردانده شد.
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
خلاصه
این موضوع کتاب آشپزی توضیح داد که چگونه از الگوی ترکیب خطمشی برای ایجاد یک ترکیب از دادههای چندین منبع زیرینه استفاده کنید. ترکیب خطمشی الگوی رایجی است که در توسعه پراکسی API برای افزودن کارکردهای خلاقانه به API شما استفاده میشود.