Spring Boot之RestTemplate

标签: 无 分类: 未分类 创建时间:2020-02-12 08:53:13 更新时间:2024-11-15 10:49:43

1.使用postForObject

1
2
3
4
5
6
7
8
9
// 挑选符合medium类型的站点进行信息查询,非此类型的不进行查询
ServiceInstance serviceInstance = loadBalancerClient.choose("phemsjava");
String url = serviceInstance.getUri() + "/api/filterSiteByMedium";
RestTemplate restTemplate = new RestTemplate();
MultiValueMap<String, String> request = new LinkedMultiValueMap<>();
request.add("sitenolist", sitenolist);
request.add("medium_type", mediumtype);
List result = restTemplate.postForObject(url, request,List.class);

2.设置请求头

在使用restTemplate获取微服务的请求内容的时候,可以设置请求头的内容,主要分为两种方式:

(1) 使用get方法

1
2
3
4
5
6
7
8
9
10
11
12
13
// 使用get方法
//设置get请求参数
Map<String,String> params = new HashMap<>();
params.put("orgCode","900000");
params.put("waybillNo","773011197999686");
//设置请求头参数
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("appId", "app_service");

HttpEntity request = new HttpEntity(requestHeaders);

ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET,request, String.class, params);
System.out.println(exchange.getBody());

(2) 使用post方法

1
2
3
4
5
6
7
8
// 使用post方法
String url = "http://url:port/arius/_sql";
String postBody = "select count(*) from monitor";
HttpHeaders headers = new HttpHeaders();
headers.add("User-Agent", "curl/7.58.0");
HttpEntity<String> entity = new HttpEntity<>(postBody, headers);
ResponseEntity<JSONObject> response = restTemplate.postForEntity(url, entity, JSONObject.class);
System.out.println(response.getBody().toJSONString());
参考文章:
1.RestTemplate 中设置 header 以及使用 HTTP 基本认证的方法 (这里将的是post方式)
2.resttemplate 发送带header的get请求 (这里有两种方法,其实我觉得可以归结为一种方法,就是构造h)

3.401、400错误

当使用restTemplate.postForObject进行请求调用的时候,如果返回的body是一个null,或者状态码是一个401,就有可能报错,这个时候如果想获取到错误消息,而不是直接就跳到catch代码块中,如果做呢?

参考文章:
1.springboot使用RestTemplate返回401时 HttpClientErrorException报错问题及解决方法 (这篇文章使用了try…catch进行了错误的捕获 )
2.关于Java:带有参数的Spring RestTemplate HTTP Post导致400错误的请求错误
3.使用RestTemplate 请求,接口返回400+或500+不抛出异常的方法 1.errorHandler在处理异常时不处理,替换默认的抛出异常操作;2.自定义返回的ResponseEntity,擦除返回值类型;3.自定义数据抽取器,如果body正常解析不成功,就使用自定义的返回Entity,把返回值直接以String形式放到body中; 4.创建RestTemplate代理,使用自定义的收据抽取器。感觉非常的复杂,还是使用try catch简单

4.参数接收不到

发送参数并添加header的错误代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 发送自动通知
ServiceInstance serviceInstance = loadBalancerClient.choose("databases");

String url = serviceInstance.getUri() + "/wx/sendMsgTimed";
RestTemplate restTemplate = new RestTemplate();
// 拼接发送内容
JSONObject post=new JSONObject();
post.put("templateid","DrhF7FOngRmQxYXFb5MzP8CSZtDVaXWtubkI2cYL15E");
post.put("siteno",siteno);

// 请求头设置,x-www-form-urlencoded格式的数据
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

// 组装请求体
HttpEntity<String> request =new HttpEntity<String>(JSONObject.toJSONString(post), headers);
JSONObject sendResult = restTemplate.postForObject(url, request,JSONObject.class);

使用LinkedMultiValueMap和HttpEntity进行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 拼接发送内容
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
paramMap.add("templateid","DrhF7FOngRmQxYXFb5MzP8CSZtDVaXWtubkI2cYL15E");
paramMap.add("siteno",String.valueOf(siteno));

String dbalias=loginUserHolder.getDbname();
paramMap.add("dbalias",dbalias);

String templateparams="";
paramMap.add("templateparams",templateparams);

// 请求头设置,x-www-form-urlencoded格式的数据
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

// 组装请求体
HttpEntity<MultiValueMap> request =new HttpEntity<MultiValueMap>(paramMap, headers);

JSONObject sendResult = restTemplate.postForObject(url, request,JSONObject.class);
参考文章:
1.RestTemplate post请求 Controller 接收不到值的解决方案 postForObject方法源码解析 Object request => 请求的body 这个参数需要再controller类用 @RequestBody 注解接收
2.Spring RestTemplate post无法获取参数解决办法
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。