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 各有三種重載方法 , 參數變化一下就好了

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