在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参数和服务接收一致。
版权声明:本文为byy8023原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。