springcloud-feign传参
1.简单参数传递
传递单个参数或者多个参数,get方式传参,但是会有长度大小限制,如果参数过多最好使用body传参,楼主有一个 功能是使用feign传递文章,结果参数太长传不了-,-
单个参数传递
调用方参数名要与feign客户端接受的参数名称一致,并且@RequestParam注解一定要加,get方式
调用方:
ZhuowenR<List<WarningExtendInfoDTO>> warningFeignResult = remoteEqpService.getWarningInfoByMacAndPathAddr(jsonStr);
feign客户端:
@GetMapping("/eqpeqp/getWarningInfoByMacAndPathAddr")
ZhuowenR<List<WarningExtendInfoDTO>> getWarningInfoByMacAndPathAddr(@RequestParam("jsonStr") String jsonStr);
多个参数传递
传递多个参数我一般使用map传参,get方式
@GetMapping("/eqpproject/list")
ZhuowenR<List<EqpProjectEntity>> list(@RequestParam Map<String, Object> params);
传递数组
feign不能直接传递数组,不然接收到数据会改变,或者出现未知的bug,我被这个坑给坑了好久,最后使用json解决,废话不多说,直接上代码
调用方:
JSONObject jsonObject = new JSONObject();
jsonObject.put("list", JSON.toJSONString(eqpList));//添加到json
String jsonStr = jsonObject.toJSONString();
ZhuowenR<List<WarningExtendInfoDTO>> warningFeignResult = remoteEqpService.getWarningInfoByMacAndPathAddr(jsonStr);
feign客户端:
@GetMapping("/eqpeqp/getWarningInfoByMacAndPathAddr")
ZhuowenR<List<WarningExtendInfoDTO>> getWarningInfoByMacAndPathAddr(@RequestParam("jsonStr") String jsonStr);
feign方法:
@RequestMapping("/getWarningInfoByMacAndPathAddr")
public List<WarningExtendInfoDTO> getWarningInfoByManAndPathAddr(@RequestParam("jsonStr") String jsonStrString jsonStr) {
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
JSONArray listJson = jsonObject.getJSONArray("list");//转成数组
List<EqpInfoDTO> dtoList = listJson.toJavaList(EqpInfoDTO.class);//转成数组对象
List<WarningExtendInfoDTO> list = baseMapper.getWarningInfoByManAndPathAddr(dtoList);
return list;
}
首先参数名要都一一对应,调用方把List数组put到Json对象中,再转成Json字符串,在feign方法中把Json字符串在转换成数组进行操作
2.使用对象传递参数
传递的参数太长时,就需要使用对象来传递参数,
调用方直接把entity实体传入方法中,这个比较简单
feign调用方:
@PostMapping("/user/bannerList")
ZhuowenR<List<SysUser>> bannerList(@RequestBody BannerMsgDTO bannerMsgDTO);
必须使用post方式传参,并且必须使用@RequestBody
feign方法也要用@RequestBody注解
@PostMapping("/bannerList")
public ZhuowenR<List<SysUser>> bannerList(@RequestBody BannerMsgDTO bannerMsgDTO) {}
使用对象传参比较简单,和普通传参的区别是必须使用post方式和使用@RequestBody注解(暂时没发现其他有什么区别)
3.传递文件
楼主还用到使用feign传递文件,研究了一下,以下代码可以实现:
调用方:
ZhuowenR<Map<String, Object>> feignResult = remoteFtpService.uploadPackage(file, version);
feign客户端:
@PostMapping(value = "/uploadfile/app/uploadPackage",produces = { MediaType.APPLICATION_JSON_UTF8_VALUE }, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ZhuowenR<Map<String, Object>> uploadPackage(@RequestPart(value = "file") MultipartFile file,
@RequestParam("version") String version);
这样就可以用feign传递MultipartFile 类型文件了,总的来说不是很难
总结
feign传递参数总会出现各种各样的bug,坑还是很多,楼主刚开始还把feign调用写到for循环中了,
项目做完之后才发现不能这样做,feign调用是有限制的,for循环中调用可能会被熔断,好像是跟线程池有关系,最大调用feign的数量是有限制的,最后把feign调用都提到for循环外面来了,费了很大劲老麻烦了,总之第一次用会碰到很多很多坑…