Apigee JavaScript Callout策略返回错误:问题排查与解决
问题原因与解决方法
问题定位
错误提示明确指向代码第5行:var req = new Request(url, operation, headers, payload);,核心原因是Apigee的Request构造函数要求请求体参数必须是字符串类型,但你代码里通过JSON.parse(request.content)把请求体解析成了JavaScript对象(即错误提示中的NativeObject),类型不匹配导致报错。
解决办法
有两种直接有效的修复方式:
方式1:直接使用原始请求体字符串
因为curl发送的请求体已经是JSON格式的字符串,无需提前解析,直接传入Request构造函数即可:
var headers = {'Content-Type' : 'application/json'}; var url = 'https://jsonplaceholder.typicode.com/posts'; var operation = "POST"; var req = new Request(url, operation, headers, request.content); var calloutResponse1 = httpClient.send(req); context.session['calloutResponse1'] = calloutResponse1;
方式2:将解析后的对象重新转为JSON字符串
如果业务需要先解析请求体做逻辑处理,处理完成后必须把对象转回JSON字符串再传入Request:
var payload = JSON.parse(request.content); // 这里可以添加对payload的自定义处理逻辑 var headers = {'Content-Type' : 'application/json'}; var url = 'https://jsonplaceholder.typicode.com/posts'; var operation = "POST"; // 将处理后的对象转为JSON字符串 var reqBody = JSON.stringify(payload); var req = new Request(url, operation, headers, reqBody); var calloutResponse1 = httpClient.send(req); context.session['calloutResponse1'] = calloutResponse1;
验证
修改代码后重新部署代理,用原curl命令测试:
curl -k https://xxxxxx/poc3 -d '{"name": "Apple MacBook Pro 16", "data": "s"}'
即可正常发起POST请求。
内容的提问来源于stack exchange,提问作者schsn
相关产品推荐
相关产品推荐

