javascript
Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求
文章目錄
- 概述
- 調用順序
- Feign構造多參數GET請求
- url參數和方法參數一一對應
- map接收
- Feign構造多參數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 {@Autowiredprivate 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保持一致,這樣就能可以調用到該服務。
那試下吧
訪問 http://localhost:7901/movie/getA?username=%E5%B0%8F%E5%B7%A5%E5%8C%A0&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);服務提供者保持不變。
訪問 http://localhost:7901/movie/getB?username=%E5%B0%8F%E5%B7%A5%E5%8C%A0&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);服務提供者保持不變。
http://localhost:7901/movie/getC?username=%E5%B0%8F%E5%B7%A5%E5%8C%A0xxxx&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); }用POSTMAN模擬下即可 ,注意Body是JSON格式
實際工作中的使用
源碼
https://github.com/yangshangwei/SpringCloudMaster
總結
以上是生活随笔為你收集整理的Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue2.x-03使用vue-cli搭建
- 下一篇: Spring Cloud【Finchle