使用政策构成

<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?count&ry=uspostalcode=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="def>aul<t&quo>t;
  <Flows
    Flow name>="<default>"
      <Request
            !-- Generate request message for the Goo>gle Geocoding< API>< --
>            StepNameGene<rateG><eocod>ingRequest/Na<me/Step
            !-- Call the Goo>gle Geocoding< API>< --
>            StepNameExe<cuteG><eocod>ingRequest/Na<me/Step
            !-- Parse the response >and set varia<bles>< --
>            StepNamePa<rseGe><ocodi>ngResponse/Na<me/Step
            !-- Generate request message for the Goo>gle Elevation< API>< --
>            StepNameAssig<nElev><ation>Paramet<ers/Name>/Step
 <     /Re>quest
      R<esponse
            !-- Parse the response message from >the Elevation< API>< --
>            StepNamePa<rseEl><evati>onResponse/Na<me/Step
            !-- Generate the final JSON-formatted respons>e with JavaSc<ript>< --
>            Step<NameG><enera>teRespo<nse/Name/>Step
<     > /R<espons>e
  <  /Flow
  /Flows

 > HTTP<ProxyConnection
    !-- Add a base path to the ProxyEndpoint for UR>I pat<tern mat>ching--
    BasePath/po<licy-mash>up-co<okbook/BasePath
    !-- Listen on both HTTP an>d HTT<PS endpoint>s --
  <  VirtualHos>tdefa<ult/Virtual>Host
 <   VirtualHo>sts<ecure/VirtualHost
  >/HT<TPProxyConnection
  Rout>eRule< name="default"
    !-- Connect ProxyEndpoint to named Ta>rgetE<ndpoint under >/target<s --
    Target>End<pointdefau>l<t/TargetEndpoi>nt
  /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="GenerateGeocodingReq>ues<t"
  AssignTo createNew="true&>quot; type="<;request&>quo<t;G>eocod<ingRequest/>AssignT<o
  Set
    QueryParams
 >     QueryParam name="addr<ess"{r>equest.<queryparam.postalcode}/Q>ueryParam
      QueryParam n<ame="r>egion&q<uot;{request.queryparam.>count<ry}/QueryPa>ram
 <     QueryPa>ram n<ame=>&qu<ot;se>nso<r&qu>ot;<false/QueryParam
    /QueryParams
    VerbGET/Verb>
  </Set
  !-- Set> vari<able>s for use <in th>e fin<al >response --
  AssignVariable
<    >Nam<ePostalCode/Nam>e
 <   Refrequest.>query<para>m.posta<lcode>/Ref
<  />AssignVariable
  AssignVar<iabl>e
 <   NameCountry/>N<ame
    Refreq>uest.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="ExecuteGeocodingReq>ues<t"
  Request variable="Geo>cod<ingReque>st"/
  Respo<nseGeocod>ing<Response/Response
  >HTTPT<arg>etConnection
    URLhttp://maps.googleapis.com/m<aps/>api</geocode/json/URL
  />H<TTPTargetConnec>tion
/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="ParseGeocodingResp>ons<e">;
  SourceGeocodi<ngRespo>nse</Source
  Vari>ablePrefixgeoco<deresponse/Vari>abl<ePrefix
  J>SONPa<yload
    Variable name=>"la<titude&q>uot;
       JSONPath$.results[0].g<eometry.l>ocati<on.lat/JS>ONPat<h
    /Variable
    Varia>ble name<="l>ongitude"
       JSONPath$.re<sults[0].>geome<try.locat>ion<.lng/JSONPat>h<
    /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="AssignElevationParame>t<ers&qu>ot;
R<emove
    Q>ueryPar<ams
      QueryParam name=>"c<ountry"/
      QueryPara>m nam<e="post>alc<ode&quo>t;/<
  >  /Qu<eryParams
 > /Remov<e
  Set
    QueryParams
   >   QueryParam name="locations"{geocoderespon<se.latitude>},{geoc<oderesponse.longitude}/Q>ueryP<aram
      >Query<Param name=&>quo<t;se>n<sor"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="def>aul<t"
  HTTPTarget>Conne<ction
    !-- This is where we define the target. For this sample we just use a simp>le UR<L. >--
    URLhttp://maps.googleapis.com/maps/api/ele<vati>on/<xml/URL
  /HTTPTarget>C<onnection
/Targ>etEndpoint

现在,我们只需处理来自 Google Elevation API 的响应, 完成。

将响应从 XML 转换为 JSON

在此示例中,来自 Google Elevation API 的响应以 XML 的形式返回。对于“额外 赠送金额”让我们向复合 再添加一个策略,将响应从 XML 转换为 JSON。

此示例使用名为 GenerateResponse 的 JavaScript 政策以及资源文件 包含 JavaScript 代码,以执行转换。以下为 GenerateResponse 政策定义:

<Javascript name="GenerateResponse" timeo>ut=<"10000>"
  ResourceURLjsc:/</GenerateRes>p<onse.js/Res>ourceURL
/Javascript

GenerateResponse.js 资源文件包含用于执行 。您可以在 文件 doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js

Apigee 还提供开箱即用的政策 XMLToJSON,用于将 XML 转换为 JSON。您可以 修改 ProxyEndpoint 以使用下方显示的 xmltojson 政策 。

<XMLToJSON name="xmlto>jso<n">
  <Options
>  /<Options
  Outp>utVariab<leresponse/Outp>utV<ariabl>e
  Sour<cerespo>n<se/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?count&ry=uspostalcode=08008"

响应包含由 提供的邮政编码中心的经过地理编码的位置, 应用最终用户,以及该经过地理编码的位置的海拔。数据 从两个后端 API 检索数据,与附加到 API 代理的政策相混淆;以及 在单个响应中返回给客户端

{  
   "country":"us",
   "postalcode":"08008",
   "elevation":{  
      "meters":0.5045232,
      "feet":1.6552599030345978
   },
   "location":{  
      "latitude":39.75007129999999,
      "longitude":-74.1357407
   }
}

摘要

本实战宝典主题介绍了如何使用策略组合模式创建混搭 来自多个后端来源的数据。政策组合是 API 中使用的一种常见模式 代理开发,以便向您的 API 添加广告素材功能。