JavaScript中使用urlopen模块传递动态请求头的正确方法是什么?
问题根因
这是IBM API Connect/GatewayScript 中 urlopen 模块传递自定义请求头的常见问题,核心原因有3个:
- 注释中
{$: 变量名}是APIC赋值策略的专属语法,不适用于urlopen的options参数配置 - 重复声明
contentType字段和headers中的Content-Type可能产生配置冲突 - 未验证入站
userId请求头是否正确读取,不排除头名大小写不匹配导致取值为空的情况
方案1:修正现有urlopen配置
先加日志验证请求头取值,再规范参数配置即可,示例代码如下:
// 第一步:先验证入站请求头是否正确获取,可在系统日志中查看打印结果 var UserId = apim.getvariable("request.headers.userId"); console.log("读取到的入站userId为:", UserId); var targetUrl = apim.getvariable("targetUrl"); var urlopen = require("urlopen"); var options = { target: targetUrl, method: "POST", headers: { "Content-Type": "application/json", // 直接传入已读取的变量,转为字符串格式;如果后端对大小写敏感可改为"UserId"作为键名 "userId": UserId.toString() }, // 删掉重复的contentType声明,避免和headers中的配置冲突 data: apim.getvariable("inputReq"), timeout: 60, sslClientProfile: "api-sslcli-all", }; // 后续回调逻辑保持原有写法即可 urlopen.open(options, function (error, response) { if (error) { console.log(error); session.output.write("urlopen error: " + JSON.stringify(error)); } else { var responseStatusCode = response.statusCode; var responseReasonPhrase = response.reasonPhrase; console.log("Response status code: " + responseStatusCode); console.log("Response reason phrase: " + responseReasonPhrase); response.readAsJSON(function (error, responseData) { if (error) { console.log(error); throw error; } else { session.output.write(responseData); apim.setvariable("message.body", responseData); } }); } });
如果日志打印UserId为空,说明入站请求头名大小写不匹配,将取值代码改为apim.getvariable("request.headers.UserId")即可。
方案2:使用APIC原生invoke策略(更稳定)
如果urlopen方式仍有问题,可调用APIC内置的invoke策略发起POST请求,兼容性更强,示例如下:
var UserId = apim.getvariable("request.headers.userId"); var targetUrl = apim.getvariable("targetUrl"); // 先设置invoke需要的参数 apim.setvariable("invoke.target", targetUrl); apim.setvariable("invoke.method", "POST"); apim.setvariable("invoke.headers.Content-Type", "application/json"); apim.setvariable("invoke.headers.userId", UserId); apim.setvariable("invoke.input", apim.getvariable("inputReq")); apim.setvariable("invoke.sslClientProfile", "api-sslcli-all"); apim.setvariable("invoke.timeout", 60); // 调用invoke策略 apim.call("invoke", function(error, result) { if (error) { console.log("invoke错误:", error); session.output.write("invoke error: " + JSON.stringify(error)); return; } // 直接读取返回结果 var responseData = apim.getvariable("message.body"); session.output.write(responseData); });
内容的提问来源于stack exchange,提问作者lokesh kella
相关产品推荐
相关产品推荐

