SpringBoot系列之RestTemplate使用示例

x33g5p2x  于2022-05-05 转载在 Spring  
字(28.7k)|赞(0)|评价(0)|浏览(487)

博主之前经常对接一些接口,所以发现写一些http请求比较麻烦,学习springboot的过程知道可以用RestTemplate来做http请求,RestTemplateSpring Framework框架封装的基于模板方法设计模式的一个工具类,带有同步模板方法 API 的原始 Spring REST客户端类,下面博主分析一些对接过程的一些经验,RestTemplate基本使用可以参考官网文档:https://docs.spring.io/spring-framework/docs/5.1.6.RELEASE/spring-framework-reference/integration.html#rest-client-access

下面分析一些例子,先要进行环境准备:

  • 开发环境

  • JDK 1.8

  • SpringBoot2.2.1

  • Maven 3.2+

  • 开发工具

  • IntelliJ IDEA

  • smartGit

  • Navicat15

在IDEA里集成阿里的https://start.aliyun.com,创建一个Spring Initializr项目:

选择jdk版本,和maven打包方式

选择需要的dependencies

项目建好之后,可以对RestTemplate进行一些自定义的设置,比如可以拓展一下ClientHttpRequestInterceptor,做一些自己的拦截,打印一些日志

  1. package com.example.resttemplate.configuration;
  2. import cn.hutool.core.convert.Convert;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.http.HttpRequest;
  5. import org.springframework.http.client.ClientHttpRequestExecution;
  6. import org.springframework.http.client.ClientHttpRequestInterceptor;
  7. import org.springframework.http.client.ClientHttpResponse;
  8. import java.io.IOException;
  9. @Slf4j
  10. public class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
  11. @Override
  12. public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
  13. trackRequest(httpRequest , bytes);
  14. ClientHttpResponse httpResponse = clientHttpRequestExecution.execute(httpRequest , bytes);
  15. trackResponse(httpResponse);
  16. return httpResponse;
  17. }
  18. private void trackRequest(HttpRequest httpRequest, byte[] bytes) {
  19. log.info("=======================request start=================================================");
  20. log.info("Headers : {}", httpRequest.getHeaders());
  21. log.info("Request URI : {}", httpRequest.getURI());
  22. log.info("Request Method : {}", httpRequest.getMethod());
  23. log.info("Request Body : {}" , Convert.toStr(bytes));
  24. log.info("=======================request end=================================================");
  25. }
  26. private void trackResponse(ClientHttpResponse httpResponse) throws IOException {
  27. log.info("=======================response start=================================================");
  28. log.info("Status code : {}", httpResponse.getStatusCode());
  29. log.info("Status text : {}", httpResponse.getStatusText());
  30. log.info("Headers : {}", httpResponse.getHeaders());
  31. log.info("=======================response end=================================================");
  32. }
  33. }

自定义RestTemplateCustomizer类:

  1. package com.example.resttemplate.configuration;
  2. import org.springframework.boot.web.client.RestTemplateCustomizer;
  3. import org.springframework.web.client.RestTemplate;
  4. public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {
  5. @Override
  6. public void customize(RestTemplate restTemplate) {
  7. restTemplate.getInterceptors().add(new CustomClientHttpRequestInterceptor());
  8. }
  9. }

写一个RestTemplate的配置类,注意需要加上RestTemplate@Bean,我们在项目里才能使用@Autowired RestTemplate restTemplate;直接调用,@DependsOn是一个Spring框架底层的注解,会禁用RestTemplate默认的RestTemplateBuilder类,可以不加上

  1. package com.example.resttemplate.configuration;
  2. import org.springframework.boot.web.client.RestTemplateBuilder;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.context.annotation.DependsOn;
  6. import org.springframework.http.client.ClientHttpRequestFactory;
  7. import org.springframework.http.client.SimpleClientHttpRequestFactory;
  8. import org.springframework.web.client.RestTemplate;
  9. @Configuration
  10. public class RestTemplateConfiguration {
  11. @Bean
  12. public CustomRestTemplateCustomizer customRestTemplateCustomizer() {
  13. return new CustomRestTemplateCustomizer();
  14. }
  15. @Bean
  16. @DependsOn(value = {"customRestTemplateCustomizer"})
  17. public RestTemplateBuilder restTemplateBuilder() {
  18. return new RestTemplateBuilder(customRestTemplateCustomizer());
  19. }
  20. @Bean
  21. public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
  22. SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
  23. //单位为ms
  24. factory.setReadTimeout(5000);
  25. //单位为ms
  26. factory.setConnectTimeout(5000);
  27. return factory;
  28. }
  29. @Bean
  30. public RestTemplate restTemplate(RestTemplateBuilder builder ,ClientHttpRequestFactory factory ) {
  31. RestTemplate restTemplate = builder.build();
  32. restTemplate.setRequestFactory(factory);
  33. return restTemplate;
  34. }
  35. }

