Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi
Apigee X. info
Dalam topik ini, Anda akan mempelajari cara membuat mashup menggunakan komposisi kebijakan. Komposisi kebijakan adalah pola proxy Apigee yang memungkinkan Anda menggabungkan hasil dari beberapa target backend menjadi satu respons menggunakan kebijakan.
Untuk ringkasan umum komposisi kebijakan, lihat "Pola komposisi kebijakan" dalam pola API Proxy Cookbook.
Mendownload dan mencoba kode contoh
Tentang contoh buku resep ini
Contoh cookbook ini mengilustrasikan pola proxy API yang disebut komposisi kebijakan. Pola ini memberikan salah satu cara (ada cara lain) untuk menggabungkan data dari beberapa sumber backend. Secara umum, topik ini menunjukkan cara menggabungkan dan mengaitkan kebijakan untuk menghasilkan hasil yang diinginkan. Untuk ringkasan umum pola ini dan pola terkait lainnya, lihat pola API Proxy Cookbook.
Contoh yang dibahas di sini menggunakan komposisi kebijakan untuk menggabungkan data dari dua API publik terpisah ini:
- Google Geocoding API: API ini mengonversi alamat (seperti "1600 Amphitheatre Parkway, Mountain View, CA") menjadi koordinat geografis (seperti lintang 37.423021 dan bujur -122.083739).
- Google Elevation API API ini menyediakan antarmuka sederhana untuk melakukan kueri lokasi di bumi untuk data elevasi. Dalam contoh ini, koordinat yang ditampilkan dari Geocoding API akan digunakan sebagai input ke dalam API ini.

Developer aplikasi akan memanggil proxy API ini dengan dua parameter kueri, kode pos dan ID negara:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Responsnya adalah objek JSON yang menyertakan lokasi yang di-geocode (lintang/bujur) untuk pusat area kode pos yang diberikan, yang dikombinasikan dengan elevasi di lokasi yang di-geocode tersebut.
{
"ElevationResponse":{
"status":"OK",
"result":{
"location":{
"lat":"39.7500713",
"lng":"-74.1357407"
},
"elevation":"0.5045232",
"resolution":"76.3516159"
}
}
}Sebelum memulai
Jika Anda ingin membaca ringkasan singkat tentang pola komposisi kebijakan, lihat "Pola komposisi kebijakan" di Pola Cookbook Proxy API.
Sebelum mempelajari contoh cookbook ini, Anda juga harus memahami konsep dasar berikut:
- Apa itu kebijakan dan cara melampirkannya ke proxy. Untuk pengantar yang baik tentang kebijakan, lihat Apa itu kebijakan?.
- Struktur alur proxy API, seperti yang dijelaskan dalam Mengonfigurasi alur. Alur memungkinkan Anda menentukan urutan kebijakan yang dieksekusi oleh proxy API. Dalam contoh ini, beberapa kebijakan dibuat dan ditambahkan ke alur proxy API.
- Cara project proxy API diatur di sistem file Anda, seperti yang dijelaskan dalam Referensi konfigurasi proxy API. Topik cookbook ini menunjukkan pengembangan lokal (berbasis sistem file) dibandingkan dengan pengembangan berbasis cloud tempat Anda dapat menggunakan UI pengelolaan untuk mengembangkan proxy API.
- Penggunaan validasi kunci API. Ini adalah bentuk keamanan berbasis aplikasi paling sederhana yang dapat Anda konfigurasi untuk API. Untuk mengetahui informasi selengkapnya, lihat Kunci API. Anda juga dapat mempelajari tutorial Mengamankan API dengan mewajibkan kunci API.
- Pengetahuan praktis tentang XML. Dalam contoh ini, kita akan membuat proxy API dan kebijakannya dengan file XML yang ada di sistem file.
Jika telah mendownload kode contoh, Anda dapat menemukan semua file yang dibahas dalam topik ini di folder contoh mashup-policy-cookbook. Bagian berikut membahas contoh kode secara mendetail.
Mengikuti alur
Sebelum beralih ke kebijakan, mari kita lihat alur utama contoh proxy API. XML alur, yang ditampilkan di bawah, memberi tahu kita banyak hal tentang proxy ini, kebijakan yang digunakannya, dan tempat kebijakan tersebut dipanggil.
Dalam download contoh, Anda dapat menemukan XML ini dalam file
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>
Berikut ringkasan elemen alurnya.
- <Request> - Elemen <Request> terdiri dari beberapa elemen <Step>. Setiap langkah memanggil salah satu kebijakan yang akan kita buat di bagian selanjutnya dalam topik ini. Kebijakan ini berkaitan dengan pembuatan pesan permintaan, pengirimannya, dan parsing respons. Di akhir topik ini, Anda akan memahami peran setiap kebijakan ini.
- <Response> - Elemen <Response> juga mencakup <Steps>. Langkah-langkah ini juga memanggil kebijakan yang bertanggung jawab untuk memproses respons akhir dari endpoint target (Google Elevation API).
- <HttpProxyConnection> - Elemen ini menentukan detail tentang cara aplikasi akan terhubung ke proxy API ini, termasuk <BasePath>, yang menentukan cara API ini akan dipanggil.
- <RouteRule> - Elemen ini menentukan apa yang terjadi segera setelah pesan permintaan masuk diproses. Dalam hal ini, TargetEndpoint dipanggil. Kita akan membahas langkah penting ini lebih lanjut di bagian berikutnya.
Membuat kebijakan
Bagian berikut membahas setiap kebijakan yang membentuk contoh komposisi kebijakan ini.
Membuat kebijakan AssignMessage pertama
Kebijakan AssignMessage pertama, yang tercantum di bawah, membuat pesan permintaan yang akan dikirim ke layanan Google Geocoding.

