<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
在本主题中,您将了解如何使用政策组合创建混搭。 政策组合是一种 Apigee 代理模式,可让您合并来自多个后端的结果 使用政策将目标整合到单个响应中。
有关政策构成的一般概述,请参阅“政策构成模式” API 代理实战宝典 模式。
下载并试用示例代码
<ph type="x-smartling-placeholder">关于此食谱集示例
此实战宝典示例展示了一种名为“政策组合”的 API 代理模式。 此模式提供了一种(还有其他)方式来混搭来自多个后端来源的数据。 更笼统地说,本主题演示了如何将政策组合和链接起来, 都能达到理想的结果。如需大致了解此模式和其他相关模式,请参阅 API 代理实战宝典 模式。
此处讨论的示例使用策略组合将来自这两种不同来源的数据 公共 API:
- Google 地理编码 API:此 API 会转换地址(如“1600 Amphitheatre Parkway, Mountain View, CA”) 转换为地理坐标(如纬度 37.423021 和经度 -122.083739)。
- Google 海拔 API 此 API 提供了一个简单的接口,可用来查询地球上各位置的海拔 数据。在此示例中,Google Geocoding API 返回的坐标将用作输入 此 API 中
应用开发者将使用以下两个查询参数调用此 API 代理:邮政编码和国家/地区 ID:
$ 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 密钥验证。这是最简单的基于应用的安全机制, 配置 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>
下面是 Flow 元素的摘要。
- <Request> - <Request>该元素包含 <Step>元素。每一步都会调用一项政策,我们将在其余部分 部分。这些政策涉及创建请求消息、发送请求消息,以及 来解析响应。在本主题结束时,您将了解每个选项的作用 政策。
- <Response> - <Response>元素还包括 <Steps>。这些步骤还会调用负责处理最终 响应(Google Elevation API)。
- <HttpProxyConnection> - 此元素指定有关 应用将如何连接到此 API 代理,包括 <BasePath>,用于指定如何 此 API 将被调用。
- <RouteRule> - 此元素指定立即发生的情况 。在此示例中,将调用 TargetEndpoint。 我们将在本主题的后面部分中详细讨论这一重要步骤。
创建政策
以下部分讨论构成此政策组合的各个政策 示例。
创建第一个 AssignMessage 政策
第一个 AssignMessage 政策 创建一条请求消息,该消息将发送给 Google 地理编码服务 服务。
我们先从政策代码开始,然后更详细地说明其元素。在
下载示例文件,您可以在
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 API 需要知道位置,
用邮政编码和国家/地区 ID 表示。这类信息由应用用户提供
我们只需在此处提取数据即可API 需要使用
sensor
参数, 可以将其硬编码为 false。 - <Verb> - 在本示例中,我们会向 API。
- <AssignVariable> - 这些变量用于存储 传递给 API。在本例中,稍后将在响应中访问变量 返回给客户端
使用 ServiceCallout 发送请求
政策组合序列中的下一步是创建 ServiceCallout 政策。通过 下面列出的 ServiceCallout 政策会发送我们在 将之前的 AssignMessage 政策添加到 Google 地理编码服务,并将结果保存在 变量。
和之前一样,我们先来看一下代码。详细说明如下。您可以阅读
有关此政策的更多信息,请参阅服务调用程序
政策。在示例下载中,您可以在以下文件中找到此 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> - 这是在 AssignMessage 政策它会封装发送到后端 API 的请求。
- <Response> - 此元素为用来指定响应的变量 。如您所见,ExtractVariables 稍后会访问此变量 政策。
- <HTTPTargetConnection> - 指定后端的目标网址 API。在本例中,我们指定 API 返回 JSON 响应。
现在我们有两项政策,一项用于指定使用 后端 API(Google 的 Geocoding API),而第二种 API 会将请求实际发送给 后端 API。接下来,我们将处理响应。
使用 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> - 指定在 ServiceCallout 政策。这是此政策从中提取数据的变量。
- <VariablePrefix> - 变量前缀指定用于 创建的其他变量前缀可以是任何名称,但预留名称除外 由 Edge 的 预定义变量。
- <JSONPayload> - 此元素用于检索 并将其放入命名变量中。事实上,Geocoding API 会返回很多 比经纬度多的信息。不过,我们只需要这些值 示例。您可以看到 Geocoding API 返回的 JSON 的完整渲染 位于 API 的 文档。geo.location.lat 和 metry.location.lng 的值就是 是所返回的 JSON 对象中众多字段中的两个。
这可能并不明显,但重要的是,ExtractVariables 会生成两个 变量,其名称由变量前缀 (Geocodingresponse) 和实际 变量名称。这些变量存储在 API 代理,并且可用于代理流程中的其他政策, 看到的内容。变量为:
- geocoderesponse.latitude
- geocoderesponse.longitude
现在,大部分工作已经完成。我们制定了由三项政策组成的综合性政策, 请求、调用后端 API 并解析返回的 JSON 数据。在最后几步中, 将数据从流的这一部分传递到另一个 AssignMessage 政策,调用第二个后端 API (Google Elevation API),并将混搭的数据返回给应用开发者。
生成第二个 包含 AssignMessage 的请求
以下 AssignMessage 政策使用从第一个后端(Google 地理编码),并将这些数据以发往第二个 API (Google 高度)。如前所述,这些变量为 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 Elevation API,会发现它采用了两个查询参数。
第一个名为 locations
,其值是纬度和经度
(逗号分隔值)。另一个参数是 sensor
,该参数是必需参数,必须
为 true 或 false。此时,需要注意的最重要的一点是
我们在这里创建的消息不需要 ServiceCallout。我们无需调用第二个
API,因为我们可以从代理的
TargetEndpoint。仔细想想,我们已经拥有调用 Google 海拔所需的全部数据。
API 在此步骤中生成的请求消息不需要 ServiceCallout,因为
为主请求管道生成的请求,因此只会由
按照为此 API 代理配置的 RouteRule 从 ProxyEndpoint 到 TargetEndpoint。
TargetEndpoint 管理与远程 API 的连接。(您应该还记得
Elevation API 在 TargetEndpoint 的 HTTPConnection 中定义。Google Elevation API
文档。我们之前存储的 QueryParams,
由于不再需要 country
和 postalcode
,因此我们会将其移除
此处。
短暂停顿:返回到流程
现在,您可能想知道我们为什么不创建另一个 ServiceCallout 政策。更新后
我们又创建了一条消息如何将该信息发送给目标
Elevation API?答案就在 <RouteRule> 中流的元素。<RouteRule>
指定如何处理 <Request> 之后的所有剩余请求消息属于
流的执行情况。此 <RouteRule> 指定的 TargetEndpoint>会告诉
用于传送消息的 API 代理
发送至 http://maps.googleapis.com/maps/api/elevation/xml
。
如果您下载了示例 API 代理,则可以在文件中找到 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 的形式返回。对于“额外 赠送金额”让我们向复合 再添加一个策略,将响应从 XML 转换为 JSON。
此示例使用名为 GenerateResponse 的 JavaScript 政策以及资源文件 包含 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 代理。
总而言之,您可以按如下方式调用复合 API。用您的 组织名称:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
响应包含由 提供的邮政编码中心的经过地理编码的位置, 应用最终用户,以及该经过地理编码的位置的海拔。数据 从两个后端 API 检索数据,与附加到 API 代理的政策相混淆;以及 在单个响应中返回给客户端
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
摘要
本实战宝典主题介绍了如何使用策略组合模式创建混搭 来自多个后端来源的数据。政策组合是 API 中使用的一种常见模式 代理开发,以便向您的 API 添加广告素材功能。