Menggunakan komposisi kebijakan

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 mengenai komposisi kebijakan, lihat "Pola komposisi kebijakan" dalam Pola Cookbook Proxy API.

Download dan coba kode contoh

Tentang contoh buku resep ini

Contoh Cookbook ini mengilustrasikan pola proxy API yang disebut komposisi kebijakan. Pola ini menyediakan satu cara (ada yang lainnya) untuk menggabungkan data dari beberapa sumber backend. Secara lebih umum, topik ini menunjukkan bagaimana kebijakan dapat digabungkan dan dirantai untuk memberikan hasil yang diinginkan. Untuk ringkasan umum pola ini dan pola terkait lainnya, lihat Pola Cookbook Proxy API.

Contoh yang dibahas di sini menggunakan komposisi kebijakan untuk menggabungkan data dari dua API publik yang 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, yaitu 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 dan 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 ingin membaca ringkasan singkat tentang pola komposisi kebijakan, lihat "Pola komposisi kebijakan" di Pola Cookbook Proxy API.

Sebelum mempelajari contoh buku resep ini, Anda juga harus memahami konsep dasar berikut:

  • Pengertian kebijakan dan cara melampirkannya ke proxy. Untuk pengantar kebijakan yang bagus, lihat Apa itu kebijakan?.
  • Struktur alur proxy API, seperti yang dijelaskan dalam Mengonfigurasi alur. Alur memungkinkan Anda menentukan urutan kebijakan yang dijalankan oleh proxy API. Dalam contoh ini, beberapa kebijakan dibuat dan ditambahkan ke alur proxy API.
  • Cara project proxy API diatur pada sistem file Anda, seperti yang dijelaskan dalam Referensi konfigurasi proxy API. Topik buku resep ini menunjukkan pengembangan lokal (berbasis sistem file), bukan pengembangan berbasis cloud, di mana 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 panduan Mengamankan API dengan meminta kunci API.
  • Pengetahuan tentang XML. Dalam contoh ini, kami membangun proxy API dan kebijakannya dengan file XML yang berada pada 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 kode contoh secara mendetail.

Mengikuti alurnya

Sebelum beralih ke kebijakan, mari kita lihat alur utama dari contoh proxy API kami. XML alur, yang ditampilkan di bawah ini, memberi tahu kita banyak hal tentang proxy ini, kebijakan yang digunakannya, dan tempat kebijakan tersebut dipanggil.

Dalam contoh download, Anda dapat menemukan XML ini di 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 adalah ringkasan elemen alurnya.

  • <Request> - Elemen <Request> terdiri dari beberapa elemen <Step>. Setiap langkah memanggil salah satu kebijakan yang akan kita buat hingga seluruh topik ini. Kebijakan ini berkaitan dengan pembuatan pesan permintaan, pengirimannya, dan penguraian respons. Pada 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 menetapkan 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. Kami akan membahas lebih lanjut tentang langkah penting ini nanti dalam topik ini.

Membuat kebijakan

Bagian berikut membahas setiap kebijakan yang merupakan bagian dari contoh komposisi kebijakan ini.

Membuat kebijakan BiddingMessage 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 menjelaskan elemen-elemennya secara lebih mendetail. Dalam contoh download, Anda dapat menemukan XML ini di 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 tentang elemen dalam kebijakan ini. Anda dapat membaca kebijakan ini selengkapnya di bagian Tetapkan kebijakan Pesan.

  • <AssignMessage name> - Memberi nama pada 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 ditunjukkan dengan kode pos, dan ID negara. Pengguna aplikasi memberikan informasi ini, dan kami cukup mengekstraknya di sini. Parameter sensor diperlukan oleh API, dan dapat bernilai benar (true) atau salah (false), dan kita hanya melakukan hardcode ke salah (false) di sini.
  • <Verb> - Dalam hal ini, kita membuat permintaan GET sederhana ke API.
  • <AssignVariable> - Variabel ini menyimpan nilai yang kita teruskan 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, mengirim objek permintaan yang kami buat di kebijakan TetapkanMessage sebelumnya ke layanan Google Geocoding, dan menyimpan hasilnya dalam variabel bernama GeocodingResponse.

Seperti sebelumnya, mari kita lihat kodenya terlebih dahulu. Berikut penjelasan mendetailnya. Anda dapat membaca kebijakan ini lebih lanjut di kebijakan Info Layanan. Dalam contoh download, Anda dapat menemukan XML ini di 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 tentang elemen kebijakan ini.

  • <ServiceCallout> - Kebijakan ini memiliki nama sama seperti kebijakan sebelumnya.
  • <Request Variable> - Ini adalah variabel yang dibuat dalam kebijakan AssignMessage. API ini mengenkapsulasi permintaan yang menuju ke API backend.
  • <Response> - Elemen ini menamai variabel tempat respons disimpan. Seperti yang akan Anda lihat, variabel ini akan diakses nanti oleh kebijakan ExtractVariables.
  • <HTTPTargetConnection> - Menentukan URL target dari API backend. Dalam hal ini, kita menetapkan bahwa API menampilkan respons JSON.

Sekarang kita memiliki dua kebijakan, kebijakan pertama yang menentukan informasi permintaan yang diperlukan untuk menggunakan backend API (Google Geocoding API), dan kebijakan kedua yang benar-benar mengirimkan permintaan ke API backend. Selanjutnya, kita akan menangani responsnya.

Mengurai respons dengan ExtractVariables

