不说废话,先贴代码:
网上好多代码放到自己机器上错误一大堆,今天刚好有空就自己写了http工具类,下面代码都是基于SpringBoot环境的(RestTemplate类在spring-boot-starter-web包里面),大家可以根据自己情况自行改变…
(1)RestTemplate实例的配置类:
@Configuration
public class RestConfig {
public RestConfig(){
System.out.println("RestConfig已配置");
}
@Bean
public RestTemplate restTemplate(){
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
//连接20秒超时
requestFactory.setConnectTimeout(GlobalConfig.HTTP_CONN_TIME_OUT*1000);
//读数20秒超时
requestFactory.setReadTimeout(GlobalConfig.HTTP_READ_TIME_OUT*1000);
return new RestTemplate(requestFactory);
}
//下面也可以配置连接数量、并发数等配置,就不具体展开了
}
(2)然后就可以直接开始写发起get和post连接的代码:
@Component
public class RestTemplateUtil {
@Autowired
private RestTemplate restTemplate;
private static RestTemplate request;
@PostConstruct
public void init() {
request = restTemplate;
}
/**
* @return 泛型T
* @Description get请求
* @Date 2020-04-11
*/
public static <T> T requestForGet(String url, Map<String, Object> params, Class<T> clazz) throws Exception{
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "application/json");
headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<T> response;
try {
response = request.exchange(url, HttpMethod.GET, requestEntity, clazz, params);
} catch (Exception e) {
throw new Exception("资源链接访问异常");
}
return response.getStatusCode().is2xxSuccessful() ? response.getBody() : null;
}
/**
* @return 泛型T
* @Description post请求
* @Date 2020-04-11
*/
public static <T> T requestForPost(String url, Map<String, Object> params, Class<T> clazz){
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE));
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(params, headers);
ResponseEntity<T> response = null;
response = request.exchange(url, HttpMethod.POST, requestEntity, clazz);
return response.getStatusCode().is2xxSuccessful() ? response.getBody() : null;
}
}
解释:
上面两个方法怎么传参数:
(1)现在需要获取连接http://localhost:9090/ad/test返回的内容,get方式,没有参数:
因为这个链接返回的是Response数据类型,因此还需要自定义一个Response类:
public class Response<T extends Object> {
private int returnValue;
private String returnMsg;
private T returnData;
public int getReturnValue() {
return returnValue;
}
public void setReturnValue(int returnValue) {
this.returnValue = returnValue;
}
public String getReturnMsg() {
return returnMsg;
}
public void setReturnMsg(String returnMsg) {
this.returnMsg = returnMsg;
}
public T getReturnData() {
return returnData;
}
public void setReturnData(T returnData) {
this.returnData = returnData;
}
}
String url="http://localhost:9090/ad/test";
Map<String,Object> params=new HashMap<>();
Response response = RestTemplateUtil.requestForGet(url,params,Response.class);
注意:上面链接不需要传参数,也不能在params这个位置传一个null,必须传一个Map的对象,不然会报错。
(2)现在需要获取连接http://localhost:9090/ad/test?name=qz&&age=18返回的内容,get方式,有参数(后台代码对应用@RequestParam注解接收参数):
String url="http://localhost:9090/ad/test?name={name}&age={age}";
Map<String,Object> params=new HashMap<>();
params.put("name","qz");
params.put("age",18);
Response response = RestTemplateUtil.requestForGet(url,params,Response.class);
注意:上面链接需要传参数,但是不能直接把url写成http://localhost:9090/ad/test?name=qz&&age=18,需要像上面那样在链接中提供参数占位符,然后把参数添加在Map当中,不然会提示找不到参数。
(3)现在需要获取连接http://localhost:9090/ad/test返回的内容,post方式,没有参数,与(1)一样,把调用的方法换成requestForPost就行了。
(4)现在需要获取连接http://localhost:9090/ad/test返回的内容,post方式,有参数(后台代码对应用@RequestBody注解接收参数),这个与(2)不一样,不需要参数占位符。
String url="http://localhost:9090/ad/test";
Map<String,Object> params=new HashMap<>();
params.put("name","qz");
params.put("age",18);
Response response = RestTemplateUtil.requestForGet(url,params,Response.class);
注:(1)requestForPost方法中有一行params.forEach(postParams::add);
是用Lambda方式将params中的K,V添加到postParams当中,需要JDK8以上支持,否则直接用iterator一个一个迭代添加吧。
(2)requestForPost方法中有一行headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
设置请求头参数类型和字符集,这个加上会报错,需注意,我已经将这一行注释。