使用政策构成

<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 元素的摘要。

  • &lt;Request&gt; - <Request>该元素包含 &lt;Step&gt;元素。每一步都会调用一项政策,我们将在其余部分 部分。这些政策涉及创建请求消息、发送请求消息,以及 来解析响应。在本主题结束时,您将了解每个选项的作用 政策。
  • &lt;Response&gt; - <Response>元素还包括 <Steps>。这些步骤还会调用负责处理最终 响应(Google Elevation API)。
  • &lt;HttpProxyConnection&gt; - 此元素指定有关 应用将如何连接到此 API 代理,包括 <BasePath>,用于指定如何 此 API 将被调用。
  • &lt;RouteRule&gt; - 此元素指定立即发生的情况 。在此示例中,将调用 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> - 为此政策命名。名称为 在流中引用政策时使用。
  • &lt;AssignTo&gt; - 创建名为 GeocodingRequest 的命名变量。 此变量用于封装将由 ServiceCallout 政策。
  • &lt;QueryParams&gt; - 设置 后端 API 调用。在本例中,Geocoding API 需要知道位置, 用邮政编码和国家/地区 ID 表示。这类信息由应用用户提供 我们只需在此处提取数据即可API 需要使用 sensor 参数, 可以将其硬编码为 false。
  • &lt;Verb&gt; - 在本示例中,我们会向 API。
  • &lt;AssignVariable&gt; - 这些变量用于存储 传递给 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>

下面简要说明了此政策的各个要素。

  • &lt;ServiceCallout&gt; - 与上一项政策一样,此项 名称。
  • <Request variable> - 这是在 AssignMessage 政策它会封装发送到后端 API 的请求。
  • &lt;Response&gt; - 此元素为用来指定响应的变量 。如您所见,ExtractVariables 稍后会访问此变量 政策。
  • &lt;HTTPTargetConnection&gt; - 指定后端的目标网址 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> - 同样,政策名称用于 是指在数据流中使用时的政策。
  • &lt;Source&gt; - 指定在 ServiceCallout 政策。这是此政策从中提取数据的变量。
  • &lt;VariablePrefix&gt; - 变量前缀指定用于 创建的其他变量前缀可以是任何名称,但预留名称除外 由 Edge 的 预定义变量
  • &lt;JSONPayload&gt; - 此元素用于检索 并将其放入命名变量中。事实上,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, 由于不再需要 countrypostalcode,因此我们会将其移除 此处。

短暂停顿:返回到流程

现在,您可能想知道我们为什么不创建另一个 ServiceCallout 政策。更新后 我们又创建了一条消息如何将该信息发送给目标 Elevation API?答案就在 <RouteRule> 中流的元素。&lt;RouteRule&gt; 指定如何处理 <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 添加广告素材功能。