如何在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
相关产品推荐
相关产品推荐

