1. 程式人生 > >Spring Cloud-07Feign構造多引數GET/POST請求

Spring Cloud-07Feign構造多引數GET/POST請求

文章目錄

概述

Spring Cloud-06服務消費者整合Feign中將消費者和Feign整合在了一起,示例中Feign客戶端介面中的引數只有1個,如下
在這裡插入圖片描述

實際開發中,多個請求非常常見,如果請求引數有多個呢? 我們使用Feign該如何呼叫請求呢?


呼叫順序

在這裡插入圖片描述

當瀏覽器或者外部其他請求請求到MovieController,MovieController需要呼叫UserController服務提供者提供的服務,MovieController會通過介面UserFeignClient來實現呼叫。 在UserFeignClient介面方法裡,通過對映UserController的REST API實現呼叫對端服務。

服務端對外提供的rest風格的請求如下
在這裡插入圖片描述


Feign構造多引數GET請求

我們知道Spring Cloud為Feign添加了Spring MVC的註解支援,那按照Spring MVC那種寫法試試?

MovieController中定義一個接受外部請求的方法,對映/movie/getA的請求

@RestController
@Slf4j
public class MovieController {
	
 @Autowired
 private UserFeignClient userClient;
	
  @GetMapping("/movie/getA")
  public
User findUser(User user) { log.info("get進入服務消費者 MovieController.findUser"); return userClient.finUser(user); } }

在Feign介面中,定義finUser方法,和服務端UserController暴露的url一致


@FeignClient("microservice-provider-user")
public interface UserFeignClient {
	@RequestMapping(method = RequestMethod.GET, value =
"/get") public User finUser(User user); }

可以看到 value = “/get” ,和服務提供者的請求url保持一致,這樣就能可以呼叫到該服務。
在這裡插入圖片描述

那試下吧

  1. 啟動microservice-discovery-eureka微服務,Eureka Server
  2. 啟動micorservice-provider-user,服務提供者
  3. 啟動micorservice-consumer-movie-fegin,服務消費者

訪問 http://localhost:7901/movie/getA?username=小工匠&age=10

傳遞了2個引數,都是User類的兩個屬性,按照Spring MVC的邏輯,肯定是可以自動轉換的,但這裡報錯了
在這裡插入圖片描述

儘管我們指定了GET方法,Feign依然會使用POST方法傳送請求。

那該如何寫呢?

url引數和方法引數一一對應

URL有幾個引數,Feign介面中的方法就有幾個引數。使用@RequestParam註解指定請求的引數是什麼

MovieController層
在這裡插入圖片描述

Feign介面

	/**
	 * 
	 * @param username
	 * @param age
	 * @return
	 * @desc get的url中有幾個引數,Feign介面的方法中就定義幾個引數,使用@RequestParam註解指定請求的引數是什麼
	 * 		 必須要加上@RequestParam註解,否則啟動報錯。
	 * 		
	 */
	@RequestMapping(method = RequestMethod.GET, value = "/get")
	public User finUser(@RequestParam("username") String username ,@RequestParam("age") Integer age);
	

在這裡插入圖片描述

服務提供者保持不變。

  1. 啟動microservice-discovery-eureka微服務,Eureka Server
  2. 啟動micorservice-provider-user,服務提供者
  3. 啟動micorservice-consumer-movie-fegin,服務消費者

訪問 http://localhost:7901/movie/getB?username=小工匠&age=10

在這裡插入圖片描述


map接收

多引數的URL也可使用Map來構建。當目標URL引數非常多的時候,可使用這種方式簡化Feign介面的編寫。

MovieController增加個新的方法便於測試

  @GetMapping("/movie/getC")
  public User findUser3(User user) {
	  log.info("get2進入服務消費者 MovieController.findUser3");
	  Map<String, Object> map = new HashMap<String, Object>() {
		  {
			  put("username",user.getUsername());
			  put("age",user.getAge());
		  }
	  };
	  return userClient.finUser(map);
  }

Feign介面

	/**
	 * 
	 * @param map
	 * @return
	 * @desc 使用map來接收get請求的多個引數,@RequestParam不可少
	 */
	@RequestMapping(method = RequestMethod.GET, value = "/get")
	public User finUser(@RequestParam Map<String, Object> map);

服務提供者保持不變。

  1. 啟動microservice-discovery-eureka微服務,Eureka Server
  2. 啟動micorservice-provider-user,服務提供者
  3. 啟動micorservice-consumer-movie-fegin,服務消費者

http://localhost:7901/movie/getC?username=小工匠xxxx&age=9999

在這裡插入圖片描述


Feign構造多引數POST請求

如何使用Feign構造包含多個引數的POST請求 ?

假設服務提供者的Controller是這樣編寫的:

@RestController
public class UserController {
  @PostMapping("/post")
  public User post(@RequestBody User user) {
    ...
  }
}

如何使用Feign去請求呢?

@FeignClient(name = "microservice-provider-user")
public interface UserFeignClient {
  @RequestMapping(value = "/post", method = RequestMethod.POST)
  public User post(@RequestBody User user);
}

實際工作中的使用
在這裡插入圖片描述


原始碼

https://github.com/yangshangwei/SpringCloudMaster