alibaba的csb使用HttpParameters.Builder 发送请求时通过NGINX时,一些参数消失

问题描述

当使用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。通过修改

接口成功调用!!!!!

posted @ 2022-09-04 23:27  keacua  阅读(983)  评论(0)    收藏  举报