Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin. bilgi
Bu konuda, politika bileşimi kullanarak nasıl mashup oluşturacağınız açıklanmaktadır. Politika oluşturma, politikaları kullanarak birden fazla arka uç hedefinden gelen sonuçları tek bir yanıtta birleştirmenize olanak tanıyan bir Apigee proxy kalıbıdır.
Politika oluşturma hakkında genel bir bakış için API Proxy Cookbook'taki "Politika oluşturma modeli" bölümüne bakın.
Örnek kodu indirip deneyin
Bu çözüm kitabı örneği hakkında
Bu çözüm kitabı örneğinde, politika oluşturma adı verilen bir API proxy'si kalıbı gösterilmektedir. Bu kalıp, birden fazla arka uç kaynağındaki verileri birleştirmenin bir yolunu (başka yollar da vardır) sunar. Daha genel olarak bu konu, politikaların istenen sonucu elde etmek için nasıl birleştirilebileceğini ve birbirine bağlanabileceğini gösterir. Bu kalıp ve diğer ilgili kalıplar hakkında genel bir bakış için API Proxy Cookbook'taki kalıplara bakın.
Burada ele alınan örnekte, şu iki ayrı herkese açık API'den gelen verileri birleştirmek için politika oluşturma kullanılır:
- Google Coğrafi Kodlama API'si: Bu API, adresleri ("1600 Amphitheatre Parkway, Mountain View, CA" gibi) coğrafi koordinatlara (enlem 37.423021 ve boylam -122.083739 gibi) dönüştürür.
- Google Elevation API: Bu API, yeryüzündeki konumları yükseklik verileri için sorgulamak üzere basit bir arayüz sağlar. Bu örnekte, Geocoding API'den döndürülen koordinatlar bu API'ye giriş olarak kullanılır.

Uygulama geliştiriciler, bu API proxy'sini iki sorgu parametresiyle (posta kodu ve ülke kimliği) çağırır:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Yanıt, sağlanan posta kodu alanının merkezinin coğrafi olarak kodlanmış konumunu (enlem/boylam) ve bu coğrafi olarak kodlanmış konumdaki yüksekliği içeren bir JSON nesnesidir.
{
"ElevationResponse":{
"status":"OK",
"result":{
"location":{
"lat":"39.7500713",
"lng":"-74.1357407"
},
"elevation":"0.5045232",
"resolution":"76.3516159"
}
}
}Başlamadan önce
Politika bileşimi kalıbıyla ilgili kısa bir genel bakış okumak isterseniz API Proxy Cookbook kalıpları bölümündeki "Politika bileşimi kalıbı" başlıklı makaleyi inceleyin.
Bu çözüm kitabı örneğini incelemeden önce aşağıdaki temel kavramlar hakkında da bilgi sahibi olmanız gerekir:
- Politikalar ve bunları proxy'lere nasıl ekleyeceğiniz. Politikalarla ilgili iyi bir giriş için Politika nedir? başlıklı makaleyi inceleyin.
- Akışları yapılandırma bölümünde açıklandığı gibi, API proxy akışının yapısı. Akışlar, politikaların API proxy'si tarafından yürütülme sırasını belirtmenize olanak tanır. Bu örnekte, API proxy'sinin akışına birkaç politika oluşturulup eklenir.
- API proxy'si yapılandırma referansı'nda açıklandığı gibi, API proxy'si projesinin dosya sisteminizde nasıl düzenlendiği. Bu yemek kitabı konusu, API proxy'sini geliştirmek için yönetim kullanıcı arayüzünü kullanabileceğiniz bulut tabanlı geliştirmenin aksine yerel geliştirmeyi (dosya sistemi tabanlı) gösterir.
- API anahtarı doğrulamasının kullanılması. Bu, bir API için yapılandırabileceğiniz en basit uygulama tabanlı güvenlik biçimidir. Daha fazla bilgi için API anahtarları başlıklı makaleyi inceleyin. API anahtarları gerektirerek API'nin güvenliğini sağlama başlıklı eğiticiden de yararlanabilirsiniz.
- XML hakkında bilgi sahibi olmanız gerekir. Bu örnekte, API proxy'sini ve politikalarını dosya sisteminde bulunan XML dosyalarıyla oluşturuyoruz.
Örnek kodu indirdiyseniz bu konuda bahsedilen tüm dosyaları mashup-policy-cookbook örnek klasöründe bulabilirsiniz. Aşağıdaki bölümlerde örnek kod ayrıntılı olarak ele alınmaktadır.
Her şeyi akışına bırakmak
Politikalara geçmeden önce örnek API proxy'mizin ana akışına göz atalım. Aşağıda gösterilen akış XML'si, bu proxy, kullandığı politikalar ve bu politikaların nerede çağrıldığı hakkında bize çok şey anlatıyor.
Örnek indirme işleminde bu XML'yi doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml dosyasında bulabilirsiniz.
<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>
Akışın öğelerinin özetini aşağıda bulabilirsiniz.
- <Request>: <Request> öğesi, birkaç <Step> öğesinden oluşur. Her adım, bu konunun geri kalanında oluşturacağımız politikalardan birini çağırır. Bu politikalar, istek mesajı oluşturma, gönderme ve yanıtı ayrıştırma ile ilgilidir. Bu konunun sonunda, bu politikaların her birinin rolünü anlamış olacaksınız.
- <Response>: <Response> öğesi <Steps> öğesini de içerir. Bu adımlar, hedef uç noktadan (Google Elevation API) gelen nihai yanıtın işlenmesinden sorumlu politikaları da çağırır.
- <HttpProxyConnection>: Bu öğe, uygulamaların bu API proxy'sine nasıl bağlanacağıyla ilgili ayrıntıları belirtir. Bu ayrıntılar arasında, bu API'nin nasıl çağrılacağını belirten <BasePath> de yer alır.
- <RouteRule>: Bu öğe, gelen istek mesajları işlendikten hemen sonra ne olacağını belirtir. Bu durumda TargetEndpoint çağrılır. Bu önemli adım hakkında daha fazla bilgiyi bu konunun ilerleyen bölümlerinde bulabilirsiniz.
Politikaları oluşturma
Aşağıdaki bölümlerde, bu politika bileşimi örneğini oluşturan politikaların her biri ele alınmaktadır.
İlk AssignMessage politikasını oluşturun. policy
Aşağıda listelenen ilk AssignMessage politikası, Google Coğrafi Kodlama hizmetine gönderilecek bir istek mesajı oluşturur.

