SpringBoot学习记录(九):使用RestTemplate发送http请求详解

RestTemplate简介

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;
	}
}

使用Junit测试

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

SpringBoot学习记录(九):使用RestTemplate发送http请求详解_第1张图片

设置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 : 学习记录,若有错误请留言指出 谢谢!

你可能感兴趣的:(SpringBoot)