可以发送请求的方式有很多,RestTemplate是从spring3.0开始支持的一个http请求工具,提供了常见的REST请求方案模板,GET,POST,PUT,DELETE请求,以及一些通用的请求执行方法exchange
1. 添加配置,注入restTemplate的Bean
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
RestTemplate restTemplate = new RestTemplate(factory);
// 支持中文编码
restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(Charset.forName("UTF-8")));
return restTemplate;
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//单位为ms
factory.setConnectTimeout(5000);//单位为ms
return factory;
}
}
2. 常用的一些请求
Get请求
常用的get请求有两种,getForObject和geForEntity,这两种类型在使用的时候需要注意接口返回的数据的类型和接收的类型要匹配
没有请求参数
请求参数类型为(utl,接收响应数据的数据类型)
//使用getForEntity请求的格式
ResponseEntity<Object> response = restTemplate.getForEntity("http://localhost:8090/two", Object.class);
//使用getForObject请求的格式
User string = restTemplate.getForObject("http://localhost:8090/two", User.class);
使用请求参数除了上述参数,还可以添加拼接在请求url上的参数
Map<String, String> params = new HashMap<>();
params.put("name","zhangsan");
params.put("pwd","123");
//使用getForEntity请求的格式
ResponseEntity<Object> response = restTemplate.getForEntity("http://localhost:8090/two?name={name}&password={pwd}", Object.class,params);
Post请求
常用的post请求有三种,除了和get相同的两种请求之外,还有一种是postForLaction,返回一个Uri,postForLaction的用法,还没搞明白,等弄明白了,再过来补充资料
//使用getForEntity请求的格式
ResponseEntity<User> response = restTemplate.postForEntity("http://localhost:8090/two?name={name}",new User("aaa","bbb"), User.class,params);
//使用getForObject请求的格式
User string = restTemplate.postForObject("http://localhost:8090/two",user,User.class);
Exchange请求
使用exchange方式请求的好处是比较灵活,我们可以根据自己的需要定制请求的内容
User user = new User("ccc", "ddd");
//使用exchange请求,在httpEntity中需要传入两个参数
//一个为请求体,一个为请求头,在请求头中可以设置请求相关的一些信息
//在请求体中添加请求参数,请求头中也可以参数,与请求体携带的参数互不干扰
HttpEntity httpEntity = new HttpEntity(user,new HttpHeaders());
ResponseEntity<String> exchange = restTemplate.exchange("http://localhost:8090/two?name={name}", HttpMethod.POST, httpEntity, String.class,params);
对请求头进行一定的设置
User user = new User("张三","qwe123");
//创建请求头
HttpHeaders headers = new HttpHeaders();
//设置内容为application/json,在开始的时候是可以在此处设置编码格式,
//但是现在已经被启用,官方给出的解释是主流的浏览器已经支持UTF-8,所以不用再设置
//内容类型可以使用httpServletRequest.getHeader("Content-Type")进行获取
headers.setContentType(MediaType.APPLICATION_JSON);
//虽然不需要设置默认的编码格式,但是如果我们需要携带编码信息,可以在AcceptCharset中添加,支持添加多个
//如果要取出则可以在请求头中httpServletRequest.getHeader("Accept-charset")中取出
Charset charset = Charset.forName("GB2312");
Charset charset1 = Charset.forName("GBk");
List<Charset> charsets = new ArrayList<>();
charsets.add(charset);
charsets.add(charset1);
headers.setAcceptCharset(charsets);
//如果需要添加token则可以使用如下方式
List<String> cookies = new ArrayList<>();
cookies.add("cookies1=111111111");
cookies.add("cookies2=222222222");
cookies.add("cookies3=333333333");
headers.put(HttpHeaders.COOKIE,cookies);
//除此之外,可以在请求头中添加一些请求信息
headers.add("aa","aaaa");
HttpEntity entity = new HttpEntity(user, headers);
ResponseEntity<User> exchange = restTemplate.exchange("http://localhost:8090/two", HttpMethod.POST, entity, User.class);