当前位置:   article > 正文

【springboot进阶】RestTemplate进阶封装常用请求方式_resttemplate封装

resttemplate封装

目录

一、封装思路

二、GET方式

三、POST方式

form-data

x-www-form-urlencoded

json

四、Header处理

五、完整代码


虽然spring已经帮我们简化了http的请求,但是在实际应用中,我们还是需要写很多重复的代码,显得不够优雅,所以我们还需要对RestTemplate再做一层封装,使外层的调用能够更加的规范和简单。

一、封装思路

我们需要构建一个基类,这个基类封装全部底层基础的请求方法,如GET/POST。

  1. /**
  2. * 封装一些常用的远程调用方法
  3. *
  4. */
  5. public class BackendHttpRequest {
  6. //伪代码
  7. get请求方法
  8. post的json格式请求方法
  9. post的x-www-form-urlencoded格式请求方法
  10. ....
  11. }

将需要远程调用的方法封装在一个service服务类,同时继承上面的基类,这个服务类内部即可调用基类的请求方法。

  1. @Service
  2. class AServiceImpl extends BackendHttpRequest implements AService {
  3. //获取天气数据api
  4. public String getWeatherData(WeatherDataRequestBean params){
  5. //伪代码
  6. //调用基类的getData方法,传入请求api接口地址,并带上参数params
  7. //params内有city城市字段,根据城市名称查询当地天气
  8. String resBody = this.getData(apiUrl, params);
  9. return resBody;
  10. }
  11. }

这样,我们就大概构建了一套请求的规范模型,并使用fastjson序列化传入的bean,下面会具体详细说明实战中如何应用。

二、GET方式

以下具体说明如何调用微信的"公众号的全局唯一接口调用凭据"接口,接口文档

  1. /**
  2. * get请求
  3. *
  4. * @param api 请求url
  5. * @param reqObj 请求request实体
  6. * @return
  7. */
  8. public String getData(String api, Object reqObj) {
  9. return this.getData(api, reqObj, null);
  10. }
  11. /**
  12. * get请求
  13. *
  14. * @param api 请求url
  15. * @param reqObj 请求request实体
  16. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  17. * @return
  18. */
  19. public String getData(String api, Object reqObj, Map<String, String> addHeaders) {
  20. JSONObject params = null;
  21. if (reqObj instanceof JSONObject) {
  22. params = (JSONObject) reqObj;
  23. } else {
  24. params = JSONObject.parseObject(JSON.toJSONString(reqObj));
  25. }
  26. //将map转换为query参数
  27. String queryParams = HttpUtil.toParams(params, Charset.forName("UTF-8"));
  28. String requestUrl = api + "?" + queryParams;
  29. HttpEntity<String> entity = this.getMethodHttpEntity(addHeaders);
  30. ResponseEntity<String> responseEntity = restTemplate.exchange(URI.create(requestUrl), HttpMethod.GET, entity, String.class);
  31. return responseEntity.getBody();
  32. }

同时构建一些公共的方法。 

  1. /**
  2. * 获取get方法的HttpEntity
  3. *
  4. * @param addHeaders 添加的头部
  5. * @return
  6. */
  7. public HttpEntity<String> getMethodHttpEntity(Map<String, String> addHeaders) {
  8. HttpHeaders headers = this.getJsonDataHttpHeaders();
  9. this.addHeaders(headers, addHeaders);
  10. HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
  11. return requestEntity;
  12. }
  13. /**
  14. * 获取json请求头
  15. *
  16. * @return
  17. */
  18. public HttpHeaders getJsonDataHttpHeaders() {
  19. HttpHeaders headers = this.getHttpHeaders(MediaType.APPLICATION_JSON);
  20. return headers;
  21. }
  22. /**
  23. * 获取指定mediaType请求头
  24. *
  25. * @param mediaType
  26. * @return
  27. */
  28. public HttpHeaders getHttpHeaders(MediaType mediaType) {
  29. HttpHeaders headers = new HttpHeaders();
  30. headers.setContentType(mediaType);
  31. return headers;
  32. }

