手撸了一个网络请求工具类,开发速度迅速提升了300%( 三 )

  • 假如返回的对象是一个范型,应该怎么处理呢?
在上篇文章中,我们介绍的返回对象都是非范型,例如返回的都是ResponseBean这个业务对象,用法也很简单,以POST请求+JSON提交方式为例,通过如下方式即可实现返回对象的序列化!
ResponseBean responseBean = httpTemplate.postByJson(url, createHeader("testPostByJson"), request, ResponseBean.class);但是,假如返回的对象是ResponseBean<xxx>这样的,通过上面的方式来操作会直接报错!
当遇到返回的对象是范型类型的时候,我们可以这样操作!
【手撸了一个网络请求工具类,开发速度迅速提升了300%】以下面这个/testPostByJsonObj接口为例!
/** * 模拟JSON请求,post方法测试 * @param request * @return */@RequestMapping(value = https://www.isolves.com/it/cxkf/bk/2022-05-11/"testPostByJsonObj", method = RequestMethod.POST)public ResponseBeanObj testPostByJsonObj(@RequestBody RequestBean requestBean,HttpServletRequest request){HttpServletRequestLog.systemLog(request);//范型测试ResponseBean responseBean = new ResponseBean();responseBean.setCode("200000");responseBean.setMsg("responseBean");//范型测试ResponseBeanObj result = new ResponseBeanObj<>();result.setCode("200");result.setMsg("请求成功,方法:testPostByJsonObj,请求参数:" + JSON.toJSONString(requestBean));result.setObj(responseBean);System.out.println(JSON.toJSONString(result));return result;}使用RestTemplate工具发起网络请求,代码如下!
//将返回的范型对象包装到ParameterizedTypeReference对象里面ParameterizedTypeReference<ResponseBeanObj<ResponseBean>> typeRef = new ParameterizedTypeReference<ResponseBeanObj<ResponseBean>>() {};//使用restTemplate发起网络请求ResponseBeanObj<ResponseBean> responseBean = restTemplate.exchange(url, HttpMethod.POST, request, typeRef);采用restTemplate.exchange()方法,即可实现返回对象范型类型的反序列化!
如果使用上面封装的HttpTemplate工具进行操作,也更简单,代码如下:
/** * 模拟JSON提交,post请求,范型返回对象测试 */@Testpublic void testPostByJsonObj(){//请求地址String url = "http://localhost:8080/testPostByJsonObj";//入参RequestBean request = new RequestBean();request.setUserName("唐三藏");request.setUserPwd("123456789");//发送post请求ParameterizedTypeReference<ResponseBeanObj<ResponseBean>> typeRef = new ParameterizedTypeReference<ResponseBeanObj<ResponseBean>>() {};//范型测试ResponseBeanObj<ResponseBean> responseBean = httpTemplate.postByJson(url, createHeader("testPostByJsonObj"), request, typeRef);System.out.println(JSON.toJSONString(responseBean));}三、自定义拦截器在某些场景下,当你使用restTemplate发起网络请求时,所有的请求头部需要带上统一的参数,例如Authorization鉴权码,这个时候改怎么办呢?
可能有的同学,想到的就是在传参数的时候,带上请求头部参数!这种方法也可以解决问题!
有没有好的办法统一入口加入呢?
答案肯定是有的,我们可以利用RestTemplate提供的拦截器链来解决这个问题 。
例如在RestTemplate初始化之后,添加一个拦截器,然后在拦截器的请求头部统一注入鉴权码,就可以轻松实现全局加入某个参数,方式如下!
/** * 初始化RestTemplate * @return */@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());// 添加一个拦截器,在请求头部添加 Authorization 鉴权码restTemplate.getInterceptors().add((request, body, execution) -> {request.getHeaders().add("Authorization", "xxxxxXXXXX");return execution.execute(request, body);});return restTemplate;}四、小结通过本章的讲解,想必读者初步的了解了如何基于RestTemplate做第二次封装,以便于更佳适配当前团队开发人员的习惯 。
RestTemplate的功能其实非常强大,作者也仅仅学了点皮毛,在后续如果有新的功能,也会分享给大家,希望对网友们有所帮助!




推荐阅读