RestTemplate是Spirng提供的远程访问http的工具,大幅度降低了提交表单的难度,并附带自动转换JSON的功能。工具底层默认使用SimpleClientHttpRequestFactory作为连接工具,当然也可以通过setRequestFactory进行连接方式覆盖。
方式 | 方法名 |
---|---|
GET | getForentity getForObject |
POST | postForentity postForObject |
PUT | put |
DELETE | delete |
测试之前首先创建一个restful服务
@RestController
public class TestController {
@RequestMapping(value="/test1{test}")
public String getTest1(@RequestParam String test) {
return "this is server source ----" + test;
}
@RequestMapping(value="/test2")
public String getTest2() {
return "this is server source ---- null";
}
}
再创建一个SpringBoot项目
RestTemplate配置类
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate templateConfig() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
//设置连接超时
requestFactory.setConnectTimeout(5000);
//设置请求超时
requestFactory.setReadTimeout(2000);
//设置是否缓存数据,当大量做增加或删除时建议关闭缓存,避免内存耗光
requestFactory.setBufferRequestBody(false);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(requestFactory);
//设置字符集编码
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("utf-8")));
//设置异常处理方式
restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
return restTemplate;
}
}
1、getForEntity 无参数
@Test
public void contextLoads() {
RestTemplate restTemplate = new RestTemplate();
//执行
ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8111/test2", String.class);
//响应体
System.out.println("响应体——"+response.getBody());
//响应码
System.out.println("响应码——"+response.getStatusCode());
//响应头
System.out.println("响应头——"+response.getHeaders());
}
输出结果
响应体——this is server source ---- null
响应码——200 OK
响应头——{Content-Type=[text/plain;charset=UTF-8], Date=[Wed, 23 Oct 2019 02:52:57 GMT], Content-Length=[32]}
1.1、getForEntity 有参数
@Test
public void contextLoads() {
//使用map装载参数
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", "admin");
RestTemplate restTemplate = new RestTemplate();
//执行
ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8111/test1?test={test}", String.class,map);
//响应体
System.out.println("响应体——"+response.getBody());
//响应码
System.out.println("响应码——"+response.getStatusCode());
//响应头
System.out.println("响应头——"+response.getHeaders());
}
输出结果
响应体——this is server source ----admin
响应码——200 OK
响应头——{Content-Type=[text/plain;charset=UTF-8], Date=[Wed, 23 Oct 2019 02:51:08 GMT], Content-Length=[31]}
2、getForObject 有参数
@Test
public void contextLoads() {
//使用map装载参数
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", "admin");
RestTemplate restTemplate = new RestTemplate();
//执行
Object response = restTemplate.getForObject("http://localhost:8111/test1?test={test}", String.class,map);
System.out.println(response);
/*
* //响应体 System.out.println("响应体——"+response.getBody()); //响应码
* System.out.println("响应码——"+response.getStatusCode()); //响应头
* System.out.println("响应头——"+response.getHeaders());
*/
}
执行结果
this is server source ----admin
3、postForEntity 无参数
@Test
public void contextLoads() {
//设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/json;charset=utf-8"));
HttpEntity<String> entity = new HttpEntity<String>(headers);
RestTemplate restTemplate = new RestTemplate();
//执行
ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8111/test2",entity,String.class);
//响应体
System.out.println("响应体——"+response.getBody());
//响应码
System.out.println("响应码——"+response.getStatusCode());
//响应头
System.out.println("响应头——"+response.getHeaders());
}
执行结果
响应体——this is server source ---- null
响应码——200 OK
响应头——{Content-Type=[text/plain;charset=UTF-8], Date=[Wed, 23 Oct 2019 03:29:12 GMT], Content-Length=[32]}
3.1 postForEntity 有参数
@Test
public void contextLoads() {
//设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/json;charset=utf-8"));
//使用map装载参数
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", "admin");
//设置请求体
HttpEntity<String> entity = new HttpEntity<String>(headers);
RestTemplate restTemplate = new RestTemplate();
//执行
ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8111/test1?test={test}",entity,String.class,map);
//响应体
System.out.println("响应体——"+response.getBody());
//响应码
System.out.println("响应码——"+response.getStatusCode());
//响应头
System.out.println("响应头——"+response.getHeaders());
}
执行结果
响应体——this is server source ----admin
响应码——200 OK
响应头——{Content-Type=[text/plain;charset=UTF-8], Date=[Wed, 23 Oct 2019 03:31:06 GMT], Content-Length=[31]}
4、postForObject
@Test
public void contextLoads() {
//设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/json;charset=utf-8"));
//使用map装载参数
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", "admin");
//设置请求体
HttpEntity<String> entity = new HttpEntity<String>(headers);
RestTemplate restTemplate = new RestTemplate();
//执行
String response = restTemplate.postForObject("http://localhost:8111/test1?test={test}",entity,String.class,map);
System.out.println(response);
}
执行结果
this is server source ----admin
1
总结
entity和object两种方法的区别就在于object比entity多出了自动封装成pojo的功能,但object无法处理response中头部、状态码等信息,而entity可以。
5、Exchange
Exchange与其它接口不同的是:允许调用者指定请求的方法,例如:GET POST
现在将服务接口的请求方式设置为POST
设置restTemplate的请求方式为get
//执行
ResponseEntity<String> response = restTemplate.exchange("http://localhost:8111/test1?test={test}",HttpMethod.GET,entity,String.class,map);
结果就报错了,因为请求方式不一致导致报错
org.springframework.web.client.HttpClientErrorException$MethodNotAllowed: 405 null
现在将请求方式改为POST再执行
//执行
ResponseEntity<String> response = restTemplate.exchange("http://localhost:8111/test1?test={test}",HttpMethod.POST,entity,String.class,map);
然后就执行成功了。
PS : 学习记录,若有错误请留言指出 谢谢!