RestTemplate 使用过程中踩过的坑

1.上线在即,但是上游却一直在改动,导致下游很无力。不断去迎合。

(1)第一次修改,因为测试环境的服务器不存在防火墙的问题,所以代码本身是不存在任何问题,但是因为担心(因为有两台服务器。一台作为前端的访问,一台作为后台的处理。并且两台服务器所在的网络层不同,并且在调取上游接口的时候会有防火墙的问题),直接在prod 环境上面进行了测试,发现:写的代码在prod 环境会存在防火墙的问题,导致接口调不通。此前的前台有调上游的接口,第一次修改开始。

直接将前台的接口转发的后台的服务器。然后去调上游的接口,避免了防火墙的问题。此次使用restTemplate 遇到的问题便是:

--如果直接将后台调取上游接口的reponse直接返回给前端服务器。前端服务器会有多了一对双引号的问题。进行数据转换的时候,程序会出现问题。

--解决办法:将后台拿到的数据转换成JSON对象,然后在封装到ResposneEntity里面,然后在返回给前端,即可解决

(2.) 第二次修改。url。 Content_Type  此次修改顺利没有问题

(3.) 第三次修改。url。 request method ;GET  修改完毕后本地进行测试。没有问题。上服务器。发现。在同一个项目里面的代码。(此工程有两处调用上游接口。)之前工程的接口调取正常。但是转发请求的这段代码在请求的时候一直再报502 proxy 的问题。找到头皮发麻依旧没有找到。最后在logback中动了手脚。直接打印详细的http请求。(打印详细日志的办法:

<logger name = "org.springframework">

<level value= "DEBUG"/>

</logger>

<logger name = "org.apache.http">

<level value= "DEBUG"/>

</logger>

)

最终发现,转发请求的时候header里面有好多的不认识的属性。抱着试试的态度。对header进行了重新组装。竟然就这样子成功了。至于是不是restTempalte 的坑。现在也不敢确定。确定的是为了偷懒。直接是把前端请求的header直接接收过来,然后直接使用restTempalte 组装成HttpEntity,然后去调用。导致了此次问题的出现。代码如下。

@PostMapping(path = "/test",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity test(@RequestHeader HttpHeaders httpHeaders, @RequestBody Map<String,String> parameterMap) {
    //因为使用了HttpHeaders 没有对里面的header进行过滤。导致里面有需要无用的信息。
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity httpEntity = new HttpEntity<>(parameterMap,httpHeaders);
    ResponseEntity responseEntity = restTemplate.exchange("url", HttpMethod.GET,httpEntity,String.class);
    return responseEntity;
}

2.restTempalte 发送请求的常用方式:post/get

post:

@PostMapping(path = "/test",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity test(@RequestHeader HttpHeaders httpHeaders, @RequestBody Map<String,String> parameterMap) {
    //因为使用了HttpHeaders 没有对里面的header进行过滤。导致里面有需要无用的信息。
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity httpEntity = new HttpEntity<>(parameterMap,httpHeaders);
    ResponseEntity responseEntity = restTemplate.exchange("url", HttpMethod.POST,httpEntity,String.class);
    return responseEntity;
}

GET:

@PostMapping(path = "/test",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity test(@RequestHeader HttpHeaders httpHeaders, @RequestBody Map<String,String> parameterMap) {
    //因为使用了HttpHeaders 没有对里面的header进行过滤。导致里面有需要无用的信息。
    parameterMap.put("test","123");
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity httpEntity = new HttpEntity<>(parameterMap,httpHeaders);
    String url = "http://localhost:8080/test?userName={test}";
    //map 里面的key与url中大括号内的名称保持一致即可。spring会自动进行组装参数。
    ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET,httpEntity,String.class,parameterMap);
    return responseEntity;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值