Mari kita mulai dengan kode kebijakan, lalu kita akan menjelaskan elemen-elemennya secara lebih mendetail. Dalam
download contoh, Anda dapat menemukan XML ini dalam file
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>
Berikut deskripsi singkat elemen dalam kebijakan ini. Anda dapat membaca lebih lanjut kebijakan ini di kebijakan Pesan Penetapan.
- <AssignMessage name> - Memberi nama kebijakan ini. Nama ini digunakan saat kebijakan dirujuk dalam alur.
- <AssignTo> - Membuat variabel bernama GeocodingRequest. Variabel ini mengenkapsulasi objek permintaan yang akan dikirim ke backend oleh kebijakan ServiceCallout.
- <QueryParams> - Menetapkan parameter kueri yang diperlukan oleh
panggilan API backend. Dalam hal ini, Geocoding API perlu mengetahui lokasi, yang dinyatakan dengan kode pos dan ID negara. Pengguna aplikasi memberikan informasi ini, dan
kami hanya mengekstraknya di sini. Parameter
sensordiperlukan oleh API, dan berupa benar atau salah, dan kita hanya meng-hardcode-nya ke salah di sini. - <Verb> - Dalam hal ini, kita membuat permintaan GET sederhana ke API.
- <AssignVariable> - Variabel ini menyimpan nilai yang diteruskan ke API. Dalam contoh ini, variabel akan diakses nanti dalam respons yang ditampilkan ke klien.
Mengirim permintaan dengan ServiceCallout
Langkah berikutnya dalam urutan komposisi kebijakan adalah membuat kebijakan ServiceCallout. Kebijakan ServiceCallout, yang tercantum di bawah, mengirimkan objek permintaan yang kita buat di kebijakan AssignMessage sebelumnya ke layanan Google Geocoding, dan menyimpan hasilnya dalam variabel yang disebut GeocodingResponse.