下面给出一个简单的例子,先写一个用户dto类:

  1. package com.example.resttemplate.model;
  2. import lombok.Data;
  3. @Data
  4. public class UserDto {
  5. private Integer id;
  6. private String login;
  7. private String name;
  8. private String company;
  9. private String location;
  10. private String email;
  11. }

通过restTemplate直接请求GitHub的用户api接口,写法是不是比自己写http的工具类,简洁很多了?

  1. package com.example.resttemplate.controller;
  2. import com.example.resttemplate.model.UserDto;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import org.springframework.web.client.RestTemplate;
  8. @RestController
  9. public class SampleController {
  10. @Autowired
  11. RestTemplate restTemplate;
  12. @GetMapping(value = "/users/{login}")
  13. public UserDto getUser(@PathVariable("login")String login) {
  14. String url = new StringBuilder()
  15. .append("https://api.github.com/users/")
  16. .append(login)
  17. .toString();
  18. UserDto userDto = restTemplate.getForObject(url , UserDto.class , "");
  19. return userDto;
  20. }
  21. }

在Linux里调用接口curl http://127.0.0.1:8080/users/mojombo

getForEntity的例子,返回ResponseEntity

  1. MultiValueMap<String, Object> uriVariables = new LinkedMultiValueMap<String, Object>();
  2. ResponseEntity<String> responseEntity = restTemplate.getForEntity(apprWritUrl, String.class, uriVariables);
  3. logger.info("statusCode:{},responBody:{}", responseEntity.getStatusCode().value(), responseEntity.getBody());
  4. if (responseEntity.getStatusCode().value() == 200) {
  5. logger.info("调用成功!");
  6. // 业务处理
  7. }

postForEntity的例子

  1. HttpHeaders headers = new HttpHeaders();
  2. MultiValueMap<String,Object> params = new LinkedMultiValueMap<String, Object>(16) ;
  3. params.set("attachId",attachSeq);
  4. params.set("seq",seq);
  5. HttpEntity<MultiValueMap<String,Object>> requestEntity = new HttpEntity<MultiValueMap<String,Object>>(params, headers);
  6. ResponseEntity<String> entity = restTemplate.postForEntity("", requestEntity, String.class);

也可以使用restTemplate.exchange的方法,这个方法需要指定请求方式,比如HttpMethod.GET

  1. final String reqUrl = "url";
  2. HttpEntity<String> httpEntity = this.getHttpEntity();
  3. ResponseEntity<String> responseEntity = restTemplate.exchange(reqUrl, HttpMethod.GET , httpEntity, String.class);
  4. logger.info("statusCode:{},responseBody:{}", responseEntity.getStatusCode().value(), responseEntity.getBody());

上传文件的例子,需要使用FileSystemResource封装一下

  1. RestTemplate restTemplate = new RestTemplate();
  2. FileSystemResource resource = new FileSystemResource(new File("D:\\test.txt"));
  3. MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
  4. param.add("file", resource);
  5. param.add("fileName", "test.txt");
  6. Object object = restTemplate.postForObject("http://127.0.0.1:8101/api/attachment/upload", param, Object.class);

对接有时候需要在请求头加很多校验参数,现在比较流行的是在网关里校验,下面是封装的方法,可以参考

  1. /**
  2. * 构建HttpEntity
  3. * @Author nicky
  4. * @Date 2020/10/21 11:36
  5. * @Param []
  6. * @return org.springframework.http.HttpEntity<java.lang.String>
  7. */
  8. protected HttpEntity<String> getHttpEntity() throws Exception {
  9. final String passToken = "passToken";
  10. long now = new Date().getTime();
  11. String timestamp = Long.toString((long) Math.floor(now / 1000));
  12. String nonce = Long.toHexString(now) + "-" + Long.toHexString((long) Math.floor(Math.random() * 0xFFFFFF));
  13. String signature= Signature.toSHA256(timestamp + passToken + nonce + timestamp);
  14. HttpHeaders headers = new HttpHeaders();
  15. headers.add("appid", "appid");
  16. headers.add("serviceId","serviceId");
  17. headers.add("signature", signature);
  18. headers.add("timestamp", timestamp);
  19. headers.add("nonce", nonce);
  20. headers.add("Content-Type", "application/json");
  21. headers.add("Cache-Control", "no-cache");
  22. HttpEntity<String> httpEntity = new HttpEntity<String>(null, headers);
  23. return httpEntity;
  24. }

