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數組,和其他屬性組裝成一個對象進行傳遞)