Önce politika kodundan bahsedelim, ardından kodun unsurlarını daha ayrıntılı olarak açıklayalım. Örnek indirme işleminde bu XML'yi doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml dosyasında bulabilirsiniz.
<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>
Bu politikadaki öğelerin kısa bir açıklamasını aşağıda bulabilirsiniz. Bu politika hakkında daha fazla bilgiyi Assign Message Policy (Mesaj Atama Politikası) başlıklı makalede bulabilirsiniz.
- <AssignMessage name>: Bu politikaya ad verir. Ad, politikaya bir akışta referans verildiğinde kullanılır.
- <AssignTo>: GeocodingRequest adlı bir değişken oluşturur. Bu değişken, ServiceCallout politikası tarafından arka uca gönderilecek istek nesnesini kapsar.
- <QueryParams>: Arka uç API çağrısı için gereken sorgu parametrelerini ayarlar. Bu durumda, Geocoding API'sinin posta kodu ve ülke koduyla ifade edilen konumu bilmesi gerekir. Bu bilgiler uygulama kullanıcısı tarafından sağlanır ve biz yalnızca bu bilgileri burada ayıklarız.
sensorparametresi API tarafından gereklidir ve doğru ya da yanlış değerini alır. Burada bu parametreyi yanlış olarak kodluyoruz. - <Fiil>: Bu durumda, API'ye basit bir GET isteği gönderiyoruz.
- <AssignVariable>: Bu değişkenler, API'ye ilettiğimiz değerleri depolar. Bu örnekte, değişkenlere daha sonra istemciye döndürülen yanıtta erişilir.
İsteği ServiceCallout ile gönderme
Politika oluşturma sırasındaki bir sonraki adım, ServiceCallout politikası oluşturmaktır. Aşağıda listelenen ServiceCallout politikası, önceki AssignMessage politikasında oluşturduğumuz istek nesnesini Google Geocoding hizmetine gönderir ve sonucu GeocodingResponse adlı bir değişkene kaydeder.