GET方式的封装,重载了两个方法,其中一个方法可以传入自定义的头部参数。

对于请求的参数,统一转变成JSON对象,再使用hutool的工具类HttpUtil,将其转变为query参数形式,即key=value&key=value,最后拼接在url上。

最后,我们使用的是restTemplate.exchange方法,而没有使用getForEntity,是因为之前这里有踩过坑。

  1. @Service
  2. public class TokenServiceImpl extends BackendHttpRequest implements TokenService {
  3. @Override
  4. public AccessTokenResponse accessToken(AccessTokenRequest accessTokenRequest) {
  5. String apiUrl = "https://api.weixin.qq.com/cgi-bin/token";
  6. String resText = this.getData(apiUrl, accessTokenRequest);
  7. if (StrUtil.isNotBlank(resText)) {
  8. AccessTokenResponse response = JSON.parseObject(resText, AccessTokenResponse.class);
  9. return response;
  10. }
  11. return null;
  12. }
  13. }

请求实体

  1. @Data
  2. public class AccessTokenRequest {
  3. @JSONField(name = "appid")
  4. private String appId;
  5. @JSONField(name = "secret")
  6. private String appSecret;
  7. @JSONField(name = "grant_type")
  8. private String grantType;
  9. }

响应实体

  1. @Data
  2. public class AccessTokenResponse {
  3. @JSONField(name = "errcode")
  4. private String errcode;
  5. @JSONField(name = "errmsg")
  6. private String errmsg;
  7. @JSONField(name = "access_token")
  8. private String accessToken;
  9. @JSONField(name = "expires_in")
  10. private Integer expiresIn;
  11. }

三、POST方式

主要对form-data、x-www-form-urlencoded、json等格式分别进行处理。

form-data

  1. /**
  2. * form-data的post请求
  3. *
  4. * @param requestUrl 请求url
  5. * @param reqObj 请求request实体
  6. * @return
  7. */
  8. public String postFormData(String requestUrl, Object reqObj) {
  9. return this.postFormData(requestUrl, reqObj, null);
  10. }
  11. /**
  12. * form-data的post请求
  13. *
  14. * @param requestUrl 请求url
  15. * @param reqObj 请求request实体
  16. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  17. * @return
  18. */
  19. public String postFormData(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
  20. HttpEntity<MultiValueMap<String, Object>> entity = this.getFormRequestHttpEntity(reqObj, MediaType.MULTIPART_FORM_DATA_VALUE, addHeaders);
  21. String resText = restTemplate.postForObject(requestUrl, entity, String.class);
  22. return resText;
  23. }

请求体需要使用MultiValueMap进行封装,构建公共方法将请求bean转换为MultiValueMap。 

  1. /**
  2. * 请求request实体转form-data的map
  3. *
  4. * @param reqObj 请求request实体
  5. * @return
  6. */
  7. public MultiValueMap<String, Object> requestBeanToFormParams(Object reqObj) {
  8. Map<String, Object> params = JSONObject.parseObject(JSON.toJSONString(reqObj), HashMap.class);
  9. MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
  10. for (String key : params.keySet()) {
  11. multiValueMap.add(key, params.get(key));
  12. }
  13. return multiValueMap;
  14. }

x-www-form-urlencoded

  1. /**
  2. * x-www-form-urlencoded的post请求
  3. *
  4. * @param requestUrl 请求url
  5. * @param reqObj 请求request实体
  6. * @return
  7. */
  8. public String postFormUrlencoded(String requestUrl, Object reqObj) {
  9. return this.postFormUrlencoded(requestUrl, reqObj, null);
  10. }
  11. /**
  12. * x-www-form-urlencoded的post请求
  13. *
  14. * @param requestUrl 请求url
  15. * @param reqObj 请求request实体
  16. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  17. * @return
  18. */
  19. public String postFormUrlencoded(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
  20. HttpEntity<MultiValueMap<String, Object>> entity = this.getFormRequestHttpEntity(reqObj, MediaType.APPLICATION_FORM_URLENCODED_VALUE, addHeaders);
  21. String resText = restTemplate.postForObject(requestUrl, entity, String.class);
  22. return resText;
  23. }

