Feign調用接口時,都是需要進行參數傳遞的,一般可以分為兩類
- 字符串參數傳遞,比如xml、json、string等
- 對象參數傳遞
字符串參數傳遞(@RequestParam)
@RequestParam注解用來接收字符串類型參數,有以下注意點
- 客戶端@RequestParam注解的value屬性必須指定值,不能為空,且要和服務端接口參數名保持一致
- 如果需要傳遞多個字符串參數,則使用多個@RequestParam注解與服務端接口參數保持一一對應即可
服務端
@ResponseBody @PostMapping(value = "check") public CheckAckVo check(String jsonParam) { FileCheckVo fileCheckVo = JacksonUtil.jsonToBean(jsonParam, FileCheckVo.class); return checkAck(taskId, OpStatusEnum.SUCCESS.getCode()); }
客戶端
@FeignClient(value = "act-engine-web", fallbackFactory = PlatformUserFeignServiceFallBack.class) public interface PlatformUserFeignService { @RequestMapping(value = "/engine/check", method = RequestMethod.POST) String check(@RequestParam(value = "jsonParam") String jsonParam); }
對象參數傳遞(@RequestBody )
@RequestBody注解用來接收字符串類型參數,有以下注意點
- @RequestBody 注解在服務端和客戶端都需要使用
- 參數名和參數類型在服務端和客戶端需要保持一致
服務端
@ResponseBody @PostMapping(value = "check") public CheckAckVo check(@RequestBody FileCheckVo fileCheckVo) { //使用對象參數傳遞,則不需要再使用jackson進行轉化 //FileCheckVo fileCheckVo = JacksonUtil.jsonToBean(jsonParam, FileCheckVo.class); return checkAck(taskId, OpStatusEnum.SUCCESS.getCode()); }
客戶端
@FeignClient(value = "act-engine-web", fallbackFactory = PlatformUserFeignServiceFallBack.class) public interface PlatformUserFeignService { @RequestMapping(value = "/engine/check", method = RequestMethod.POST) String check(@RequestBody FileCheckVo fileCheckVo); }
思考
- @RequestBody 進行對象參數傳遞時,需要引入參數類型依賴(FileCheckVo),此時最好是將這個依賴放入公共依賴包中,否則會增加服務端和客戶端的耦合度。
- 個人感覺@RequestBody 更多的用於系統間進行文件傳遞等(將文件讀為byte數組,和其他屬性組裝成一個對象進行傳遞)