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保持一致,這樣就能可以呼叫到該服務。
那試下吧
- 啟動microservice-discovery-eureka微服務,Eureka Server
- 啟動micorservice-provider-user,服務提供者
- 啟動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);
服務提供者保持不變。
- 啟動microservice-discovery-eureka微服務,Eureka Server
- 啟動micorservice-provider-user,服務提供者
- 啟動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);
服務提供者保持不變。
- 啟動microservice-discovery-eureka微服務,Eureka Server
- 啟動micorservice-provider-user,服務提供者
- 啟動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);
}
實際工作中的使用