使用 JavaScript 编程 API 代理

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

在本主题中,您将学习如何使用 JavaScript 将 HTTP 标头动态添加到 响应消息以及如何解析 JSON 响应并将其部分属性返回给 发出请求的应用

下载并试用示例代码

<ph type="x-smartling-placeholder">

关于此食谱集示例

此实战宝典示例展示了 API 代理模式,在该模式中,您可以在 JavaScript。JavaScript 示例旨在向您展示如何使用简单的变量 和消息内容。以下示例展示了如何获取 getset 变量。第二个 示例向您展示了如何解析 JSON 并根据结果构造消息。

API 代理中包含两个 JavaScript 示例:

  • setHeaders.js:此 JavaScript 会获取 在调用 API 代理时设置。JavaScript 会将这些变量添加到 消息,以便您查看每个请求对应的值。
  • minimize.js:此 JavaScript 展示了如何处理消息 内容。本示例背后的理念是,服务返回的数据通常多于 。JavaScript 会解析响应消息 属性,然后使用这些属性来构建响应消息的内容。

setHeader.js 的代码:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

minimize.js 的代码:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

您可以通过上下文对象访问 JavaScript 中的流变量。此对象属于 Edge JavaScript 对象模型如需详细了解对象模型,请参阅 JavaScript 对象模型

准备工作

在探索此实战宝典示例之前,您还应该熟悉以下这些 概念:

  • 什么是政策以及如何将其附加到代理。为了顺利地介绍政策 请参阅什么是 政策?
  • 代理流的结构,如配置流中所述。借助数据流 指定 API 代理执行政策的顺序。在此示例中 创建政策并将其添加到 API 代理流。
  • API 代理项目在您的文件系统中如何组织起来,相关说明请参阅 API 代理配置参考文档
  • 具备 XML、JSON 和 JavaScript 方面的应用知识。在此示例中,您将通过 代理及其策略与文件系统上的 XML 文件相关联。

如果您已下载示例代码,则可以找到本演示文稿中讨论的所有文件, javascript-cookbook 示例文件夹中找到该主题。以下部分将讨论 示例代码

了解代理流

若要在 API 代理中执行 JavaScript,您必须使用政策将其附加到数据流 名为“步骤”的附件JavaScript(请注意大小写)类型的政策仅包含 对 JavaScript 文件名称的引用。您可以使用 Resource网址 元素。

例如,以下政策引用了名为 setHeader.js

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

您可以将此政策附加到 API 代理流,就像关联任何其他政策类型一样。修改者 将政策附加到 API 代理流,即可指明 JavaScript 的执行位置。 这使您能够执行与请求消息或响应消息交互的 JavaScript 因为此类消息“流动”通过 API 代理在本例中,两个 JavaScript 均在 因为策略会执行两项操作:在响应消息上设置 HTTP 标头, “最小化”Apigee Edge 向发出请求的应用返回的响应消息。

如果在管理界面中打开此流程配置,您将看到流程配置 。

选择代理端点 >默认 >Navigator 中的 PostFlow 窗格

名为“default”的 ProxyEndpoint 的相应 XML 配置已显示 。

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

下面是 Flow 元素的摘要。

  • &lt;Request&gt; - <Request>该元素包含 &lt;Step&gt;元素。在每个步骤中,都会调用您在创建其他政策时创建的政策, 。这些政策会将 JavaScript 附加到 API 代理流,以及 政策附加决定 JavaScript 何时执行。
  • &lt;Response&gt; - <Response>元素还包括 <Steps>。这些步骤还会调用负责处理最终 响应来自目标(在此示例中是 Apigee 的模拟服务目标,请注意 /apiproxy/targets/default.xml 下的 HTTPTargetConnection 设置。)
  • &lt;HTTPProxyConnection&gt; - 指定 定义应用为使用此 API 而调用的网络地址。
  • &lt;RouteRule&gt; - 此元素会指定哪个 TargetEndpoint 配置由 ProxyEndpoint 调用。

向代理添加 JavaScript 代码

JavaScript(如 Python 脚本、Java JAR 文件、XSLT 文件等)存储为 资源。当您刚开始使用 JavaScript 时,将代码存储 API 代理中的 JavaScript 文件。随着您不断学习,JavaScript 应变为通用方法, 然后存储在环境组织级别。 这样,您就不必在多个 API 代理中存储相同的 JavaScript 文件, 可能很快就会变得难以管理。

如需了解如何在组织和环境级别存储资源,请参阅资源文件

试试看

有关部署和调用代理的说明,请参阅 JavaScript 实战宝典自述文件

导入和部署 API 代理

做出更改后,您可以在 API 代理构建器中保存 API 代理 管理界面中的工具。

或者,您也可以在目录中运行以下命令 /api-platform-samples/doc-samples/javascript-cookbook

$ sh deploy.sh

测试 JavaScript

在目录中运行以下命令 /api-platform-samples/doc-samples/javascript-cookbook

$ sh invoke.sh

在 Shell 脚本中,使用 curl 标志 -v 来查看响应的 HTTP 标头 由 JavaScript 修改的消息。

您可以直接按照以下步骤提交请求:

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

如果 JavaScript 正确执行,您将看到如下所示的响应:

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

现在,您可以修改 JavaScript 以尝试新内容、重新部署 API 代理,并验证 结果。务必确保部署的 API 代理包含 您的 JavaScript 以使您的更改生效。

脚本错误

编写 JavaScript 时不可避免地会遇到错误。导致您的网站 您会发现下面显示了 API 代理发出的请求。

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

何时使用 JavaScript

在 Apigee Edge 上,通常可以通过多种方式实现特定功能。使用 开箱即用的政策,避免尝试对所有 API 代理进行编码 逻辑。尽管 Apigee Edge 利用经过编译的 JavaScript 来改进 因此 JavaScript 的效果不太可能达到策略的效果。JavaScript 可能是 维护和调试难度更大。请预留 JavaScript 以用于您的专用功能 要求。

如果自定义功能关乎性能,请尽可能使用 Java。

摘要

在本实战宝典主题中,您学习了如何将 JavaScript 添加到 API 代理中 实现自定义行为。示例实现的自定义行为 演示如何获取 和 变量,以及如何解析 JSON 和构建自定义响应 消息。