Seperti sebelumnya, mari kita lihat kodenya terlebih dahulu. Penjelasan mendetail akan diberikan di bawah. Anda dapat membaca
kebijakan ini lebih lanjut di kebijakan
Info Layanan. Dalam download contoh, Anda dapat menemukan XML ini dalam file
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>
Berikut deskripsi singkat elemen kebijakan ini.
- <ServiceCallout> - Seperti kebijakan sebelumnya, kebijakan ini memiliki nama.
- <Request variable> - Ini adalah variabel yang dibuat di kebijakan AssignMessage. Objek ini merangkum permintaan yang dikirim ke API backend.
- <Response> - Elemen ini memberi nama variabel tempat respons disimpan. Seperti yang akan Anda lihat, variabel ini akan diakses nanti oleh kebijakan ExtractVariables.
- <HTTPTargetConnection> - Menentukan URL target backend API. Dalam hal ini, kita menentukan bahwa API menampilkan respons JSON.
Sekarang kita memiliki dua kebijakan, satu yang menentukan informasi permintaan yang diperlukan untuk menggunakan backend API (Google Geocoding API), dan yang kedua yang benar-benar mengirimkan permintaan ke backend API. Selanjutnya, kita akan menangani respons.
Mengurai respons dengan ExtractVariables
Kebijakan ExtractVariables menyediakan mekanisme sederhana untuk mengurai konten dari pesan respons yang diperoleh oleh kebijakan ServiceCallout. ExtractVariables dapat digunakan untuk mengurai JSON atau XML, atau dapat digunakan untuk mengekstrak konten dari jalur URI, header HTTP, parameter kueri, dan parameter formulir.

