SpringCloud中的Feign远程调用接口传参失败问题
作者:hidecode
这篇文章主要介绍了SpringCloud中的Feign远程调用接口传参失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Feign远程调用接口传参失败
我在做一个微服务调用的时候出现了被调接口传参失败问题
Feign是通过http协议调用服务的,后来发现是因为Gep和Maping不一致,还有使用feign时要记得给实体类加无参构造注解
同时这些注解都尽量一致,不然微服务调bug很麻烦。
这是调用者
这是feign的client
这是被调者
Feign远程调用的注意点
在使用feign的过程中遇到了一些问题,所以在这里做以下总结:
定义的做远程调用的api接口
中的方法参数列表中的参数都必须都要打上@RequestParam(“value”) 注解**,否则调用会报405异常,这一点是和controller中不一样的,controller中的方法只要参数名和前台传入的参数键名对应上就能自动绑定上参数
复杂类型用必须打上@RequestBody注解
service微服务中的Controller的参数绑定
如果参数列表中有复杂类型,请使用Post请求,使用Get请求会报Bad Request错误,且需要打上@RequestBody注解,而普通基本类型可以不用打上@RequestParam注解可自动绑定参数
如有其它问题,也欢迎补充,放一下代码:
api:
@FeignClient("MS-ADMIN-SERVICE") public interface FixFeignService { @GetMapping("/fix") public List<FixInfo> findAll(); @PostMapping("/fix/add") public int insert(@RequestBody FixInfo fixInfo); @PostMapping("/fix/limitByParam") public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo, @RequestParam("page") Integer page, @RequestParam("limit") Integer limit); @PostMapping("/fix/delByIds") public boolean delByIds(@RequestParam("ids[]") Long[] ids); @GetMapping("/fix/findById") public FixInfo findById(@RequestParam("id") Long id); @PostMapping("/fix/update") boolean update(@RequestBody FixInfo fixInfo); }
service微服务
@RestController @RequestMapping("/fix") @Slf4j public class FixInfoController { @Autowired private FixInfoService fixInfoService; @GetMapping("") public List<FixInfo> findAll(){ List<FixInfo> all = fixInfoService.findAll(); return all; } @PostMapping("/add") public int insert(@RequestBody FixInfo fixInfo){ return fixInfoService.insert(fixInfo); } @PostMapping("/limitByParam") public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo,Integer page,Integer limit){ LayUIPageBean layUIPageBean = new LayUIPageBean(); PageHelper.startPage(page,limit); List<FixInfo> all = fixInfoService.findByParam(fixInfo); PageInfo<FixInfo> pageInfo = new PageInfo<>(all); return layUIPageBean.setCount((int)pageInfo.getTotal()).setData(pageInfo.getList()); } @PostMapping("/delByIds") public boolean delByIds(@RequestParam("ids[]") Long[] ids){ //log.info("id"+ids[0]); boolean flag= fixInfoService.delByIds(ids); return flag; } @GetMapping("/findById") public FixInfo findById(Long id){ return fixInfoService.findById(id); } @PostMapping("/update") public boolean update(@RequestBody FixInfo fixInfo){ return fixInfoService.update(fixInfo); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。