1.使用postForObject
1 2 3 4 5 6 7 8 9
| 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);
|
参考文章:
1.Spring之RestTemplate使用小结一
2.RestTemplate post如何传递参数
3.Java RestTemplate post请求传递参数遇到的坑 (这个还是比较详细的)
2.设置请求头
在使用restTemplate获取微服务的请求内容的时候,可以设置请求头的内容,主要分为两种方式:
(1) 使用get方法
1 2 3 4 5 6 7 8 9 10 11 12 13
|
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
| 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);
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);
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无法获取参数解决办法