springcloud-feign传参

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循环外面来了,费了很大劲老麻烦了,总之第一次用会碰到很多很多坑…

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值