Daha önce olduğu gibi, önce koda göz atalım. Ayrıntılı açıklama aşağıda verilmiştir. Bu politika hakkında daha fazla bilgiyi Hizmet açıklama metni politikası'nda bulabilirsiniz. Örnek indirme işleminde bu XML'yi doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml dosyasında bulabilirsiniz.
<ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Bu politikanın unsurlarının kısa bir açıklamasını aşağıda bulabilirsiniz.
- <ServiceCallout>: Önceki politikada olduğu gibi bu politikada da bir ad vardır.
- <Request variable>: Bu, AssignMessage politikasında oluşturulan değişkendir. Arka uç API'sine giden isteği kapsar.
- <Response>: Bu öğe, yanıtın depolandığı bir değişkeni adlandırır. Gördüğünüz gibi, bu değişkene daha sonra ExtractVariables politikası tarafından erişilecektir.
- <HTTPTargetConnection>: Arka uç API'sinin hedef URL'sini belirtir. Bu durumda, API'nin JSON yanıtı döndürmesini belirtiriz.
Artık iki politikamız var. Bunlardan biri arka uç API'sini (Google'ın Geocoding API'si) kullanmak için gereken istek bilgilerini belirtir. İkincisi ise isteği arka uç API'sine gönderir. Ardından, yanıtı ele alacağız.
Yanıtı ExtractVariables ile ayrıştırın.
ExtractVariables politikası, ServiceCallout politikası tarafından alınan yanıt mesajındaki içeriği ayrıştırmak için basit bir mekanizma sağlar. ExtractVariables, JSON veya XML'yi ayrıştırmak için ya da URI yollarından, HTTP üstbilgilerinden, sorgu parametrelerinden ve form parametrelerinden içerik ayıklamak için kullanılabilir.

