RestTemplate 的简单使用:
RestTemplate提供高度封装的接口,可以让我们非常方便地进行Rest API调用.常见的方法如下:
简单来说RestTemplate是一个请求方法
表格:RestTemplate 的方法
实例代码:(第一种:)
HttpHeaders headers = new HttpHeaders() ResponseEntity<Map> response = restTemplate.postForEntity(YuantongConfig.YTO_Logistics_Api, request, Map.class, new Object[0]);
实例代码:(第二种:)
/** *通过@Bean来注入容器来实现方法 */ package com.czxy.ssm.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * RestTemplate工具类,主要用来提供RestTemplate对象 */ @Configuration//加上这个注解作用,可以被Spring扫描 public class RestTemplateConfig { /** * 创建RestTemplate对象,将RestTemplate对象的生命周期的管理交给Spring */ @Bean public RestTemplate restTemplate(){ // RestTemplate restTemplate = new RestTemplate(); //设置中文乱码问题方式一 // restTemplate.getMessageConverters().add(1,new StringHttpMessageConverter(Charset.forName("UTF-8"))); // 设置中文乱码问题方式二 // restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8)); // 支持中文编码 return new RestTemplate(); } /方法二/ /** * ClientHttpRequestFactory:客户端请求工厂 * */ @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ RestTemplate restTemplate=new RestTemplate(factory); //MyInterceptor 拦截器 restTemplate.setInterceptors(Collections.singletonList(new MyInterceptor())); return restTemplate; } @Bean public ClientHttpRequestFactory requestFactory(){ SimpleClientHttpRequestFactory factory=new SimpleClientHttpRequestFactory(); factory.setReadTimeout(5000); factory.setConnectTimeout(15000); //设置代理 factory.setProxy(null); return factory; } }
package com.czxy.ssm.controller; import com.czxy.ssm.pojo.Goods; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; /** * 本项目不连接数据库,通过RestTemplate发出get、post、put、delete请求, * 请求Goods-project项目中controller的方法 */ @RestController @RequestMapping("/rest") public class RestTempController { // 从Spring的容器中获取restTemplate @Autowired private RestTemplate restTemplate; /** * 通过/id查询 * http://localhost:8090/goods2 -->分页查找 */ @GetMapping("/{id}") public ResponseEntity<String> findByPage(@PathVariable Integer id){ /** * 第一个参数:url * 第二个参数:返回值类型 */ ResponseEntity<String> entity = restTemplate.getForEntity("http://localhost:8080/goods2/"+id, String.class); System.out.println("状态码:"+entity.getStatusCode()); System.out.println("响应体"+entity.getBody()); return ResponseEntity.ok(entity.getBody()); } /** * 添加数据 */ @PostMapping public ResponseEntity<String> addGoods(@RequestBody Goods goods){ /** * 第一个参数:url * 第二个参数:数据 * 第三个参数:返回值类型 */ ResponseEntity<String> entity = restTemplate.postForEntity("http://localhost:8080/goods2", goods, String.class); return entity; } /** * 修改数据 */ @PutMapping public ResponseEntity<String> updateGoods(@RequestBody Goods goods){ // 第一个参数:url // 第二个参数:对象,数据 restTemplate.put("http://localhost:8080/goods2",goods); // return new ResponseEntity<>("成功", HttpStatus.OK); return ResponseEntity.ok("修改成功"); } /** * 根据/id删除 */ @DeleteMapping("/{id}") public ResponseEntity<String> deleteGoods(@PathVariable("id") Integer id){ restTemplate.delete("http://localhost:8080/goods2/"+id,String.class); return ResponseEntity.ok("删除成功"); } }
代码参考:
RestTemplate使用详解_BigMoM1573的博客-优快云博客
https://www.cnblogs.com/54chensongxia/p/11414923.html
要导入的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.6:调用接口常用的几个方法:
- 数据转换为JSON数据 :JSON.toJSONString(ytooCancel);
- 签名:encryptSignForOpen
- 封装参数放回参数:Map<String, String> map = new HashMap<>();
- 当前的时间戳:String.valueOf(System.currentTimeMillis())(String.valueOf:返回对象的值)
- 请求头:HttpHeaders headers = new HttpHeaders();
- 内容类型:ContentType(内容的类型)
- 请求的实体:HttpEntity(放请求头和请求内容的)
- 请求的模版:restTemplate.postForEntity(post请求)
代码展示:
String jsonString = JSON.toJSONString(ytooCancel); System.out.println("jsonString=="+jsonString); String data = jsonString +YuantongConfig.YTO_Logistics_Method + YuantongConfig.YTO_Edition; //签名 String sign = encryptSignForOpen.encryptSignForOpen(data,YuantongConfig.YTO_Logistics_Secret); //封装参数 Map<String, String> map = new HashMap<>(); //获取时间戳 map.put("timestamp", String.valueOf(System.currentTimeMillis())); map.put("param", jsonString); map.put("sign", sign); map.put("format", "JSON"); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8")); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity(map, headers); ResponseEntity<Map> response = restTemplate.postForEntity(YuantongConfig.YTO_Logistics_Api, request, Map.class, new Object[0]); Map orderCancel = response.getBody(); System.out.println("orderCancel="+orderCancel);
拦截器:
package com.example.yuantong.config; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; /** * 拦截器 * */ public class MyInterceptor implements ClientHttpRequestInterceptor { @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { HttpHeaders headers= request.getHeaders(); /** * 1.拦截所以请求————带上请求头————在去请求 * */ //HttpHeaders.USER_AGENT:用户代理 headers.add(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"); return execution.execute(request, body); } }