Spring RestTemplate发送Http请求

       借助 RestTemplate,Spring应用能够方便地使用REST资源 Spring的 RestTemplate访问使用了模版方法的设计模式.模版方法将过程中与特定实现相关的部分委托给接口,而这个接口的不同实现定义了接口的不同行为.RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。 

1. getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象。getForEntity方法的返回值是一个ResponseEntity<T>ResponseEntity<T>是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。

 RestTemplate restTemplate = new RestTemplate();
 ResponseEntity<String> responseEntity = restTemplate.getForEntity("url", String.class);
 //获取消息头
 HttpHeaders headers = responseEntity.getHeaders();
 //判断请求状态码
 if(responseEntity.getStatusCodeValue() == 200) {
 //获取消息体
     String body = responseEntity.getBody();
     JSONObject object = JSONObject.parseObject(body);
     String bookName = object.getString("bookName");
     //do something...
  }

2. getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象,getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject。

RestTemplate restTemplate = new RestTemplate();
//将返回的消息体封装成Book对象
Book book = restTemplate.getForObject("url", Book.class);
String bookName = book.getBookName();
//do something...

3. postForEntity()  POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的

RestTemplate restTemplate = new RestTemplate();
//设置类型
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap params = new LinkedMultiValueMap();
params.put("bookName", "MultiValueMap");
HttpEntity<MultiValueMap> requestEntity = new HttpEntity<>(params, headers);
//  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
ResponseEntity<String> responseEntity = restTemplate.postForEntity("url",requestEntity,String.class);
if(responseEntity.getStatusCodeValue() == 200) {
    //do something...
}

4. postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象,和get方法基本类似

RestTemplate restTemplate = new RestTemplate();
//发送自定义参数
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap params = new LinkedMultiValueMap();
params.put("bookName", "MultiValueMap");
HttpEntity<MultiValueMap> requestEntity = new HttpEntity<>(params, headers);
//  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
Book book = restTemplate.postForObject("url", requestEntity, Book.class);
//do something...

5.可能会碰上返回体中文乱码的问题,解决如下:

RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
converterList.remove(1);    //移除StringHttpMessageConverter
HttpMessageConverter<?> converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converterList.add(1, converter);    //convert顺序错误会导致失败
restTemplate.setMessageConverters(converterList);
//do something...

猜你喜欢

转载自blog.csdn.net/qq_22200097/article/details/82621471