方式跟form-data相同,只是header的content-type不相同。

  1. /**
  2. * 获取x-www-form-urlencoded请求头
  3. *
  4. * @return
  5. */
  6. public HttpHeaders getFormUrlencodedHttpHeaders() {
  7. HttpHeaders headers = this.getHttpHeaders(MediaType.APPLICATION_FORM_URLENCODED);
  8. return headers;
  9. }
  10. /**
  11. * 获取form-data请求头
  12. *
  13. * @return
  14. */
  15. public HttpHeaders getFormDataHttpHeaders() {
  16. HttpHeaders headers = this.getHttpHeaders(MediaType.MULTIPART_FORM_DATA);
  17. return headers;
  18. }

json

  1. /**
  2. * json的post请求
  3. *
  4. * @param requestUrl 请求url
  5. * @param reqObj 请求request实体
  6. * @return
  7. */
  8. public String postJsonData(String requestUrl, Object reqObj) {
  9. return this.postJsonData(requestUrl, reqObj, null);
  10. }
  11. /**
  12. * json的post请求
  13. *
  14. * @param requestUrl 请求url
  15. * @param reqObj 请求request实体
  16. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  17. * @return
  18. */
  19. public String postJsonData(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
  20. HttpEntity<String> entity = this.getJsonRequestHttpEntity(reqObj, addHeaders);
  21. String resText = restTemplate.postForObject(requestUrl, entity, String.class);
  22. return resText;
  23. }

json格式的请求只需要将请求体转化为json字符串即可。

  1. /**
  2. * 获取json请求的HttpEntity
  3. *
  4. * @param obj 请求request实体
  5. * @param addHeaders 添加的头部
  6. * @return
  7. */
  8. public HttpEntity<String> getJsonRequestHttpEntity(Object obj, Map<String, String> addHeaders) {
  9. HttpHeaders headers = this.getJsonDataHttpHeaders();
  10. this.addHeaders(headers, addHeaders);
  11. JSONObject params = null;
  12. if (obj instanceof JSONObject) {
  13. params = (JSONObject) obj;
  14. } else {
  15. params = JSONObject.parseObject(JSON.toJSONString(obj));
  16. }
  17. HttpEntity<String> entity = new HttpEntity<>(params.toString(), headers);
  18. return entity;
  19. }

四、Header处理

在请求头的处理中,可以针对jwt进行处理。

  1. /**
  2. * 添加自定义的头部
  3. *
  4. * @param headers
  5. * @param addHeaders
  6. */
  7. public void addHeaders(HttpHeaders headers, Map<String, String> addHeaders) {
  8. if (addHeaders != null) {
  9. for (String key : addHeaders.keySet()) {
  10. if ("Bearer-Auth".equals(key)) {//jwt授权
  11. headers.setBearerAuth(addHeaders.get(key));
  12. continue;
  13. }
  14. headers.set(key, addHeaders.get(key));
  15. }
  16. }
  17. }

我们还可以做一些公共的加密鉴权的方法在这里,这样就不需要每个请求方法都写一遍加密方式。