Berikut adalah daftar kebijakan ExtractVariables. Anda dapat membaca selengkapnya tentang kebijakan ini di
kebijakan Ekstrak Variabel. Dalam download contoh, Anda dapat menemukan XML ini dalam file
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>
Elemen utama kebijakan ExtractVariable adalah:
- <ExtractVariables name> - Sekali lagi, nama kebijakan digunakan untuk merujuk pada kebijakan saat digunakan dalam alur.
- <Source> - Menentukan variabel respons yang kita buat di kebijakan ServiceCallout. Ini adalah variabel dari kebijakan yang mengekstrak data.
- <VariablePrefix> - Awalan variabel menentukan namespace untuk variabel lain yang dibuat dalam kebijakan ini. Awalan dapat berupa nama apa pun, kecuali nama yang dicadangkan yang ditentukan oleh variabel standar Edge.
- <JSONPayload> - Elemen ini mengambil data respons yang menarik bagi kita dan menempatkannya ke dalam variabel bernama. Faktanya, Geocoding API menampilkan lebih banyak informasi daripada lintang dan bujur. Namun, ini adalah satu-satunya nilai yang kita butuhkan untuk contoh ini. Anda dapat melihat rendering lengkap JSON yang ditampilkan oleh Geocoding API di dokumentasi API. Nilai geometry.location.lat dan geometry.location.lng hanyalah dua dari banyak kolom dalam objek JSON yang ditampilkan.
Mungkin tidak terlihat jelas, tetapi penting untuk melihat bahwa ExtractVariables menghasilkan dua variabel yang namanya terdiri dari awalan variabel (geocoderesponse) dan nama variabel sebenarnya yang ditentukan dalam kebijakan. Variabel ini disimpan di proxy API dan akan tersedia untuk kebijakan lain dalam alur proxy, seperti yang akan Anda lihat. Variabelnya adalah:
- geocoderesponse.latitude
- geocoderesponse.longitude
Sebagian besar pekerjaan kini telah selesai. Kita telah membuat gabungan tiga kebijakan yang membentuk permintaan, memanggil backend API, dan mengurai data JSON yang ditampilkan. Pada langkah terakhir, kita akan memasukkan data dari bagian alur ini ke kebijakan AssignMessage lain, memanggil backend API kedua (Google Elevation API), dan menampilkan data gabungan kita ke developer aplikasi.
Buat permintaan kedua dengan AssignMessage
Kebijakan AssignMessage berikut menggunakan variabel yang ditampilkan dari backend pertama (Google Geocoding) yang kita simpan, dan memasukkannya ke dalam permintaan yang ditujukan untuk API kedua (Google Elevation). Seperti yang disebutkan sebelumnya, variabel ini adalah geocoderesponse.latitude dan geocoderesponse.longitude.
Dalam download contoh, Anda dapat menemukan XML ini dalam file
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>Jika Anda memeriksa Google Elevation API, Anda akan melihat bahwa API ini memerlukan dua parameter kueri.
Yang pertama disebut locations dan nilainya adalah lintang dan bujur
(nilai yang dipisahkan koma). Parameter lainnya adalah sensor, yang wajib diisi dan harus
berupa benar atau salah. Hal terpenting yang perlu diperhatikan pada tahap ini adalah bahwa pesan
permintaan yang kita buat di sini tidak memerlukan ServiceCallout. Kita tidak perlu memanggil API kedua dari ServiceCallout pada saat ini karena kita dapat memanggil API backend dari TargetEndpoint proxy. Jika Anda memikirkannya, kita memiliki semua data yang diperlukan untuk memanggil Google Elevation API. Pesan permintaan yang dibuat pada langkah ini tidak memerlukan ServiceCallout, karena permintaan yang dibuat untuk pipeline permintaan utama, sehingga hanya akan diteruskan oleh ProxyEndpoint ke TargetEndpoint, mengikuti RouteRule yang dikonfigurasi untuk proxy API ini.
TargetEndpoint mengelola koneksi dengan API jarak jauh. (Ingatlah bahwa URL untuk
Elevation API ditentukan di HTTPConnection untuk TargetEndpoint.) Dokumentasi Elevation API jika Anda ingin mengetahui lebih lanjut. QueryParams yang kita simpan sebelumnya,
country dan postalcode, tidak lagi diperlukan, jadi kita menghapusnya
di sini.
Jeda singkat: Kembali ke alur
Pada tahap ini, Anda mungkin bertanya-tanya mengapa kita tidak membuat kebijakan ServiceCallout lain. Setelah
semuanya, kita membuat pesan lain. Bagaimana pesan tersebut dikirim ke target, Google
Elevation API? Jawabannya ada di elemen <RouteRule> dalam alur. <RouteRule>
menentukan tindakan yang harus dilakukan terhadap pesan permintaan yang tersisa setelah bagian <Request> dari
alur dieksekusi. TargetEndpoint yang ditentukan oleh <RouteRule> ini memberi tahu proxy API untuk mengirimkan pesan ke http://maps.googleapis.com/maps/api/elevation/xml.
Jika Anda mendownload proxy API contoh, Anda dapat menemukan XML TargetProxy dalam file
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>
Sekarang, kita hanya perlu memproses respons dari Google Elevation API dan kita selesai.
Mengonversi respons dari XML ke JSON
Dalam contoh ini, respons dari Google Elevation API ditampilkan sebagai XML. Untuk "kredit tambahan", mari tambahkan satu lagi kebijakan ke komposit kita untuk mengubah respons dari XML menjadi JSON.
Contoh ini menggunakan kebijakan JavaScript bernama GenerateResponse, dengan file resource yang berisi kode JavaScript, untuk melakukan konversi. Di bawah ini adalah definisi kebijakan GenerateResponse:
<Javascript name="GenerateResponse" timeout="10000"> <ResourceURL>jsc://GenerateResponse.js</ResourceURL> </Javascript>
File resource GenerateResponse.js menyertakan JavaScript yang digunakan untuk melakukan
konversi. Anda dapat melihat kode tersebut di
file doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.
Apigee juga menyediakan kebijakan siap pakai, XMLToJSON, untuk mengonversi XML ke JSON. Anda dapat
mengedit ProxyEndpoint untuk menggunakan kebijakan xmltojson yang ditunjukkan di bawah
sebagai gantinya.
<XMLToJSON name="xmltojson"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Menguji contoh
Jika Anda belum melakukannya, coba download, deploy, dan jalankan contoh policy-mashup-cookbook, yang dapat Anda temukan di folder doc-samples di GitHub repositori contoh Apigee Edge. Cukup ikuti petunjuk dalam file README di folder policy-mashup-cookbook. Atau, ikuti petunjuk singkat di sini: Menggunakan proxy API contoh.
Singkatnya, Anda dapat memanggil API komposit sebagai berikut. Ganti {myorg} dengan nama organisasi Anda:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Respons mencakup lokasi yang di-geocoding untuk pusat kode pos yang diberikan oleh pengguna akhir aplikasi, yang dikombinasikan dengan ketinggian di lokasi yang di-geocoding tersebut. Data diambil dari dua API backend, digabungkan dengan kebijakan yang dilampirkan ke proxy API, dan ditampilkan ke klien dalam satu respons.
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
Ringkasan
Topik cookbook ini menjelaskan cara menggunakan pola komposisi kebijakan untuk membuat mashup data dari beberapa sumber backend. Komposisi kebijakan adalah pola umum yang digunakan dalam pengembangan proxy API untuk menambahkan fungsi kreatif ke API Anda.