目录
一、RestTemplate设置toke
可以使用RestTemplate的拦截器来设置token。示例代码如下:
// 创建RestTemplate实例
RestTemplate restTemplate = new RestTemplate();
// 创建拦截器
ClientHttpRequestInterceptor interceptor = (request, body, execution) -> {
// 设置token
request.getHeaders().set("Authorization", "Bearer " + token);
// 继续执行请求
return execution.execute(request, body);
};
// 将拦截器添加到RestTemplate实例中
restTemplate.setInterceptors(Collections.singletonList(interceptor));
// 发送请求
String result = restTemplate.getForObject(url, String.class);
其中,token是要设置的token值。
二、RestTemplate发送POST
使用RestTemplate发送POST请求并携带请求体可以通过以下代码实现:
RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Map<String, String> requestBody = new HashMap<>();
requestBody.put("key1", "value1");
requestBody.put("key2", "value2");
HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class);String responseBody = responseEntity.getBody();
其中,需要设置请求头的Content-Type为application/json,并将请求体封装到HttpEntity中,最后调用RestTemplate的postForEntity方法发送POST请求并获取响应体。
三、RestTemplateUtils工具类代码
@Component
public class RestTemplateUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateUtils.class);
@Resource
private RestTemplate restTemplate;
/**
* http get 请求
*
* @param url url
* @param responseType response类型
* @param <T> 类型参数
* @return response body
*/
public <T> T get(String url, ParameterizedTypeReference<T> responseType) {
return http(url, HttpMethod.GET, null, responseType);
}
/**
* http post 请求
*
* @param url url
* @param request 请求体
* @param responseType response类型
* @param <T> 类型参数
* @return response body
*/
public <T> T post(String url, Object request, ParameterizedTypeReference<T> responseType) {
return http(url, HttpMethod.POST, request, responseType);
}
/**
* http 请求
*
* @param url url
* @param httpMethod method
* @param request request
* @param responseType response类型
* @param <T> 类型参数
* @return response body
*/
public <T> T http(String url, HttpMethod httpMethod, Object request, ParameterizedTypeReference<T> responseType) {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Object> requestData = new HttpEntity<>(request, httpHeaders);
ResponseEntity<T> responseEntity;
try {
responseEntity = restTemplate.exchange(url, httpMethod, requestData, responseType);
} catch (RestClientException e) {
LOGGER.error("RestClientException when exchange", e);
throw new DemoException(e, ErrorEnum.HTTP_REQUEST_ERROR);
}
if (responseEntity.getStatusCode() != HttpStatus.OK) {
LOGGER.error("http request has response but status is not ok");
throw new DemoException(ErrorEnum.HTTP_REQUEST_ERROR);
}
T body = responseEntity.getBody();
if (body == null) {
LOGGER.error("http request has response but response body is null");
throw new DemoException(ErrorEnum.HTTP_REQUEST_ERROR);
}
return body;
}
}
四、实例
@RestController
@RequestMapping(value = "hello", produces = MediaType.APPLICATION_JSON_VALUE)
public class HelloController {
private static final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);
@Resource
private RestTemplateUtils restTemplateUtils;
@GetMapping(value = "/request-get")
public ResultVo<Void> requestGet() {
String url = "http://localhost:8888/employee/query/2";
ResultVo<EmployeeVo> resultVo = restTemplateUtils.get(url,
new EmployeeVoParameterizedTypeReference());
LOGGER.info("code: {}", resultVo.getCode());
EmployeeVo employeeVo = resultVo.getResult().getData().get(0);
LOGGER.info("employeeVo: {}", new Gson().toJson(employeeVo));
return ResultVoUtils.success(null);
}
@GetMapping(value = "/request-post")
public ResultVo<Void> requestPost() {
Book book = new Book();
book.setAuthor("吴军");
book.setPublisher("人民邮电出版社");
book.setName("数学之美");
String url = "http://localhost:8888/v1/book/one-book";
ResultVo<Book> resultVo = restTemplateUtils.post(url,
book, new BookParameterizedTypeReference());
LOGGER.info("code: {}", resultVo.getCode());
Book responseBook = resultVo.getResult().getData().get(0);
LOGGER.info("employeeVo: {}", new Gson().toJson(responseBook));
return ResultVoUtils.success(null);
}
private static class EmployeeVoParameterizedTypeReference extends ParameterizedTypeReference<ResultVo<EmployeeVo>> {
}
;
private static class BookParameterizedTypeReference extends ParameterizedTypeReference<ResultVo<Book>> {
}
;
}