比自己封装的http工具靠谱,毕竟feign和ribbon也用这个,没有那么多需要考虑的地方,apollo也基于restTemplate封装了一个工具类。默认用的是HttpURLConnection。和okhttp比起来也差不了多少,本人在本地测了一下
import org.springframework.http.*;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
/**
* @author liyhu
* @date 2019年09月06日
*/
public class RestTemplateUtil {
/**
* 实际执行请求的template
*/
private static RestTemplate restTemplate=new RestTemplate();
/**
* json请求
* @param url
* @param entity
* @param cls
* @param <T>
* @return
*/
public static <T>T post(String url, Object entity, Class<T> cls){
HttpEntity<Object> request = new HttpEntity<>(entity);
return executePost(url,request,cls);
}
/**
* 表单请求
* @param url
* @param params
* @param cls
* @param <T>
* @return
*/
public static <T>T formPost(String url, MultiValueMap<String, Object> params, Class<T> cls){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<Object> request = new HttpEntity<>(params,headers);
return executePost(url,request,cls);
}
/**
* post 请求
* @param url
* @param request
* @param cls
* @param <T>
* @return
*/
private static <T>T executePost(String url,HttpEntity<Object> request, Class<T> cls){
ResponseEntity<T> exchange = restTemplate.exchange(url, HttpMethod.POST, request, cls);
return exchange.getBody();
}
/**
* get 请求
* @param url
* @param params
* @param cls
* @param <T>
* @return
*/
public static <T>T get(String url, Map<String,Object> params, Class<T> cls){
StringBuilder urlBuiler=new StringBuilder(url);
urlBuiler.append("?");
if(!CollectionUtils.isEmpty(params)){
for (Map.Entry<String, Object> entry : params.entrySet()) {
urlBuiler.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
return restTemplate.getForObject(urlBuiler.toString(), cls);
}
}