有时候对接,需要在postman里,很多参数都是动态的,我们可以写postman得一些脚本来测试

脚本参考,对接这个时间戳timestamp有时需要注意一些,要确定是毫秒的还是秒的的,参考博客:java时间戳 10位和13位分别是怎么来的?

  1. var timestamp = (Date.now()/1000).toFixed()
  2. var token=''
  3. var nonce= Math.floor(Math.random() * 10000000000)
  4. var appid=''
  5. var signature = CryptoJS.SHA256(timestamp + token + nonce + timestamp).toString(CryptoJS.enc.Hex).toUpperCase()
  6. pm.globals.set("variable_key", "variable_value");
  7. postman.setGlobalVariable("signature", signature);
  8. postman.setGlobalVariable("timestamp", timestamp);
  9. postman.setGlobalVariable("nonce", nonce);
  10. postman.setGlobalVariable("appid", appid);

博主对接过一些接口,需要一些签名加密的,下面给出一些工具类,参考,提高联调速度

  1. import java.security.MessageDigest;
  2. /**
  3. * <pre>
  4. * sha256签名算法
  5. * </pre>
  6. */
  7. public class Signature {
  8. public static String toSHA256(String str) throws Exception {
  9. MessageDigest messageDigest;
  10. String encodeStr = "";
  11. try {
  12. messageDigest = MessageDigest.getInstance("SHA-256");
  13. messageDigest.update(str.getBytes("UTF-8"));
  14. encodeStr = byte2Hex(messageDigest.digest());
  15. } catch (Exception e) {
  16. throw e;
  17. }
  18. return encodeStr;
  19. }
  20. // byte转换成16进制
  21. protected static String byte2Hex(byte[] bytes) {
  22. StringBuffer stringBuffer = new StringBuffer();
  23. String temp = null;
  24. for (int i = 0; i < bytes.length; i++) {
  25. temp = Integer.toHexString(bytes[i] & 0xFF);
  26. if (temp.length() == 1) {
  27. stringBuffer.append("0");
  28. }
  29. stringBuffer.append(temp);
  30. }
  31. return stringBuffer.toString();
  32. }
  33. }

sha1加密,这个是对接企业微信时候用到

  1. /**
  2. * sha1加密 <br>
  3. * @Author nicky
  4. * @Date 2021/04/26 10:22
  5. * @Param [str]
  6. * @return java.lang.String
  7. */
  8. public static String sha1Digest(String str) {
  9. try {
  10. // SHA1签名生成
  11. MessageDigest md = MessageDigest.getInstance("SHA-1");
  12. md.update(str.getBytes());
  13. byte[] digest = md.digest();
  14. StringBuffer hexstr = new StringBuffer();
  15. String shaHex = "";
  16. for (int i = 0; i < digest.length; i++) {
  17. shaHex = Integer.toHexString(digest[i] & 0xFF);
  18. if (shaHex.length() < 2) {
  19. hexstr.append(0);
  20. }
  21. hexstr.append(shaHex);
  22. }
  23. return hexstr.toString();
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. return null;
  27. }
  28. }
  29. /**
  30. * <h2>对所有待签名参数按照字段名的ASCII 码从小到大排序</h2>
  31. * @Author nicky
  32. * @Date 2021/04/25 20:22
  33. * @Param [params]
  34. * @return java.lang.String
  35. */
  36. public static String sortSignByASCII(SortedMap<String , String> parameters) {
  37. // 以k1=v1&k2=v2...方式拼接参数
  38. StringBuilder builder = new StringBuilder();
  39. for (Map.Entry<String, String> s : parameters.entrySet()) {
  40. String k = s.getKey();
  41. String v = s.getValue();
  42. // 过滤空值
  43. if (StringUtils.isBlank(v)) {
  44. continue;
  45. }
  46. builder.append(k).append("=").append(v).append("&");
  47. }
  48. if (!parameters.isEmpty()) {
  49. builder.deleteCharAt(builder.length() - 1);
  50. }
  51. return builder.toString();
  52. }

