当前位置: 代码迷 >> 综合 >> SpringCloud- HTTP 请求工具-RestTemplate
  详细解决方案

SpringCloud- HTTP 请求工具-RestTemplate

热度:61   发布时间:2023-12-12 11:55:31.0

一、简介

微服务的通信协议主流的有RPC,Http,SpringCloud是基于Http Restful 风格 ,在Java中发起一个Http请求的方式很多,比如 Apache的HttpClient , OKHttp等等 。Spring为我们封装了一个基于Restful的使用非常简单的Http客户端工具 RestTemplate ,我们就用它来实订单服务和用户服务的通信。需要注意的是,RestTmplate本身不具备服务发现和负载均衡器的功能,我们本章的案例只是演示在订单服务中使用RestTemplate基于ip和端口的方式向用户服务发起调用,即:不走注册中心,不使用服务发现方式。

二、SpringCloud使用RestTemplate

一、注册BEAN

    // 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,// 需要在配置文件配置之后,代码中才可以依赖注入// 当前文件就是spring的配置文件@Bean@LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力public RestTemplate getRestTemplate() {
    return new RestTemplate();}

二、GET请求

RestTemplate可以发送HTTP GET请求,经常使用到的方法有两个:

  1. getForObject()
  2. getForEntity()

二者的主要区别在于,getForObject()返回值是HTTP协议的响应体。getForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。

1、getForObject()以String的方式接受结果数据

    @GetMapping("/payment/get/{id}")public String getPayment_String(@PathVariable("id") Long id) {
    return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, String.class);}

2、getForObject()以对象的方式接受结果数据

    @GetMapping("/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
    return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);}

3、getForObject()以数组的方式接收请求结果

    @GetMapping("/payment/get/{id}")public CommonResult<Payment>[] getPayment_array(@PathVariable("id") Long id) {
    CommonResult[] commonResults = restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult[].class);return commonResults;}

4、getForEntity()方法

getForObject请求传参方法,getForEntity都可以使用,使用方法上也几乎是一致的,只是在返回结果接收的时候略有差别。使用ResponseEntity responseEntity来接收响应结果。用responseEntity.getBody()获取响应体。响应体内容同getForObject方法返回结果一致。剩下的这些响应信息就是getForEntity比getForObject多出来的内容。

HttpStatus statusCode = responseEntity.getStatusCode(); 获取整体的响应状态信息
int statusCodeValue = responseEntity.getStatusCodeValue(); 获取响应码值
HttpHeaders headers = responseEntity.getHeaders(); 获取响应头
    @GetMapping("/payment/getForEntity/{id}")public CommonResult<Payment> getPayment2(@PathVariable("id") Long id) {
    ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);entity.getStatusCode();//获取整体的响应状态信息entity.getStatusCodeValue();//获取响应码值entity.getHeaders();//获取响应头if (entity.getStatusCode().is2xxSuccessful()) {
    return entity.getBody();} else {
    return new CommonResult<>(444, "操作失败");}}

三、POST请求

POST请求方法和GET请求方法上大同小异,RestTemplate的POST请求也包含两个主要方法:

  1. postForObject()
  2. postForEntity()

二者的主要区别在于,postForObject()返回值是HTTP协议的响应体。postForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。

1、postForObject发送JSON格式请求

    @PostMapping("/payment/create")public CommonResult<Payment> create(@RequestBody Payment payment) {
    return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);}

2、postForObject模拟表单数据提交

public void testForm() {
    // 请求地址String url = "http://jsonplaceholder.typicode.com/posts";// 请求头设置,x-www-form-urlencoded格式的数据HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);//提交参数设置MultiValueMap<String, String> map = new LinkedMultiValueMap<>();map.add("title", "zimug 发布文章第二篇");map.add("body", "zimug 发布文章第二篇 测试内容");// 组装请求体HttpEntity<MultiValueMap<String, String>> request =new HttpEntity<MultiValueMap<String, String>>(map, headers);// 发送post请求,并打印结果,以String类型接收响应结果JSON字符串String result = restTemplate.postForObject(url, request, String.class);System.out.println(result);
}

3、postForEntity()方法

postForObject请求传参方法,postForEntity都可以使用,使用方法上也几乎是一致的,只是在返回结果接收的时候略有差别。使用ResponseEntity responseEntity来接收响应结果。用responseEntity.getBody()获取响应体。响应体内容同postForObject方法返回结果一致。剩下的这些响应信息就是postForEntity比postForObject多出来的内容。

HttpStatus statusCode = responseEntity.getStatusCode();获取整体的响应状态信息
int statusCodeValue = responseEntity.getStatusCodeValue(); 获取响应码值
HttpHeaders headers = responseEntity.getHeaders();获取响应头
@Test
public void testEntityPoJo() {
    // 请求地址String url = "http://jsonplaceholder.typicode.com/posts";// 要发送的数据对象PostDTO postDTO = new PostDTO();postDTO.setUserId(110);postDTO.setTitle("zimug 发布文章");postDTO.setBody("zimug 发布文章 测试内容");// 发送post请求,并输出结果ResponseEntity<String> responseEntity= restTemplate.postForEntity(url, postDTO, String.class);String body = responseEntity.getBody(); // 获取响应体System.out.println("HTTP 响应body:" + postDTO.toString());//以下是postForEntity比postForObject多出来的内容HttpStatus statusCode = responseEntity.getStatusCode(); // 获取响应码int statusCodeValue = responseEntity.getStatusCodeValue(); // 获取响应码值HttpHeaders headers = responseEntity.getHeaders(); // 获取响应头System.out.println("HTTP 响应状态:" + statusCode);System.out.println("HTTP 响应状态码:" + statusCodeValue);System.out.println("HTTP Headers信息:" + headers);
}

4、postForLocation() 方法的使用

postForLocation的传参的类型、个数、用法基本都和postForObject()或postForEntity()一致。和前两者的唯一区别在于返回值是一个URI。该URI返回值体现的是:用于提交完成数据之后的页面跳转,或数据提交完成之后的下一步数据操作URI。

@Test
public void testURI() {
    // 请求地址String url = "http://jsonplaceholder.typicode.com/posts";PostDTO postDTO = new PostDTO();postDTO.setUserId(110);postDTO.setTitle("zimug 发布文章");postDTO.setBody("zimug 发布文章 测试内容");// 发送post请求,并输出结果URI uri = restTemplate.postForLocation(url,postDTO);System.out.println(uri);
}
  相关解决方案