问题描述
当使用csb的HttpParameters.Builder的requestURL方法调用第三方api时,本地运行成功调用,但是当部署在服务器A并通过另一台服务器B的ng转发调用失败。
代码
HttpParameters.Builder builder = HttpParameters.newBuilder();
// System.out.println(url);
builder.requestURL(url + "/****/***") // 设置请求的URL
.api("***.***") // 设置服务名
.version("1.0.0") // 设置版本号
.accessKey("")
.secretKey("=")
.method(""); // 设置调用方式, get/post
JSONObject params = new JOSNObject();
//构造ContentBody对象
ContentBody cb = new ContentBody(JSON.toJSONString(params));
builder.contentBody(cb);
//定义json提交方式
builder.putHeaderParamsMap("Content-Type", "application/json");
//设置是否生成防重放Nonce, 默认值是false, 这个功能仅在SDK1.1.4及CSB-Broker 1.1.2后支持
builder.nonce(true);
// 使用下面的调用方法, 可以返回更多的信息
HttpReturn res = HttpCaller.invokeReturn(builder.build()); //然后在res里获取相关的信息
//注:如果返回结果出现乱码(不能正常显示中文),可以使用串字符集转换方法进行转换
// result = HttpCaller.changeCharset(result);
// System.out.println(res.response);
JSONObject response = JSONObject.parseObject(res.response);
问题分析
通过本地使用 wireshark 抓包、分别在A、B服务器上使用 tcpdump 命令抓包分析
如上图所示,本地调用的网络包与服务器A发送到服务器B的网络包中header相同,但是服务器B调用api的一些参数消失并发现消失参数都具有下划线,猜测与NG配置以及下划线有关
搜查结果
百度搜索得知,NG默认过滤具有下划线的header参数,即 underscores_in_headers 默认为 off。通过修改
接口成功调用!!!!!