天天看點

springcloud-feign傳參springcloud-feign傳參

springcloud-feign傳參

1.簡單參數傳遞

傳遞單個參數或者多個參數,get方式傳參,但是會有長度大小限制,如果參數過多最好使用body傳參,樓主有一個 功能是使用feign傳遞文章,結果參數太長傳不了-,-

單個參數傳遞

調用方參數名要與feign用戶端接受的參數名稱一緻,并且@RequestParam注解一定要加,get方式

調用方:

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傳遞檔案,研究了一下,以下代碼可以實作:

調用方:

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循環外面來了,費了很大勁老麻煩了,總之第一次用會碰到很多很多坑…

繼續閱讀