网上复制的工具类,稍作修改

  1. package com.example.resttemplate.util;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Qualifier;
  5. import org.springframework.http.HttpEntity;
  6. import org.springframework.http.HttpHeaders;
  7. import org.springframework.http.HttpMethod;
  8. import org.springframework.http.ResponseEntity;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.client.RestClientException;
  11. import org.springframework.web.client.RestTemplate;
  12. import java.util.Map;
  13. @Slf4j
  14. @Component
  15. public class RestTemplateUtils {
  16. @Autowired
  17. @Qualifier("restTemplate")
  18. private RestTemplate restTemplate;
  19. /**
  20. * GET请求调用方式
  21. *
  22. * @param url 请求URL
  23. * @param responseType 返回对象类型
  24. * @return ResponseEntity 响应对象封装类
  25. */
  26. public <T> ResponseEntity<T> get(String url, Class<T> responseType) throws RestClientException{
  27. return restTemplate.getForEntity(url, responseType);
  28. }
  29. /**
  30. * GET请求调用方式
  31. *
  32. * @param url 请求URL
  33. * @param responseType 返回对象类型
  34. * @param uriVariables URL中的变量,按顺序依次对应
  35. * @return ResponseEntity 响应对象封装类
  36. */
  37. public <T> ResponseEntity<T> get(String url, Class<T> responseType, Object... uriVariables) throws RestClientException{
  38. return restTemplate.getForEntity(url, responseType, uriVariables);
  39. }
  40. /**
  41. * GET请求调用方式
  42. *
  43. * @param url 请求URL
  44. * @param responseType 返回对象类型
  45. * @param uriVariables URL中的变量,与Map中的key对应
  46. * @return ResponseEntity 响应对象封装类
  47. */
  48. public <T> ResponseEntity<T> get(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException{
  49. return restTemplate.getForEntity(url, responseType, uriVariables);
  50. }
  51. /**
  52. * 带请求头的GET请求调用方式
  53. *
  54. * @param url 请求URL
  55. * @param headers 请求头参数
  56. * @param responseType 返回对象类型
  57. * @param uriVariables URL中的变量,按顺序依次对应
  58. * @return ResponseEntity 响应对象封装类
  59. */
  60. public <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Object... uriVariables) throws RestClientException{
  61. HttpHeaders httpHeaders = new HttpHeaders();
  62. httpHeaders.setAll(headers);
  63. return get(url, httpHeaders, responseType, uriVariables);
  64. }
  65. /**
  66. * 带请求头的GET请求调用方式
  67. *
  68. * @param url 请求URL
  69. * @param headers 请求头参数
  70. * @param responseType 返回对象类型
  71. * @param uriVariables URL中的变量,按顺序依次对应
  72. * @return ResponseEntity 响应对象封装类
  73. */
  74. public <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) throws RestClientException{
  75. HttpEntity<?> requestEntity = new HttpEntity<>(headers);
  76. return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
  77. }
  78. /**
  79. * 带请求头的GET请求调用方式
  80. *
  81. * @param url 请求URL
  82. * @param headers 请求头参数
  83. * @param responseType 返回对象类型
  84. * @param uriVariables URL中的变量,与Map中的key对应
  85. * @return ResponseEntity 响应对象封装类
  86. */
  87. public <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
  88. HttpHeaders httpHeaders = new HttpHeaders();
  89. httpHeaders.setAll(headers);
  90. return get(url, httpHeaders, responseType, uriVariables);
  91. }
  92. /**
  93. * 带请求头的GET请求调用方式
  94. *
  95. * @param url 请求URL
  96. * @param headers 请求头参数
  97. * @param responseType 返回对象类型
  98. * @param uriVariables URL中的变量,与Map中的key对应
  99. * @return ResponseEntity 响应对象封装类
  100. */
  101. public <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {
  102. HttpEntity<?> requestEntity = new HttpEntity<>(headers);
  103. return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
  104. }
  105. /**
  106. * POST请求调用方式
  107. *
  108. * @param url 请求URL
  109. * @param responseType 返回对象类型
  110. * @return
  111. */
  112. public <T> ResponseEntity<T> post(String url, Class<T> responseType) throws RestClientException{
  113. return restTemplate.postForEntity(url, HttpEntity.EMPTY, responseType);
  114. }
  115. /**
  116. * POST请求调用方式
  117. *
  118. * @param url 请求URL
  119. * @param requestBody 请求参数体
  120. * @param responseType 返回对象类型
  121. * @return ResponseEntity 响应对象封装类
  122. */
  123. public <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType) throws RestClientException {
  124. return restTemplate.postForEntity(url, requestBody, responseType);
  125. }
  126. /**
  127. * POST请求调用方式
  128. *
  129. * @param url 请求URL
  130. * @param requestBody 请求参数体
  131. * @param responseType 返回对象类型
  132. * @param uriVariables URL中的变量,按顺序依次对应
  133. * @return ResponseEntity 响应对象封装类
  134. */
  135. public <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Object... uriVariables) throws RestClientException{
  136. return restTemplate.postForEntity(url, requestBody, responseType, uriVariables);
  137. }
  138. /**
  139. * POST请求调用方式
  140. *
  141. * @param url 请求URL
  142. * @param requestBody 请求参数体
  143. * @param responseType 返回对象类型
  144. * @param uriVariables URL中的变量,与Map中的key对应
  145. * @return ResponseEntity 响应对象封装类
  146. */
  147. public <T> ResponseEntity<T> post(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
  148. return restTemplate.postForEntity(url, requestBody, responseType, uriVariables);
  149. }
  150. /**
  151. * 带请求头的POST请求调用方式
  152. *
  153. * @param url 请求URL
  154. * @param headers 请求头参数
  155. * @param requestBody 请求参数体
  156. * @param responseType 返回对象类型
  157. * @param uriVariables URL中的变量,按顺序依次对应
  158. * @return ResponseEntity 响应对象封装类
  159. */
  160. public <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody, Class<T> responseType,
  161. Object... uriVariables) throws RestClientException{
  162. HttpHeaders httpHeaders = new HttpHeaders();
  163. httpHeaders.setAll(headers);
  164. return post(url, httpHeaders, requestBody, responseType, uriVariables);
  165. }
  166. /**
  167. * 带请求头的POST请求调用方式
  168. *
  169. * @param url 请求URL
  170. * @param headers 请求头参数
  171. * @param requestBody 请求参数体
  172. * @param responseType 返回对象类型
  173. * @param uriVariables URL中的变量,按顺序依次对应
  174. * @return ResponseEntity 响应对象封装类
  175. */
  176. public <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
  177. Object... uriVariables) throws RestClientException{
  178. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
  179. return post(url, requestEntity, responseType, uriVariables);
  180. }
  181. /**
  182. * 带请求头的POST请求调用方式
  183. *
  184. * @param url 请求URL
  185. * @param headers 请求头参数
  186. * @param requestBody 请求参数体
  187. * @param responseType 返回对象类型
  188. * @param uriVariables URL中的变量,与Map中的key对应
  189. * @return ResponseEntity 响应对象封装类
  190. */
  191. public <T> ResponseEntity<T> post(String url, Map<String, String> headers, Object requestBody, Class<T> responseType,
  192. Map<String, ?> uriVariables) throws RestClientException{
  193. HttpHeaders httpHeaders = new HttpHeaders();
  194. httpHeaders.setAll(headers);
  195. return post(url, httpHeaders, requestBody, responseType, uriVariables);
  196. }
  197. /**
  198. * 带请求头的POST请求调用方式
  199. *
  200. * @param url 请求URL
  201. * @param headers 请求头参数
  202. * @param requestBody 请求参数体
  203. * @param responseType 返回对象类型
  204. * @param uriVariables URL中的变量,与Map中的key对应
  205. * @return ResponseEntity 响应对象封装类
  206. */
  207. public <T> ResponseEntity<T> post(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
  208. Map<String, ?> uriVariables) throws RestClientException{
  209. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
  210. return post(url, requestEntity, responseType, uriVariables);
  211. }
  212. /**
  213. * 自定义请求头和请求体的POST请求调用方式
  214. *
  215. * @param url 请求URL
  216. * @param requestEntity 请求头和请求体封装对象
  217. * @param responseType 返回对象类型
  218. * @param uriVariables URL中的变量,按顺序依次对应
  219. * @return ResponseEntity 响应对象封装类
  220. */
  221. public <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType,
  222. Object... uriVariables) throws RestClientException{
  223. return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);
  224. }
  225. /**
  226. * 自定义请求头和请求体的POST请求调用方式
  227. *
  228. * @param url 请求URL
  229. * @param requestEntity 请求头和请求体封装对象
  230. * @param responseType 返回对象类型
  231. * @param uriVariables URL中的变量,与Map中的key对应
  232. * @return ResponseEntity 响应对象封装类
  233. */
  234. public <T> ResponseEntity<T> post(String url, HttpEntity<?> requestEntity, Class<T> responseType
  235. , Map<String, ?> uriVariables) throws RestClientException {
  236. return restTemplate.exchange(url, HttpMethod.POST, requestEntity, responseType, uriVariables);
  237. }
  238. /**
  239. * PUT请求调用方式
  240. *
  241. * @param url 请求URL
  242. * @param responseType 返回对象类型
  243. * @param uriVariables URL中的变量,按顺序依次对应
  244. * @return ResponseEntity 响应对象封装类
  245. */
  246. public <T> ResponseEntity<T> put(String url, Class<T> responseType, Object... uriVariables) throws RestClientException{
  247. return put(url, HttpEntity.EMPTY, responseType, uriVariables);
  248. }
  249. /**
  250. * PUT请求调用方式
  251. *
  252. * @param url 请求URL
  253. * @param requestBody 请求参数体
  254. * @param responseType 返回对象类型
  255. * @param uriVariables URL中的变量,按顺序依次对应
  256. * @return ResponseEntity 响应对象封装类
  257. */
  258. public <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Object... uriVariables) throws RestClientException{
  259. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
  260. return put(url, requestEntity, responseType, uriVariables);
  261. }
  262. /**
  263. * PUT请求调用方式
  264. *
  265. * @param url 请求URL
  266. * @param requestBody 请求参数体
  267. * @param responseType 返回对象类型
  268. * @param uriVariables URL中的变量,与Map中的key对应
  269. * @return ResponseEntity 响应对象封装类
  270. */
  271. public <T> ResponseEntity<T> put(String url, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
  272. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
  273. return put(url, requestEntity, responseType, uriVariables);
  274. }
  275. /**
  276. * 带请求头的PUT请求调用方式
  277. *
  278. * @param url 请求URL
  279. * @param headers 请求头参数
  280. * @param requestBody 请求参数体
  281. * @param responseType 返回对象类型
  282. * @param uriVariables URL中的变量,按顺序依次对应
  283. * @return ResponseEntity 响应对象封装类
  284. */
  285. public <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType,
  286. Object... uriVariables) throws RestClientException{
  287. HttpHeaders httpHeaders = new HttpHeaders();
  288. httpHeaders.setAll(headers);
  289. return put(url, httpHeaders, requestBody, responseType, uriVariables);
  290. }
  291. /**
  292. * 带请求头的PUT请求调用方式
  293. *
  294. * @param url 请求URL
  295. * @param headers 请求头参数
  296. * @param requestBody 请求参数体
  297. * @param responseType 返回对象类型
  298. * @param uriVariables URL中的变量,按顺序依次对应
  299. * @return ResponseEntity 响应对象封装类
  300. */
  301. public <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
  302. Object... uriVariables) throws RestClientException{
  303. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
  304. return put(url, requestEntity, responseType, uriVariables);
  305. }
  306. /**
  307. * 带请求头的PUT请求调用方式
  308. *
  309. * @param url 请求URL
  310. * @param headers 请求头参数
  311. * @param requestBody 请求参数体
  312. * @param responseType 返回对象类型
  313. * @param uriVariables URL中的变量,与Map中的key对应
  314. * @return ResponseEntity 响应对象封装类
  315. */
  316. public <T> ResponseEntity<T> put(String url, Map<String, String> headers, Object requestBody, Class<T> responseType,
  317. Map<String, ?> uriVariables) throws RestClientException{
  318. HttpHeaders httpHeaders = new HttpHeaders();
  319. httpHeaders.setAll(headers);
  320. return put(url, httpHeaders, requestBody, responseType, uriVariables);
  321. }
  322. /**
  323. * 带请求头的PUT请求调用方式
  324. *
  325. * @param url 请求URL
  326. * @param headers 请求头参数
  327. * @param requestBody 请求参数体
  328. * @param responseType 返回对象类型
  329. * @param uriVariables URL中的变量,与Map中的key对应
  330. * @return ResponseEntity 响应对象封装类
  331. */
  332. public <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType,
  333. Map<String, ?> uriVariables) throws RestClientException{
  334. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
  335. return put(url, requestEntity, responseType, uriVariables);
  336. }
  337. /**
  338. * 自定义请求头和请求体的PUT请求调用方式
  339. *
  340. * @param url 请求URL
  341. * @param requestEntity 请求头和请求体封装对象
  342. * @param responseType 返回对象类型
  343. * @param uriVariables URL中的变量,按顺序依次对应
  344. * @return ResponseEntity 响应对象封装类
  345. */
  346. public <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType,
  347. Object... uriVariables) throws RestClientException{
  348. return restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);
  349. }
  350. /**
  351. * 自定义请求头和请求体的PUT请求调用方式
  352. *
  353. * @param url 请求URL
  354. * @param requestEntity 请求头和请求体封装对象
  355. * @param responseType 返回对象类型
  356. * @param uriVariables URL中的变量,与Map中的key对应
  357. * @return ResponseEntity 响应对象封装类
  358. */
  359. public <T> ResponseEntity<T> put(String url, HttpEntity<?> requestEntity, Class<T> responseType,
  360. Map<String, ?> uriVariables) throws RestClientException {
  361. return restTemplate.exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);
  362. }
  363. /**
  364. * DELETE请求调用方式
  365. *
  366. * @param url 请求URL
  367. * @param responseType 返回对象类型
  368. * @param uriVariables URL中的变量,按顺序依次对应
  369. * @return ResponseEntity 响应对象封装类
  370. */
  371. public <T> ResponseEntity<T> delete(String url, Class<T> responseType, Object... uriVariables) throws RestClientException{
  372. return delete(url, HttpEntity.EMPTY, responseType, uriVariables);
  373. }
  374. /**
  375. * DELETE请求调用方式
  376. *
  377. * @param url 请求URL
  378. * @param responseType 返回对象类型
  379. * @param uriVariables URL中的变量,与Map中的key对应
  380. * @return ResponseEntity 响应对象封装类
  381. */
  382. public <T> ResponseEntity<T> delete(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException{
  383. return delete(url, HttpEntity.EMPTY, responseType, uriVariables);
  384. }
  385. /**
  386. * DELETE请求调用方式
  387. *
  388. * @param url 请求URL
  389. * @param requestBody 请求参数体
  390. * @param responseType 返回对象类型
  391. * @param uriVariables URL中的变量,按顺序依次对应
  392. * @return ResponseEntity 响应对象封装类
  393. */
  394. public <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType,
  395. Object... uriVariables) throws RestClientException{
  396. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
  397. return delete(url, requestEntity, responseType, uriVariables);
  398. }
  399. /**
  400. * DELETE请求调用方式
  401. *
  402. * @param url 请求URL
  403. * @param requestBody 请求参数体
  404. * @param responseType 返回对象类型
  405. * @param uriVariables URL中的变量,与Map中的key对应
  406. * @return ResponseEntity 响应对象封装类
  407. */
  408. public <T> ResponseEntity<T> delete(String url, Object requestBody, Class<T> responseType
  409. , Map<String, ?> uriVariables) throws RestClientException{
  410. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody);
  411. return delete(url, requestEntity, responseType, uriVariables);
  412. }
  413. /**
  414. * 带请求头的DELETE请求调用方式
  415. *
  416. * @param url 请求URL
  417. * @param headers 请求头参数
  418. * @param responseType 返回对象类型
  419. * @param uriVariables URL中的变量,按顺序依次对应
  420. * @return ResponseEntity 响应对象封装类
  421. */
  422. public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType,
  423. Object... uriVariables) throws RestClientException{
  424. HttpHeaders httpHeaders = new HttpHeaders();
  425. httpHeaders.setAll(headers);
  426. return delete(url, httpHeaders, responseType, uriVariables);
  427. }
  428. /**
  429. * 带请求头的DELETE请求调用方式
  430. *
  431. * @param url 请求URL
  432. * @param headers 请求头参数
  433. * @param responseType 返回对象类型
  434. * @param uriVariables URL中的变量,按顺序依次对应
  435. * @return ResponseEntity 响应对象封装类
  436. */
  437. public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType
  438. , Object... uriVariables) throws RestClientException {
  439. HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);
  440. return delete(url, requestEntity, responseType, uriVariables);
  441. }
  442. /**
  443. * 带请求头的DELETE请求调用方式
  444. *
  445. * @param url 请求URL
  446. * @param headers 请求头参数
  447. * @param responseType 返回对象类型
  448. * @param uriVariables URL中的变量,与Map中的key对应
  449. * @return ResponseEntity 响应对象封装类
  450. */
  451. public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Class<T> responseType
  452. , Map<String, ?> uriVariables) throws RestClientException{
  453. HttpHeaders httpHeaders = new HttpHeaders();
  454. httpHeaders.setAll(headers);
  455. return delete(url, httpHeaders, responseType, uriVariables);
  456. }
  457. /**
  458. * 带请求头的DELETE请求调用方式
  459. *
  460. * @param url 请求URL
  461. * @param headers 请求头参数
  462. * @param responseType 返回对象类型
  463. * @param uriVariables URL中的变量,与Map中的key对应
  464. * @return ResponseEntity 响应对象封装类
  465. */
  466. public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Class<T> responseType
  467. , Map<String, ?> uriVariables) throws RestClientException{
  468. HttpEntity<Object> requestEntity = new HttpEntity<Object>(headers);
  469. return delete(url, requestEntity, responseType, uriVariables);
  470. }
  471. /**
  472. * 带请求头的DELETE请求调用方式
  473. *
  474. * @param url 请求URL
  475. * @param headers 请求头参数
  476. * @param requestBody 请求参数体
  477. * @param responseType 返回对象类型
  478. * @param uriVariables URL中的变量,按顺序依次对应
  479. * @return ResponseEntity 响应对象封装类
  480. */
  481. public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody,
  482. Class<T> responseType, Object... uriVariables)throws RestClientException {
  483. HttpHeaders httpHeaders = new HttpHeaders();
  484. httpHeaders.setAll(headers);
  485. return delete(url, httpHeaders, requestBody, responseType, uriVariables);
  486. }
  487. /**
  488. * 带请求头的DELETE请求调用方式
  489. *
  490. * @param url 请求URL
  491. * @param headers 请求头参数
  492. * @param requestBody 请求参数体
  493. * @param responseType 返回对象类型
  494. * @param uriVariables URL中的变量,按顺序依次对应
  495. * @return ResponseEntity 响应对象封装类
  496. */
  497. public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody,
  498. Class<T> responseType, Object... uriVariables) throws RestClientException{
  499. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
  500. return delete(url, requestEntity, responseType, uriVariables);
  501. }
  502. /**
  503. * 带请求头的DELETE请求调用方式
  504. *
  505. * @param url 请求URL
  506. * @param headers 请求头参数
  507. * @param requestBody 请求参数体
  508. * @param responseType 返回对象类型
  509. * @param uriVariables URL中的变量,与Map中的key对应
  510. * @return ResponseEntity 响应对象封装类
  511. */
  512. public <T> ResponseEntity<T> delete(String url, Map<String, String> headers, Object requestBody,
  513. Class<T> responseType, Map<String, ?> uriVariables)throws RestClientException {
  514. HttpHeaders httpHeaders = new HttpHeaders();
  515. httpHeaders.setAll(headers);
  516. return delete(url, httpHeaders, requestBody, responseType, uriVariables);
  517. }
  518. /**
  519. * 带请求头的DELETE请求调用方式
  520. *
  521. * @param url 请求URL
  522. * @param headers 请求头参数
  523. * @param requestBody 请求参数体
  524. * @param responseType 返回对象类型
  525. * @param uriVariables URL中的变量,与Map中的key对应
  526. * @return ResponseEntity 响应对象封装类
  527. */
  528. public <T> ResponseEntity<T> delete(String url, HttpHeaders headers, Object requestBody,
  529. Class<T> responseType, Map<String, ?> uriVariables)throws RestClientException {
  530. HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
  531. return delete(url, requestEntity, responseType, uriVariables);
  532. }
  533. /**
  534. * 自定义请求头和请求体的DELETE请求调用方式
  535. *
  536. * @param url 请求URL
  537. * @param requestEntity 请求头和请求体封装对象
  538. * @param responseType 返回对象类型
  539. * @param uriVariables URL中的变量,按顺序依次对应
  540. * @return ResponseEntity 响应对象封装类
  541. */
  542. public <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType,
  543. Object... uriVariables)throws RestClientException {
  544. return restTemplate.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);
  545. }
  546. /**
  547. * 自定义请求头和请求体的DELETE请求调用方式
  548. *
  549. * @param url 请求URL
  550. * @param requestEntity 请求头和请求体封装对象
  551. * @param responseType 返回对象类型
  552. * @param uriVariables URL中的变量,与Map中的key对应
  553. * @return ResponseEntity 响应对象封装类
  554. */
  555. public <T> ResponseEntity<T> delete(String url, HttpEntity<?> requestEntity, Class<T> responseType,
  556. Map<String, ?> uriVariables) throws RestClientException{
  557. return restTemplate.exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);
  558. }
  559. /**
  560. * 通用调用方式
  561. *
  562. * @param url 请求URL
  563. * @param method 请求方法类型
  564. * @param requestEntity 请求头和请求体封装对象
  565. * @param responseType 返回对象类型
  566. * @param uriVariables URL中的变量,按顺序依次对应
  567. * @return ResponseEntity 响应对象封装类
  568. */
  569. public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,
  570. Class<T> responseType, Object... uriVariables)throws RestClientException {
  571. return restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);
  572. }
  573. /**
  574. * 通用调用方式
  575. *
  576. * @param url 请求URL
  577. * @param method 请求方法类型
  578. * @param requestEntity 请求头和请求体封装对象
  579. * @param responseType 返回对象类型
  580. * @param uriVariables URL中的变量,与Map中的key对应
  581. * @return ResponseEntity 响应对象封装类
  582. */
  583. public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,
  584. Class<T> responseType, Map<String, ?> uriVariables)throws RestClientException {
  585. return restTemplate.exchange(url, method, requestEntity, responseType, uriVariables);
  586. }
  587. }

相关文章