You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Apigee JavaScript policy中发起HTTP请求?解决fetch未定义报错

报错原因

Apigee 的 JavaScript Policy 运行在嵌入式 Rhino JS 引擎上,既不是浏览器环境也不是标准 Node.js 运行时,没有内置fetch、XMLHttpRequest这类Web标准API,直接调用必然抛出ReferenceError: "fetch" is not defined错误。

可行实现方案

方案1:使用 Apigee 内置 Service Callout 策略(最推荐,性能与稳定性最优)

这是Apigee原生支持的发起出站HTTP请求的标准能力,不需要在自定义JS中处理网络逻辑,可维护性最好。

  • 配置逻辑:
    • 在Proxy Endpoint的PreFlow中,将Service Callout策略放在原有JS策略之前
    • 在策略配置中定义目标请求地址、请求方法、请求头、请求体,指定响应存储的上下文变量名
    • 后续执行的JS策略直接从上下文变量读取Service Callout返回的响应内容做后续处理即可
  • 策略配置示例:
<ServiceCallout name="SC-CallExternalAPI">
  <DisplayName>Call External API</DisplayName>
  <Request variable="externalApiRequest">
    <Set>
      <Verb>GET</Verb>
      <Path>/your/target/path</Path>
      <Headers>
        <Header name="Content-Type">application/json</Header>
      </Headers>
    </Set>
  </Request>
  <HTTPTargetConnection>
    <URL>https://your-external-service-endpoint.com</URL>
  </HTTPTargetConnection>
  <Response>externalApiResponse</Response>
</ServiceCallout>
  • 后续JS中读取响应的示例代码:
// 从上下文变量读取Service Callout返回的结果
const responseContent = context.getVariable('externalApiResponse.content');
const responseStatus = context.getVariable('externalApiResponse.status.code');

方案2:在JS策略中使用内置httpClient对象发起请求

如果需要把HTTP请求逻辑直接写在JS代码中,不要使用fetch,直接调用Rhino环境全局注入的httpClient对象即可,这是Apigee专门为JS策略提供的HTTP请求能力。

  • 注意:httpClient默认是异步请求,PreFlow场景下可以直接调用waitForComplete()方法同步等待响应,适配PreFlow的顺序执行逻辑。
  • 代码示例:
// 构造请求对象
const req = new Request();
req.setMethod('GET');
req.setUrl('https://your-external-service-endpoint.com/your/target/path');
req.setHeader('Content-Type', 'application/json');

// 发起请求并等待响应
const exchange = httpClient.send(req);
exchange.waitForComplete();

// 处理响应结果
if (exchange.isSuccess()) {
  const response = exchange.getResponse();
  const responseBody = response.content;
  const statusCode = response.status;
  // 自定义业务处理逻辑
} else {
  const err = exchange.getError();
  // 自定义错误处理逻辑
}

方案3:自行实现fetch polyfill(不推荐,维护成本高)

如果现有JS逻辑重度依赖fetch写法,可以基于上面提到的httpClient对象手动实现fetch的polyfill,适配原有代码的调用习惯。但这种方式需要自行处理异步逻辑、请求/响应格式适配、异常边界捕获,兼容问题多,除非是存量代码迁移否则不建议使用。

注意事项
  • PreFlow中发起的出站请求会占用API整体处理时长,需要设置合理的超时时间,避免拖慢接口响应
  • 不要尝试引入axios、node-fetch等第三方Node.js HTTP库,这类库依赖Node.js原生模块,无法在Rhino环境中运行

内容的提问来源于stack exchange,提问作者Tomer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:31:06