JAVA实现代理转发POST请求并返回参数

实现代理转发POST请求并返回参数

实际开发中有可能会遇到需要使用java做中转代理,由于A客户端想要操作部分数据到C服务器里,C服务器端又没法给A提供一个外网可访问得地址,这样就同步BJAVA端来实现 中中转请求了。

A端-客户端,需要发起请求,查询或者保存数据
B端-转发端,也就是java端,需要做数据得转发
C端-服务端,服务端,用于数据得存储及查询

以下简称ABC端

具体nginx转发请求到具体得路径就不多做解释了,具体配置可自行百度,还是挺多得。

原理上就是 A端发送请求 到 nginx ,然后nginx通过对应得配置,转发到B端做得转发接口地址上,这样再由B端做转发处理到C端后,C端处理数据后,反参通过B端再返回给A端,由于请求体以及反参体具体得属性可能会变动,这样就不能直接写死为具体什么实体,需要通过request来进行取值。

以下是部分代码,这里只贴业务层代码,入口代码基本一样,

 	//地址
    private static final String path = C端得请求地址;
    //key
    private static final String key = C端得权限key;
    //特殊请求头
    private static final String headers = 特别请求头;

    @Autowired
    private RestTemplate restTemplate;

业务层配置基本就这些,需要其他得可自行增减
下边就是具体得转发请求操作

 /**
     * .
     *
     * @param request 入参
     * @param res     入参
     * @return java.lang.Object
     * @Description: 作用:  接口代理,直接转发对应服务平台
     * @Author: LXT
     * @Date: 2023/1/30 9:57
     */
    public Object proxy(HttpServletRequest request, HttpServletResponse res) {
        String url = C端得请求地址+ C端得权限key;
        logger.info("代理转发路径为" + url);
        Object postObject = post(url, request);
        logger.info("代理返回的结果---{}" + postObject);
        return postObject;
    }

这里主要是对应控制层得接口,然后打印下基本日志参数

下边是具体得post请求方法

  /**
     * .
     *
     * @param url     入参
     * @param request 入参
     * @return java.lang.Object
     * @Description: 作用:  发送post请求
     * @Author: LXT
     * @Date: 2023/1/30 9:57
     */
    public Object post(String url, HttpServletRequest request) {
        try {
            //获取请求参数
            JSONObject parameters = getParameters(request);
            logger.info("代理请求接收到的参数" + JSON.toJSONString(parameters));

            restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));

            // 获取到请求头
            Enumeration<String> headerNames = request.getHeaderNames();
            HttpHeaders headers = new HttpHeaders();
            Map<String, String> headerMap = new HashMap<>();
            while (headerNames.hasMoreElements()) {
                String headerName = headerNames.nextElement();
                String header = request.getHeader(headerName);
                headerMap.put(headerName, header);
                headers.add(headerName, header);
            }
            //增加其他请求头
            headers.add(特殊得请求头, 特殊得请求头参数);

            logger.info("代理请求发送的header{}" + headers);
            // 构造HttpEntity,新请求会携带本次请求的请求头
            HttpEntity<JSONObject> entity = new HttpEntity<>(parameters, headers);
            long currentTimeMillis = System.currentTimeMillis();
            // 如遇到转换解析问题,可增加相应的解析类
            ///qq_42026590/article/details/127851421
            ResponseEntity<Object> response = restTemplate.exchange(url, HttpMethod.POST, entity, Object.class);
            logger.info(url, parameters, response.getBody(), System.currentTimeMillis() - currentTimeMillis);
            Object body = response.getBody();
            return body;
        } catch (Exception e) {
            logger.error("请求出错! \n    url:{}\n    req:{}", url, e);
            return null;
        }
    }

其实和发送post基本一样,就请求体是request里去取, 反参也变成超类 object,

 /**
     * .
     *
     * @param request 入参
     * @return com.alibaba.fastjson.JSONObject
     * @Description: 作用:  获取参数
     * @Author: LXT
     * @Date: 2023/1/30 9:58
     */
    public static JSONObject getParameters(HttpServletRequest request) {
        try {
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
            StringBuilder responseStrBuilder = new StringBuilder();
            String inputStr;
            while ((inputStr = streamReader.readLine()) != null)
                responseStrBuilder.append(inputStr);
            JSONObject jsonObject = JSONObject.parseObject(responseStrBuilder.toString());
            return jsonObject;
        } catch (Exception e) {
            logger.error("获取json参数失败", e);
            return null;
        }
    }

header里如需要特殊得参数 ,也可再B端进行增加,
获取到得参数是 JSONObject , 然后放入 HttpEntity 里 这样发送到C端就可以了

这样由A端发起得请求,经过B端nginx转发到B端得业务代码里,B端再拿到参数后,再发起请求到C端,等C端处理后,结果返回B端,B端将报文返回到A端,整个流程就可以了

这只是发送和返回均为 json 格式得报文 , 文件流了等其他格式还有待研究,后续慢慢更新,

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值