查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
在本主題中,您將瞭解如何使用政策組成建立混搭作業。 政策組合是一種 Apigee Proxy 模式,可讓您結合多個後端的結果 將目標鎖定為單一回應
如需政策組合的概要總覽,請參閱「政策組成模式」 (API Proxy 教戰手冊) 模式。
下載並試用程式碼範例
關於本教戰手冊範例
這個教戰手冊範例說明瞭名為「政策組成」的 API Proxy 模式。 這個模式會提供一種方式 (還有其他方式) 將多個後端來源的資料混搭。 更廣泛來說,本主題展示瞭如何將政策合併並鏈結至 產生理想的結果如需這個模式和其他相關模式的概要總覽,請參閱 API Proxy 教戰手冊 模式。
這裡的範例是使用政策組成,將這兩種管道的資料混搭 公用 API:
- Google 地理編碼 API:這個 API 會轉換地址 (例如「1600 Amphitheatre Parkway, Mountain View, CA」) 轉換為地理座標 (例如緯度 37.423021 和經度 -122.083739)。
- Google 海拔高度 API:這個 API 提供簡易介面,可用來查詢地表位置的海拔高度 資料。在這個範例中,系統會將 Geocoding API 傳回的座標做為輸入內容使用 導入這個 API
應用程式開發人員呼叫這個 API Proxy 時會使用兩個查詢參數:一個郵遞區號和一個國家/地區 ID:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
回應是一個 JSON 物件,其中包含的地理編碼位置 (經緯度) 所提供郵遞區號區域的中心,以及該地理編碼的高度 或 HTTP/HTTPS 位置
{ "ElevationResponse":{ "status":"OK", "result":{ "location":{ "lat":"39.7500713", "lng":"-74.1357407" }, "elevation":"0.5045232", "resolution":"76.3516159" } } }
事前準備
如果您想大致瞭解政策組成模式,請參閱 樂曲圖案(API Proxy 教戰手冊) 模式。
探索這個教戰手冊範例之前,請先熟悉這些基本知識 概念:
- 什麼是政策,以及如何在 Proxy 中附加政策。如需完整的政策簡介 請參閱什麼是 政策嗎?。
- API Proxy 流程的結構,如設定流程所述。你可以透過流程 指定 API Proxy 執行政策的順序。在本例中 建立政策並新增至 API Proxy 的流程。
- API Proxy 專案在檔案系統中整理的方式,如下所述 API Proxy 設定參考資料。本教戰手冊主題說明瞭本機開發 (檔案) 系統型) 而非以雲端為基礎的開發作業,透過管理 UI 開發 API Proxy
- 使用 API 金鑰驗證。這是最簡單的應用程式式安全防護機制類型, 設定 API詳情請參閱「API 金鑰。您也可以參閱安全設定說明文件 「要求 API 金鑰」教學課程」教學課程。
- 具備 XML 的操作知識。在此範例中,我們會建構 API Proxy 檔案系統對於儲存在檔案系統中的 XML 檔案建立政策。
如果您已下載程式碼範例, 就能找到本 找到 mashup-policy-cookbook 範例資料夾中的任何主題。後續章節 詳細說明程式碼範例
隨心所欲
移至政策前,讓我們看一下範例的主要流程 並存取 API Proxy這個流程 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>
以下是流程的元素摘要。
- <Request> - <Request>元素由多個 <Step>元素。每個步驟都會呼叫其中一項政策 這些政策與建立、傳送要求訊息,以及 剖析回應本主題結束後,您將瞭解各項目 再檢查有關聯的允許政策
- <Response> - <Response>也包含 <步驟>。這些步驟也呼叫了負責處理最終 則來自目標端點 (Google Elevation API) 的回應。
- <HttpProxyConnection> - 此元素指定 應用程式如何連線至這個 API Proxy,包括指定 <BasePath>, 系統會呼叫這個 API
- <RouteRule>:這個元素指定會立即執行的操作 等傳入要求訊息處理完畢後,在此情況下,系統會呼叫 TargetEndpoint, 本主題稍後會進一步說明這項重要步驟。
建立政策
以下各節將討論組成此政策的各項政策 範例。
建立第一個 AssignMessage 政策規定
第一項 AssignMessage 政策 下方列出的是建立要求訊息,系統會將訊息傳送至 Google Geocoding 課程中也會快速介紹 Memorystore 這是 Google Cloud 的全代管 Redis 服務
我們先從政策程式碼談起,再詳細說明其中的元素。在
範例下載,您可以在檔案中找到這個 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 的具名變數。 這個變數會封裝要求物件,此物件將由 服務呼叫政策。
- <QueryParams> - 設定
後端 API 呼叫在此情況下,Geocoding API 必須知道位置,
以郵遞區號和國家/地區 ID 表示應用程式使用者提供這項資訊。
直接在這裡擷取
sensor
是 API 的必要參數, 傳回 true 或 false,然後在這裡硬式編碼為 false - <Verb> - 在這個範例中,我們要向 也能使用 Google Cloud CLI 或 Compute Engine API
- <AssignVariable> - 這些變數會儲存我們 傳遞到 API在本範例中,系統會在稍後在回應中存取變數。 傳回給用戶端。
傳送要求並加上 ServiceCALL
政策組合序列的下一步是建立 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>
以下簡要說明這項政策的元素。
- <ServiceCallout> - 與先前的政策一樣,這項政策設有 名稱。
- <Request 變數> - 這是建立在 指派訊息政策並封裝傳送至後端 API 的要求。
- <Response> - 此元素會為回應命名 資料。如您所見,稍後您可以透過 ExtractVariables 存取這個變數 政策。
- <HTTPTargetConnection>:指定後端的目標網址 也能使用 Google Cloud CLI 或 Compute Engine API在這個範例中,我們會指定 API 傳回 JSON 回應。
現在我們有兩個政策,一項指定使用 Google 的 Geocoding API),第二個則是實際將要求傳送至 與後端 API 通訊接著,我們會處理回應。
使用下列指令剖析回應 ExtractVariables
ExtractVariables 政策提供簡單的機制,可剖析來自 回應訊息。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 會傳回很多 而不是經緯度的資訊不過,這些是我們只需要 範例。您可以看到 Geocoding API 傳回的 JSON 完整呈現方式 API 的 說明文件。geo.location.lat 和 geo.location.lng 的值只是 傳回 JSON 物件的兩個欄位。
乍看之下, ExtractVariables 會產生兩個 名稱由變數前置字元 (Geocodingresponse) 和實際 政策中指定的變數名稱。這些變數會儲存在 API Proxy,也會在 Proxy 流程中適用於其他政策,就像您將會 請參閱變數如下:
- geocoderesponse.latitude
- geocoderesponse.longitude
大部分工作都已經完成,我們根據三項政策 要求、呼叫後端 API,以及剖析傳回的 JSON 資料。在最後的步驟中 這個流程中的資料傳送到另一個 AssignMessage 政策時,會呼叫第二個後端 API (Google Elevation API),然後將經過混和的資料傳回給應用程式開發人員。
產生第二個 透過 AssignMessage 要求
以下 AssignMessage 政策會使用第一個後端 (Google) 傳回的變數 地理編碼),並將其插入至第二個 API (Google 高度)。如前所述,這些變數是 Geocodingresponse.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 Elevation API 時,您會發現該 API 使用兩個查詢參數。
第一個參數稱為 locations
,其值是經緯度
(逗號分隔值)。另一個參數是 sensor
,這是必要參數,且必須
可以是 true 或 false。此時最重要的一點是
我們在這裡建立的訊息不需要服務呼叫我們無須在
API 從 Service 呼叫 發出,因為我們可從 Proxy 的
TargetEndpoint,仔細想想,我們有呼叫 Google Elevations 所需的所有資料
這個步驟產生的要求訊息不需要 Service 子女,因為
完全由主要要求管道產生的要求,因此會直接由
按照為這個 API Proxy 設定的 RouteRule,將 ProxyEndpoint 傳送至 TargetEndpoint。
TargetEndpoint 會管理與遠端 API 的連線。(請注意,
並在 TargetEndpoint 的 HTTPConnection 中定義 elevation API。Elevation API
。先前儲存的 QueryParams
不再需要「country
」和「postalcode
」,因此我們會將其移除
此處。
簡短停頓:返回流程
您現在可能會好奇,為何我們不建立另一項服務呼叫政策。更新後
我們又建立了一則訊息如何將訊息傳送給目標;Google
Elevation API?答案就在 <RouteRule> 中流程的各個元素<RouteRule>
指定如何處理 <Request> 後所有剩餘的要求訊息部分
流程就會執行這個 <RouteRule> 指定的 TargetEndpoint告知
用來傳送訊息的 API Proxy
至 http://maps.googleapis.com/maps/api/elevation/xml
。
如果您下載了範例 API Proxy,您可以在檔案中找到 TargetProxy XML
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 檔案。
這個範例使用名為 GenerateResponse 的 JavaScript 政策,以及一個資源檔案 才能執行轉換如下所示 GenerateResponse 政策定義:
<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 範例,可在 Apigee Edge 範例存放區 GitHub 的 doc-samples 資料夾中找到。只要 遵循 policy-mashup-cookbook 資料夾中 README 檔案的說明。或 請按照以下簡單的指示進行:使用 範例 API Proxy。
總結來說,您可以按照以下方式呼叫複合 API。請以您的 機構名稱:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
回應中會包含由 應用程式使用者,結合該地理編碼位置的海拔高度。資料之前為 擷取自兩個後端 API,並與附加至 API Proxy 的政策混搭,以及 透過單一回應傳回用戶端。
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
摘要
本教戰手冊主題說明如何使用政策組成模式來建立混搭 來自多個後端來源的資料政策組成是 API 使用的常見模式 透過 Proxy 開發,將廣告素材功能新增至 API。