springboot 中ResTemplate.getForObject请求如何处理带有list集合的map

在springboot项目中,我们经常会用@requestParam注解接收GET请求,在用resTemplate.getFobject(String url, Class<T> responseType, Map<String, ?> uriVariables)方法请求其他服务时,会出现接收不到值的请求,需要我们在URL上做拼接处理,示例为:http://10.10.8.60:19051/wmsInnerCenter/warehouse/put/queryPlanPutGoodsByOrderType?name={name}。

name对应map中的key即所请求服务的方法参数名称。但是当map中传输list集合时我们需要做进一步处理,下面是我写的一个测试方法,希望能对迷途的同僚有所帮助。

**
 * @ClassName TestResTemplateController
 * Description
 * @Author ${白杨洋}
 * @Date 2020/5/12 10:25
 * @Version 1.0
 **/
@RestController
@RequestMapping(value = "/resTemplate")
@Slf4j
public class TestResTemplateController extends BaseController {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private WarehousePutProperties warehousePutProperties;

    /**
     * 测试resTemplate  GET请求
     */
    @GetMapping(value = "/getForMap")
    public ResponseMessage getForMap(@RequestParam("putIds")List<Long> putIds, @RequestParam("goodsSpecRealIds") List<Long> goodsSpecRealIds,@RequestParam("orderType") Integer orderType){

        Map<String,Object> map = new LinkedHashMap<>();
        map.put("putIds",putIds);
        map.put("goodsSpecRealIds",goodsSpecRealIds);
        map.put("orderType",orderType);
        String res = getForMap(map);
        log.info("查询得到的结果为{}",res);
        return successMessage();
    }
    private String getForMap(Map<String,Object> map){
        
        String url = warehousePutProperties.getQueryPlanPutGoodsByOrderType();
        List<Object> objectList =new ArrayList<>();
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Object> entry = iterator.next();
            log.info("获取当前map的值为{}",entry);
            String key = entry.getKey();
            log.info("获取到的map的key值为{}",key);
            Object o = entry.getValue();
            if(o instanceof List){
                List<Object> list = (List<Object>)o;
                if(VerifyUtil.verifyCollection(list)){
                    objectList.addAll(list);
                    url=getRequestUrl(url,list,key);
                }
            }else{
                if(VerifyUtil.verifyObject(o)){
                    objectList.add(o);
                    url=getRequestUrl(url,Arrays.asList(o),key);
                }
            }
        }
        if(VerifyUtil.verifyCollection(objectList)){
            Object[] array = objectList.toArray();
            log.info("请求的路径为{}",url);
            String res = restTemplate.getForObject(url, String.class, array);
            log.info("根据入库单查询应入库信息的结果为{}",res);
            return res;
        }
        return null;
    }
    /**
     * 拼接请求url
     */
    private String getRequestUrl(String url,List<Object> list,String key){
        for (int i = 0; i < list.size(); i++) {
            if(url.contains("?")){
                url+="&"+key+"="+"{"+i+"}";
            }else{
                url+="?"+key+"="+"{"+i+"}";
            }
        }
        return url;
    }
}

提醒大家一句,为了保证map迭代的顺序和map存值的顺序一样,我们需要用LinkedHashMap实例,这样就能保证包装的url参数和服务接收一致。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值