springboot 客户端请求 RestTemplate 实际
2021-03-23 本文已影响0人
dylan丶QAQ
客户端请求是我们经常要用到的,不论是在自己系统之间的相互调用还是在请求别人的api,RestTemplate都是一种极简的方式,当然前提是使用spring框架。立志工具人。一起干饭!
本章主要内容
-
使用RestTemplate请求后端
-
获取响应头、状态码和资源交换
RestTemplate底层是通过类HttpURLConnection实现的。RestTemplate简介
1.使用RestTemplate请求后端
- 使用Get请求
通过RestTemplate获取用户信息
使用postman请求 http://localhost:8080/user/getUser
package com.dylan.mall.controller;
import com.dylan.mall.component.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
/**
* @author Administrator
*/
@Slf4j
@Controller
@RequestMapping("/user")
public class UserRestTestController {
@RequestMapping("/{id}")
@ResponseBody
public User getById(@PathVariable String id) {
log.error(id + "");
User user = new User();
user.setUserName("dylan");
user.setAge(18);
return user;
}
@GetMapping("/getUser")
@ResponseBody
public User getUser() {
//创建一个RestTemplate对象
RestTemplate restTemplate = new RestTemplate();
int id = 1;
//消费服务 第一个参数是URL,第二个是返回类型,第三个是URI路径参数
User user = restTemplate.getForObject("http://localhost:8080/user/{id}", User.class, id);
log.error(user.getUserName());
return user;
}
}
User类:
package com.dylan.mall.component;
import lombok.Data;
/**
* @author Administrator
*/
@Data
public class User {
private String userName;
private Integer age;
}
如果有很多参数,有两种方法,一种是继续写在后面,他是可变参数;第二种方法是使用Map对象封装起来,可以提高可读性。
- 使用Post请求
使用postman请求 http://localhost:8080/user/insertTest
使用Post请求,往往采用请求体的方式(body),需要对请求进行一定的设置才能使请求体的方式来进行Post请求。
@GetMapping ("/insertTest")
@ResponseBody
public User insertUser() {
//测试user数据
User user = User.builder().userName("法外狂徒张三").age(66).build();
HttpHeaders headers=new HttpHeaders();
//设置请求内容为JSON类型
headers.setContentType(MediaType.APPLICATION_JSON);
//创建请求实体对象
HttpEntity<User> request = new HttpEntity<>(user, headers);
RestTemplate restTemplate = new RestTemplate();
//请求时 传递请求实体对象,并返回回填id的用户
User user1 = restTemplate.postForObject("http://localhost:8080/user/insert", request, User.class);
log.error(user1.toString());
return user1;
}
@PostMapping ("/insert")
@ResponseBody
public User insertUser(User user1) {
User user = new User();
user.setUserName("dylan");
user.setAge(18);
return user;
}
2.获取响应头、状态码和资源交换
- 获取服务器响应头属性和HTTP状态码
有的时候请求不一定能保证成功获取到资源。例如:我们在请求的时候,出现了错误,抛出了异常,这个时候异常会存放到响应头中,并且服务器也会返回相应的状态码。这个时候,获取响应头和HTTP状态码就可以辨别请求是否成功,如果发生了错误,它还可以给出信息反馈错误原因。
public User insertUserEntity(User user) {
//请求头
HttpHeaders headers = new HttpHeaders();
//请求类型
headers.setContentType(MediaType.APPLICATION_JSON);
//绑定请求体和头
HttpEntity<User> request = new HttpEntity<>(user, headers);
RestTemplate restTemplate = new RestTemplate();
//请求服务器
ResponseEntity<User> userResponseEntity = restTemplate.postForEntity("http://localhost:8080/user/insert", request, User.class);
//获取响应体
User user1 = userResponseEntity.getBody();
//获取响应头
HttpHeaders headers1 = userResponseEntity.getHeaders();
//获取相应属性
List<String> success = headers1.get("success");
//相应的HTTP状态码
int statusCodeValue = userResponseEntity.getStatusCodeValue();
log.error(user1.getUserName());
return user1;
}
- 使用exchange方法
为了更加灵活,RestTemplate还提供了一个exchange方法,它可以作为资源的交换而使用,可以根据自己的需要定制更多的参数。但是其可读性,并不是很高。
public User userExchange(User user,Integer id) {
//请求头
HttpHeaders headers = new HttpHeaders();
//请求类型
headers.setContentType(MediaType.APPLICATION_JSON);
//绑定请求体和头
HttpEntity<User> request = new HttpEntity<>(user, headers);
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8080/user/insert";
//请求服务器
ResponseEntity<User> userResponseEntity = restTemplate.exchange(url, HttpMethod.POST, request, User.class);
//获取响应体
User user1 = userResponseEntity.getBody();
//获取响应头
HttpHeaders headers1 = userResponseEntity.getHeaders();
//获取相应属性
List<String> success = headers1.get("success");
//相应的HTTP状态码
int statusCodeValue = userResponseEntity.getStatusCodeValue();
//修改URL获取资源
url = "http://localhost:8080/user/{id}";
ResponseEntity<User> userEntity = restTemplate.exchange(url, HttpMethod.GET, null, User.class,id);
//获取响应体
User user2 = userEntity.getBody();
log.error(user2.getUserName());
return user1;
}
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!