ExtractVariables politikası listesini aşağıda bulabilirsiniz. Bu politika hakkında daha fazla bilgiyi Değişkenleri Çıkarma Politikası'nda bulabilirsiniz. Örnek indirme işleminde bu XML'yi doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml dosyasında bulabilirsiniz.
<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 politikasının temel öğeleri şunlardır:
- <ExtractVariables name>: Yine, politika adı bir akışta kullanıldığında politikaya referans vermek için kullanılır.
- <Source>: ServiceCallout politikasında oluşturduğumuz yanıt değişkenini belirtir. Bu politika, verileri bu değişkenden çıkarır.
- <VariablePrefix>: Değişken ön eki, bu politikada oluşturulan diğer değişkenler için bir ad alanı belirtir. Önek, Edge'in önceden tanımlanmış değişkenleri tarafından tanımlanan ayrılmış adlar hariç herhangi bir ad olabilir.
- <JSONPayload>: Bu öğe, ilgilendiğimiz yanıt verilerini alır ve bunları adlandırılmış değişkenlere yerleştirir. Aslında, Geocoding API enlem ve boylamdan çok daha fazla bilgi döndürür. Ancak bu örnek için ihtiyacımız olan tek değerler bunlardır. Geocoding API tarafından döndürülen JSON'ın tam bir oluşturulmuş halini API'nin dokümanlarında görebilirsiniz. geometry.location.lat ve geometry.location.lng değerleri, döndürülen JSON nesnesindeki birçok alandan yalnızca ikisidir.
Bu durum açıkça görülmeyebilir ancak ExtractVariables'ın, adları değişken önekinden (geocoderesponse) ve politikada belirtilen gerçek değişken adlarından oluşan iki değişken oluşturduğunu görmek önemlidir. Bu değişkenler API proxy'sinde depolanır ve proxy akışındaki diğer politikalarda kullanılabilir. Değişkenler şunlardır:
- geocoderesponse.latitude
- geocoderesponse.longitude
İşin büyük kısmı tamamlandı. İstek oluşturan, arka uç API'sini çağıran ve döndürülen JSON verilerini ayrıştıran üç politikadan oluşan bir bileşik oluşturduk. Son adımlarda, akışın bu bölümündeki verileri başka bir AssignMessage politikasına aktaracak, ikinci arka uç API'sini (Google Elevation API) çağıracak ve birleştirilmiş verilerimizi uygulama geliştiriciye döndüreceğiz.
AssignMessage ile ikinci isteği oluşturun
Aşağıdaki AssignMessage politikası, depoladığımız ilk arka uçtan (Google Geocoding) döndürülen değişkenleri kullanır ve bunları ikinci API'ye (Google Elevation) yönelik bir isteğe yerleştirir. Daha önce de belirtildiği gibi bu değişkenler geocoderesponse.latitude ve geocoderesponse.longitude'dur.
Örnek indirme işleminde bu XML'yi doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml dosyasında bulabilirsiniz.
<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 Elevation API'yi incelerseniz iki sorgu parametresi aldığını görürsünüz.
İlk parametre locations olarak adlandırılır ve değeri enlem ve boylamdır (virgülle ayrılmış değerler). Diğer parametre olan sensor gereklidir ve doğru ya da yanlış olmalıdır. Bu noktada dikkat edilmesi gereken en önemli nokta, burada oluşturduğumuz istek mesajının ServiceCallout gerektirmediğidir. Bu noktada, ikinci API'yi bir ServiceCallout'tan çağırmamız gerekmez. Bunun nedeni, arka uç API'yi proxy'nin TargetEndpoint'inden çağırabilmemizdir. Düşündüğünüzde, Google Elevations API'yi çağırmak için gereken tüm verilere sahibiz. Bu adımda oluşturulan istek mesajı, ana istek ardışık düzeni için oluşturulan istek olduğundan ServiceCallout gerektirmez. Bu nedenle, bu API proxy'si için yapılandırılan RouteRule'u izleyerek ProxyEndpoint tarafından TargetEndpoint'e yönlendirilir.
TargetEndpoint, uzak API ile bağlantıyı yönetir. (Yükseltme API'sinin URL'sinin TargetEndpoint için HTTPConnection'da tanımlandığını hatırlayın. Daha fazla bilgi edinmek isterseniz Elevation API belgelerine
göz atabilirsiniz. Daha önce depoladığımız QueryParams'ler, country ve postalcode artık gerekli olmadığından bunları buradan kaldırıyoruz.
Kısa duraklama: Akışa geri dönme
Bu noktada, neden başka bir ServiceCallout politikası oluşturmadığımızı merak edebilirsiniz. Sonuçta başka bir mesaj oluşturduk. Bu mesaj, hedef olan Google Elevation API'ye nasıl gönderilir? Yanıt, akışın <RouteRule> öğesinde yer alır. <RouteRule>
Akışın <Request> bölümü yürütüldükten sonra kalan istek mesajlarıyla ne yapılacağını belirtir. Bu <RouteRule> tarafından belirtilen TargetEndpoint, API proxy'sine mesajı http://maps.googleapis.com/maps/api/elevation/xml adresine iletmesini söyler.
Örnek API proxy'sini indirdiyseniz TargetProxy XML'sini doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml dosyasında bulabilirsiniz.
<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>
Şimdi Google Elevation API'den gelen yanıtı işlememiz gerekiyor. İşlem tamamlandığında işimiz bitecek.
Yanıtı XML'den JSON'a dönüştürme
Bu örnekte, Google Elevation API'den gelen yanıt XML olarak döndürülür. "Ekstra kredi" için yanıtı XML'den JSON'a dönüştürmek üzere bileşimize bir politika daha ekleyelim.
Bu örnekte, dönüştürme işlemini gerçekleştirmek için GenerateResponse adlı JavaScript politikası ve JavaScript kodunu içeren bir kaynak dosyası kullanılmaktadır. Aşağıda GenerateResponse politika tanımı gösterilmektedir:
<Javascript name="GenerateResponse" timeout="10000"> <ResourceURL>jsc://GenerateResponse.js</ResourceURL> </Javascript>
GenerateResponse.js kaynak dosyası, dönüştürme işlemini gerçekleştirmek için kullanılan JavaScript'i içerir. Bu kodu doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js dosyasında görebilirsiniz.
Apigee, XML'yi JSON'a dönüştürmek için kullanıma hazır bir politika (XMLToJSON) da sunar. Bunun yerine aşağıdaki xmltojson politikasını kullanmak için ProxyEndpoint'i düzenleyebilirsiniz.
<XMLToJSON name="xmltojson"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Örneği test etme
Henüz yapmadıysanız Apigee Edge örnekleri deposu GitHub'daki doc-samples klasöründe bulabileceğiniz policy-mashup-cookbook örneğini indirip dağıtmayı ve çalıştırmayı deneyin. policy-mashup-cookbook klasöründeki README dosyasındaki talimatları uygulamanız yeterlidir. Alternatif olarak, Örnek API proxy'lerini kullanma başlıklı kısa talimatları uygulayın.
Özetlemek gerekirse, birleşik API'yi aşağıdaki gibi çağırabilirsiniz. {myorg} yerine kuruluşunuzun adını girin:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Yanıtta, uygulama son kullanıcısı tarafından sağlanan posta kodunun merkezinin coğrafi olarak kodlanmış konumu ve bu coğrafi olarak kodlanmış konumdaki yükseklik bilgisi yer alır. Veriler iki arka uç API'sinden alınmış, API proxy'sine eklenen politikalarla birleştirilmiş ve tek bir yanıtla istemciye döndürülmüştür.
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
Özet
Bu çözüm kitabı konusundaki bilgilerde, birden fazla arka uç kaynağındaki verilerden melez uygulama oluşturmak için politika oluşturma kalıbının nasıl kullanılacağı açıklanmıştır. Politika oluşturma, API'nize yaratıcı işlevler eklemek için API proxy geliştirme sürecinde kullanılan yaygın bir yöntemdir.