spring的RestTemplate使⽤指南
前⾔:现在restful接⼝越来越⼴泛,⽽如今很多接⼝摒弃了传统的配置复杂的webService开发模式,在java领域只需要很简单的springMvc就可以声明为⼀个控制器,再加上service层,就可以直接操作数据库成为⼀个灵活的接⼝。⽽我们请求接⼝的次数也会越来越多(最近我在和⼀个⼯具对接的时候,对⽅公司提供的接⼝全部由我们主动去调⽤),⼀般我们请求接⼝,都采⽤Apache Httpclient⼯具,这个⼯具稳定,既可以建⽴长连接,保持不错的性能,⽽它唯⼀的不⾜就是使⽤起来⿇烦多变,并且要很多层判断处理,今天我要谈的就是spring对httpClient的再封装⼯具类,restTemplate,采⽤模板模式抽象出来的⾼效⼯具。有点类似于jdbcTemplate,今天我们就来⼀步步揭开它的使⽤⽅法
本篇博客的⽬录
⼀:restTemplate简介
⼆:restTemplate配置
三:restTemplat使⽤⽅法-restUtil
四:使⽤⽰例
五:总结
⼀:restTemplate简介
1.1:restTemplate的类结构
可以看出它继承⾃HttpAccessor这个统⼀的处理器,然后再继承⾃InterceptingHttpAccessor,这个拦截转换器,最终RestTemplate实现了封装httpClient的模板⼯具类
1.2:restTemplate的⽅法
Spring⽤于同步客户端HTTP访问的中⼼类。它简化了与HTTP服务器的通信,并执⾏RESTful原则。
它处理HTTP连接,使应⽤程序代码提供URL,使⽤可能的模板变量,并提取结果。
注意:默认情况下,RestTemplate依赖于标准的JDK来建⽴HTTP连接。你可以切换使⽤不同的HTTP库,如Apache HttpComponents,Netty和OkHttp通过setRequestFactory属性。内部模板使⽤HttpMessageConverter实例将HTTP消息转换为POJO和从POJO转换。主要MIME类型的转换器是默认注册的,但您也可以注册其他转换器通过setMessageConverters
以下是http⽅法和restTempalte⽅法的⽐对映射,可以看出restTemplate提供了操作http的⽅法,其中exchange⽅法可以⽤来做任何的请求,⼀般我们都是⽤它来封装不同的请求⽅式。
⼆:restTemplate的配置⽅法
2.1:在springboot中的配置,springboot是⼀款简化传统xml配置式的开发⽅式,主要采⽤注解的⽅式来代替传统繁琐的xml配置,接下来我们就⽤springboot提供的注解来配置restTemplate:
@Configuration
public class RestTemplateConfig {
⾸先解释以下@configuration,它的主要作⽤就是在spring容器启动的时候,初始化IOC,使⽤了这个注解,那么该类就会在spring启动的时候,把@Bean注解标识的类进⾏依赖注⼊。@Bean理解的话,就好⽐在配置⽂件中配置<bean id="xxx">.接下来就是在restTemplate的构造⽅法中添加httpRequest的⼯⼚,使⽤连接池来优化http通信,默认使⽤长连接时间为30秒,再设置路由让http连接定向到指定的IP,然后设置并发数。再就是设置请求配置的超时时间,为了防⽌请求时间过长⽽引起资源的过渡浪费。如果在超过设置的timeout还没有数据返回,就直接断开连接。headers是添加默认的请求头,这⾥设置了传送的格式为json,语⾔为中-英等等属性。ate设置请求头到HttpClient,然后在设置保持的时间,重试的次数,注⼊给httpClient进⾏封装。
在bean中的HttpMessageConverter,就是http信息转换器,它的主要作⽤就是转换和解析返回来的json数据,restTemplate默认使⽤jackson来作为底层的解析⼯具,⽽其它的⽐如Gson,fastjson等等第三⽅开源库放在headers这个list中,如果要使⽤,可以通过以下代码进⾏改变:
final List<HttpMessageConverter<?>> myHttpMessageConverter = new ArrayList<HttpMessageConverter<?>>();
//⾃⼰实现的messgeConverter
HttpMessageConverter<Object> messageConverter = new MyHttpMessageConverter<Object>();
myHttpMessageConverter.add(messageConverter);
三:restUtil⼯具类
restUtil就是通过包装restTemplate暴露出⾯向外界的⽅法,通过⾼度封装,可以隐藏内部细节,简单使⽤,在使⽤它的时候,我们只需要传⼊请求的url和对应的参数,然后就可以取到结果了。参数⼀般有两种形式,⼀种是直接传⼊json,另⼀种是key、value形式的,key/value形式的,可以直接使⽤execute⽅法,传⼊url和请求的⽅法类型就可以了。在开头看到了restTemplate基本上是⽀持所有http请求的,接下来的⼯具类就介绍⼀下post和get请求的主要封装⽅法
@Component
public class RestUtil {
@Autowired
private RestTemplate restTemplate;
//⼀些⾃定义的请求头参数
public static final String supplierID="";
public static final String interfacekey= "";
/**
* DLT专⽤执⾏⽅法
* @param param 请求参数:可以添加⼀些常量请求值
* @param url 访问的url
* @param method 请求的⽅法
* @return
*/
public String execute(Map<String,Object> param, String url, HttpMethod method){
HttpHeaders headers = DefaultHeader();
Map<String,Object> requestor = DefaultParam();
param.put("requestor",requestor);
param.put("supplierID",supplierID);
HttpEntity<Map<String,Object>> requestEntity = new HttpEntity<>(param, headers);
ResponseEntity<String> response = hange(url,method, requestEntity, String.class);
Body();
}
/**
* 获取默认的头请求信息
* @return
*/
public HttpHeaders getDefaultHeader(){
String timestamp = ""+System.currentTimeMillis();
String signature = EncoderByMd5(supplierID + timestamp + interfacekey);
HttpHeaders headers = new HttpHeaders();
headers.add("signature", signature);
headers.add("timestamp", timestamp);
return headers;
}
/**
* 获取默认的参数
* @return
*/
public Map<String,Object> getDefaultParam(){
spring ioc注解Map<String,Object> defParam = new HashMap<>();
defParam.put("invoker","xx");
defParam.put("invoker","xx");
defParam.put("operatorName","xx");
return defParam;
}
/**
* 通过MD5加密
* @param str
* @return
*/
public static String EncoderByMd5(String str){
if (str == null) {
return null;
}
try {
// 确定计算⽅法
MessageDigest md5 = Instance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
/
/ 加密后的字符串
de(md5.Bytes("utf-8"))).toUpperCase();
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { return null;
}
}
/**
* get请求
* @param url 请求的url
* @param jsonData 请求的json
* @return
*/
public String restGet(String url,String jsonData){
return request(url, jsonData,HttpMethod.GET);
}
/**
* @param url 请求的url
* @param jsonData json数据
* @param httpMethod
* @return
*/
private String request(String url, String jsonData,HttpMethod httpMethod) {
ResponseEntity<String> response=null;
try {
if (Check.isEmpty(url)) {
throw new IllegalArgumentException();
}
HttpEntity<String> requestEntity = new HttpEntity<String>(jsonData);
response = hange(url, httpMethod, requestEntity, String.class); }catch (Exception ex){
ex.printStackTrace();
return "";
}
Body().toString();
}
/**
* Get请求获取实体类
* Get请求获取实体类
* @param url 请求的url
* @param responseType 返回的类型
* @param parms 不限定个数的参数
* @param <T> 泛型
* @return
*/
public <T> T getForEntity(String url,Class<T> parms){
return (T) ForEntity(url,responseType,parms);
}
/**
* Get请求
* @param url
* @param parm
* @return
*/
public String get(String url,Map<String,Object> parm){
ForEntity(url,String.class,parm).getBody();
}
}
四:使⽤⽰例
4.1:⾸先我们⽤springBoot来搭建⼀个简单的rest请求链接,我们来模拟⼀个请求,传⼊年龄和性别、⾝⾼,计算出标准体重的接⼝,这段代码⽐较简单,我只给出⽰范代码:
@SpringBootApplication
@RestController
public class HealApplication {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论