Day05 Spring RestTemplate 知识点详解

RestTemplate

当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,那么今天我们就来详细的看一下RestTemplate中几种常见请求方法的使用。

   RestTemplate一共有四种请求方式

  • GET请求
  • POST请求
  • PUT请求
  • DELETE请求
  1. GET请求
       1. getForEntity()
    测试方法:
@Slf4j
@RestController
public class UserController1 {

   @Autowired
   private RestTemplate restTemplate;

   /*
    * getForEntity方法的返回值是一个ResponseEntity<T>,ResponseEntity<T>是Spring对HTTP请求响应的封装,
    * 包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。
    */
   @GetMapping(value = "/findOrdersByUser1/{id}")
   public String findOrdersByUser(@PathVariable String id) {
   	log.debug(this.getClass().getName().toString());
   	Integer oid = 123;
   	// 获取getForEntity()方法的返回值
   	ResponseEntity<String> responseEntity = this.restTemplate
   			.getForEntity("http://springcloud-eureka-order/order/" + oid, String.class);
   	// 获取状态码信息
   	HttpStatus statusCode = responseEntity.getStatusCode();
   	// 获取状态码信息值
   	int statusCodeValue = responseEntity.getStatusCodeValue();
   	// 返回的响应体信息
   	HttpHeaders headers = responseEntity.getHeaders();
   	// 返回的响应体信息
   	String body = responseEntity.getBody();
   	StringBuffer result = new StringBuffer();
   	// 拼装结果集返回
   	result.append("responseEntity.getBody():").append(body).append("<hr>").append("responseEntity.getStatusCode():")
   			.append(statusCode).append("<hr>").append("responseEntity.getStatusCodeValue():")
   			.append(statusCodeValue).append("<hr>").append("responseEntity.getHeaders():").append(headers)
   			.append("<hr>");
   	return result.toString();
   }
}

   结果如下:
在这里插入图片描述
    有时候我在调用服务提供者提供的接口时,可能需要传递参数,有其余两种不同的方式,如下:

	//方法一
	Integer oid = 123;
		// 获取getForEntity()方法的返回值
		// 可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
		ResponseEntity<String> responseEntity = this.restTemplate
				.getForEntity("http://springcloud-eureka-order/order/{1}", String.class, oid);
	//方法二
	Map<String, Integer> map = new HashMap<>();
		map.put("oid", 123);
		// 获取getForEntity()方法的返回值
		// 也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值
		ResponseEntity<String> responseEntity = this.restTemplate
				.getForEntity("http://springcloud-eureka-order/order/oid={oid}", String.class, map);

    当然,服务提供者不仅可以返回String,也可以返回一个自定义类型的对象
首先创建common工程,打包方式为jar,创建entity包,新建Order实体类,打包到本地仓库(将order项目的实体类移动到common项目中) , 并作为jar为其他项目引入 , 同时将order项目中的util移动到common工程中
在这里插入图片描述
在这里插入图片描述
         2. getForObject()函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,例子如下:
在这里插入图片描述
其余重载方法和getForEntity()一样,就不在一一赘述了…
在这里插入图片描述
2. Post请求
      在Rest Template中,POST请求可以通过如下三个方法来发起:
      1. postForEntity()

/**
 * @ClassName: UserPostController
 * @Description:
 * @author: 田晓斌
 * @date: 2019年4月22日 下午4:27:30
 */
@Slf4j
@RestController
public class UserPostController {

	@Autowired
	private RestTemplate restTemplate;

	@GetMapping(value = "/findOrdersByUser5/{id}")
	public String findOrdersByUser(@PathVariable String id) {
		log.debug(this.getClass().getName().toString());
		return this.restTemplate.postForObject("http://springcloud-eureka-order/order2", id, String.class);
	}
}

OrderController

/**
	 * 通过id查询订单
	 */
	@PostMapping("/order2")
	public String findOrderById2(@RequestParam String id) {
		Order order = new Order(id, 8.8, "小明", "北京", "13333333333");
		return order.toString();
	}

访问http://localhost:8001/findOrdersByUser5/5结果如下
在这里插入图片描述
其余重载方法和getForEntity()一样,就不在一一赘述了…
在这里插入图片描述
在这里插入图片描述
      2.postForObject()
     如果只关注,返回的消息体,可以直接使用postForObject。用法和getForObject一致。
在这里插入图片描述
在这里插入图片描述
      3.postForLocation()
postForLocation也是提交新资源,提交成功之后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置。
在这里插入图片描述
在这里插入图片描述

  1. put请求
    在这里插入图片描述
    方法示例:在这里插入图片描述
  2. delete请求
    在这里插入图片描述
    方法示例:
    在这里插入图片描述

好了 resttemplate总结一下就是get post put delete 各有三种重载方法 , 参数变化一下就好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章