五、完整代码

  1. public class BackendHttpRequest {
  2. @Resource
  3. RestTemplate restTemplate;
  4. /**
  5. * get请求
  6. *
  7. * @param api 请求url
  8. * @param reqObj 请求request实体
  9. * @return
  10. */
  11. public String getData(String api, Object reqObj) {
  12. return this.getData(api, reqObj, null);
  13. }
  14. /**
  15. * get请求
  16. *
  17. * @param api 请求url
  18. * @param reqObj 请求request实体
  19. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  20. * @return
  21. */
  22. public String getData(String api, Object reqObj, Map<String, String> addHeaders) {
  23. JSONObject params = null;
  24. if (reqObj instanceof JSONObject) {
  25. params = (JSONObject) reqObj;
  26. } else {
  27. params = JSONObject.parseObject(JSON.toJSONString(reqObj));
  28. }
  29. //将map转换为query参数
  30. String queryParams = HttpUtil.toParams(params, Charset.forName("UTF-8"));
  31. String requestUrl = api + "?" + queryParams;
  32. HttpEntity<String> entity = this.getMethodHttpEntity(addHeaders);
  33. ResponseEntity<String> responseEntity = restTemplate.exchange(URI.create(requestUrl), HttpMethod.GET, entity, String.class);
  34. return responseEntity.getBody();
  35. }
  36. /**
  37. * form-data的post请求
  38. *
  39. * @param requestUrl 请求url
  40. * @param reqObj 请求request实体
  41. * @return
  42. */
  43. public String postFormData(String requestUrl, Object reqObj) {
  44. return this.postFormData(requestUrl, reqObj, null);
  45. }
  46. /**
  47. * form-data的post请求
  48. *
  49. * @param requestUrl 请求url
  50. * @param reqObj 请求request实体
  51. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  52. * @return
  53. */
  54. public String postFormData(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
  55. HttpEntity<MultiValueMap<String, Object>> entity = this.getFormRequestHttpEntity(reqObj, MediaType.MULTIPART_FORM_DATA_VALUE, addHeaders);
  56. String resText = restTemplate.postForObject(requestUrl, entity, String.class);
  57. return resText;
  58. }
  59. /**
  60. * x-www-form-urlencoded的post请求
  61. *
  62. * @param requestUrl 请求url
  63. * @param reqObj 请求request实体
  64. * @return
  65. */
  66. public String postFormUrlencoded(String requestUrl, Object reqObj) {
  67. return this.postFormUrlencoded(requestUrl, reqObj, null);
  68. }
  69. /**
  70. * x-www-form-urlencoded的post请求
  71. *
  72. * @param requestUrl 请求url
  73. * @param reqObj 请求request实体
  74. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  75. * @return
  76. */
  77. public String postFormUrlencoded(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
  78. HttpEntity<MultiValueMap<String, Object>> entity = this.getFormRequestHttpEntity(reqObj, MediaType.APPLICATION_FORM_URLENCODED_VALUE, addHeaders);
  79. String resText = restTemplate.postForObject(requestUrl, entity, String.class);
  80. return resText;
  81. }
  82. /**
  83. * json的post请求
  84. *
  85. * @param requestUrl 请求url
  86. * @param reqObj 请求request实体
  87. * @return
  88. */
  89. public String postJsonData(String requestUrl, Object reqObj) {
  90. return this.postJsonData(requestUrl, reqObj, null);
  91. }
  92. /**
  93. * json的post请求
  94. *
  95. * @param requestUrl 请求url
  96. * @param reqObj 请求request实体
  97. * @param addHeaders 添加的头部 如需要使用jwt,key名称需设为"Bearer-Auth"
  98. * @return
  99. */
  100. public String postJsonData(String requestUrl, Object reqObj, Map<String, String> addHeaders) {
  101. HttpEntity<String> entity = this.getJsonRequestHttpEntity(reqObj, addHeaders);
  102. String resText = restTemplate.postForObject(requestUrl, entity, String.class);
  103. return resText;
  104. }
  105. /**
  106. * 请求request实体转form-data的map
  107. *
  108. * @param reqObj 请求request实体
  109. * @return
  110. */
  111. public MultiValueMap<String, Object> requestBeanToFormParams(Object reqObj) {
  112. Map<String, Object> params = JSONObject.parseObject(JSON.toJSONString(reqObj), HashMap.class);
  113. MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
  114. for (String key : params.keySet()) {
  115. multiValueMap.add(key, params.get(key));
  116. }
  117. return multiValueMap;
  118. }
  119. /**
  120. * 获取get方法的HttpEntity
  121. *
  122. * @param addHeaders 添加的头部
  123. * @return
  124. */
  125. public HttpEntity<String> getMethodHttpEntity(Map<String, String> addHeaders) {
  126. HttpHeaders headers = this.getJsonDataHttpHeaders();
  127. this.addHeaders(headers, addHeaders);
  128. HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
  129. return requestEntity;
  130. }
  131. /**
  132. * 获取form请求的HttpEntity
  133. *
  134. * @param reqObj 请求request实体
  135. * @param contentType form请求类型
  136. * @param addHeaders 添加的头部
  137. * @return
  138. */
  139. public HttpEntity<MultiValueMap<String, Object>> getFormRequestHttpEntity(Object reqObj, String contentType, Map<String, String> addHeaders) {
  140. HttpHeaders headers = null;
  141. if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(contentType)) {
  142. headers = this.getFormUrlencodedHttpHeaders();
  143. } else if (MediaType.MULTIPART_FORM_DATA_VALUE.equals(contentType)) {
  144. headers = this.getFormDataHttpHeaders();
  145. }
  146. this.addHeaders(headers, addHeaders);
  147. MultiValueMap<String, Object> multiValueMap = this.requestBeanToFormParams(reqObj);
  148. HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(multiValueMap, headers);
  149. return entity;
  150. }
  151. /**
  152. * 获取json请求的HttpEntity
  153. *
  154. * @param obj 请求request实体
  155. * @param addHeaders 添加的头部
  156. * @return
  157. */
  158. public HttpEntity<String> getJsonRequestHttpEntity(Object obj, Map<String, String> addHeaders) {
  159. HttpHeaders headers = this.getJsonDataHttpHeaders();
  160. this.addHeaders(headers, addHeaders);
  161. JSONObject params = null;
  162. if (obj instanceof JSONObject) {
  163. params = (JSONObject) obj;
  164. } else {
  165. params = JSONObject.parseObject(JSON.toJSONString(obj));
  166. }
  167. HttpEntity<String> entity = new HttpEntity<>(params.toString(), headers);
  168. return entity;
  169. }
  170. /**
  171. * 获取x-www-form-urlencoded请求头
  172. *
  173. * @return
  174. */
  175. public HttpHeaders getFormUrlencodedHttpHeaders() {
  176. HttpHeaders headers = this.getHttpHeaders(MediaType.APPLICATION_FORM_URLENCODED);
  177. return headers;
  178. }
  179. /**
  180. * 获取form-data请求头
  181. *
  182. * @return
  183. */
  184. public HttpHeaders getFormDataHttpHeaders() {
  185. HttpHeaders headers = this.getHttpHeaders(MediaType.MULTIPART_FORM_DATA);
  186. return headers;
  187. }
  188. /**
  189. * 获取json请求头
  190. *
  191. * @return
  192. */
  193. public HttpHeaders getJsonDataHttpHeaders() {
  194. HttpHeaders headers = this.getHttpHeaders(MediaType.APPLICATION_JSON);
  195. return headers;
  196. }
  197. /**
  198. * 获取指定mediaType请求头
  199. *
  200. * @param mediaType
  201. * @return
  202. */
  203. public HttpHeaders getHttpHeaders(MediaType mediaType) {
  204. HttpHeaders headers = new HttpHeaders();
  205. headers.setContentType(mediaType);
  206. return headers;
  207. }
  208. /**
  209. * 添加自定义的头部
  210. *
  211. * @param headers
  212. * @param addHeaders
  213. */
  214. public void addHeaders(HttpHeaders headers, Map<String, String> addHeaders) {
  215. if (addHeaders != null) {
  216. for (String key : addHeaders.keySet()) {
  217. if ("Bearer-Auth".equals(key)) {//jwt授权
  218. headers.setBearerAuth(addHeaders.get(key));
  219. continue;
  220. }
  221. headers.set(key, addHeaders.get(key));
  222. }
  223. }
  224. }
  225. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/302897
推荐阅读
相关标签
  

闽ICP备14008679号