Kebijakan ExtractVariables memberikan mekanisme sederhana untuk mengurai konten dari pesan respons yang diperoleh 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 bentuk.

Berikut adalah daftar kebijakan ExtractVariables. Anda dapat membaca kebijakan ini lebih lanjut di kebijakan Ekstrak Variabel. Dalam contoh download, Anda dapat menemukan XML ini di 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 ke kebijakan tersebut saat digunakan dalam flow.
  • <Source> - Menentukan variabel respons yang telah dibuat di kebijakan ServiceCallout. Data ini adalah variabel tempat kebijakan ini mengekstrak data.
  • <VariablePrefix> - Awalan variabel menentukan namespace untuk variabel lain yang dibuat dalam kebijakan ini. Awalan dapat berupa nama apa pun, kecuali untuk nama yang dicadangkan yang ditentukan oleh variabel yang telah ditetapkan Edge.
  • <JSONPayload> - Elemen ini mengambil data respons yang menarik bagi kita dan memasukkannya ke dalam variabel bernama. Faktanya, Geocoding API menampilkan lebih banyak informasi daripada lintang dan bujur. Namun, ini adalah satu-satunya nilai yang kita perlukan untuk sampel ini. Anda dapat melihat rendering lengkap dari JSON yang ditampilkan oleh Geocoding API di dokumentasi API. Nilai geometry.location.lat dan geometry.location.lng hanyalah dua dari sekian banyak kolom dalam objek JSON yang ditampilkan.

Mungkin tidak jelas, tetapi penting untuk diperhatikan bahwa ExtractVariables menghasilkan dua variabel dengan namanya yang 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 sekarang sudah selesai. Kami telah membuat gabungan dari tiga kebijakan yang membentuk permintaan, memanggil API backend, dan mengurai data JSON yang ditampilkan. Pada langkah terakhir, kita akan memasukkan data dari bagian alur ini ke kebijakan BiddingMessage lain, memanggil API backend kedua (Google Elevation API), dan menampilkan data gabungan ke developer aplikasi.

Membuat permintaan kedua dengan Tugaskan

Kebijakan TetapkanMessage berikut menggunakan variabel yang ditampilkan dari backend pertama (Google Geocoding) yang kami simpan, dan menghubungkannya ke dalam permintaan yang ditujukan untuk API kedua (Google Elevation). Seperti disebutkan sebelumnya, variabel ini adalah geocoderesponse.latitude dan geocoderesponse.longitude.

Dalam contoh download, Anda dapat menemukan XML ini di 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 dibutuhkan dua parameter kueri. Yang pertama disebut locations dan nilainya adalah lintang dan bujur (nilai yang dipisahkan koma). Parameter lainnya adalah sensor, yang diperlukan dan harus bernilai benar atau salah. Hal terpenting yang perlu diperhatikan pada tahap ini adalah pesan permintaan yang kita buat di sini tidak memerlukan ServiceCallout. Kita tidak perlu memanggil API kedua dari ServiceCallout di tahap ini karena kita dapat memanggil API backend dari TargetEndpoint proxy. Jika Anda memikirkannya, kita memiliki semua data yang diperlukan untuk memanggil Google Elevations API. Pesan permintaan yang dihasilkan pada langkah ini tidak memerlukan ServiceCallout, karena permintaan yang dibuat untuk pipeline permintaan utama hanya akan diteruskan oleh ProxyEndpoint ke TargetEndpoint, mengikuti RouteRule yang dikonfigurasi untuk proxy API ini. TargetEndpoint mengelola koneksi dengan API jarak jauh. (Ingat bahwa URL untuk Elevation API ditentukan dalam HTTPConnection untuk TargetEndpoint. Elevation API jika Anda ingin mengetahui lebih lanjut. QueryParams yang disimpan sebelumnya, country dan postalcode, tidak lagi diperlukan, sehingga kami menghapusnya di sini.

Jeda singkat: Kembali ke alur

Pada tahap ini, Anda mungkin bertanya-tanya mengapa kami tidak membuat kebijakan ServiceCallout lainnya. Lagi pula, kami membuat pesan lain. Bagaimana pesan tersebut dikirimkan ke target, Google Elevation API? Jawabannya ada dalam elemen <RouteRule> alur. <RouteRule> menentukan tindakan yang harus dilakukan dengan pesan permintaan yang tersisa setelah bagian <Request> dari alur dijalankan. 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 contoh proxy API, 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 selesai.

Konversi respons dari XML ke JSON

Dalam contoh ini, respons dari Google Elevation API ditampilkan sebagai XML. Untuk "kredit tambahan", mari tambahkan satu kebijakan lagi ke komposit untuk mengubah respons dari XML ke JSON.

Contoh ini menggunakan kebijakan JavaScript bernama GenerateResponse dengan file resource yang berisi kode JavaScript untuk melakukan konversi. Berikut 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 dalam 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 ditampilkan 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 di file README di folder policy-mashup-cookbook. Atau, ikuti petunjuk singkat di sini: Menggunakan contoh proxy API.

Ringkasnya, 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"

Responsnya mencakup lokasi yang di-geocode untuk pusat kode pos yang diberikan oleh pengguna akhir aplikasi, dikombinasikan dengan elevasi pada lokasi yang di-geocoding tersebut. Data tersebut diambil dari dua API backend, yang digabungkan dengan kebijakan yang terpasang 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 buku resep 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 materi iklan ke API Anda.