调测http扩展时,发现转换器序列号中的url只能配置一级,如只支持green
格式,不支持green/1/2/3
之类多级。
问题分析
查看HttpController源码:
@RequestMapping(value = "/uplink/{converterId}", method = RequestMethod.POST)
public void handleRequest(@PathVariable String converterId,
@RequestBody String body) throws Exception {
发现是使用springmvc的@PathVariable来匹配路径,而@PathVariable只支持一级路径,如下是大佬的原话:
它在做匹配时直接会把green/report切成green和report两段,每段去和pattern的每一段匹配。
大佬给出的建议是:
- 修改antmatcher源码
- /**去匹配,然后手工去拿最后一段
选择了第二种方法,比较方便。
带着问题找答案,找到一篇文章:
https://blog.csdn.net/jiangxuexuanshuang/article/details/51720362
源码修改
把路径匹配的/uplink/{converterId}
改成用/**
去匹配:/uplink/**
,然后写方法去提取这个**
里面的内容。
@RequestMapping(value = "/uplink/**", method = RequestMethod.POST)
public void handleRequest(HttpServletRequest request,
@RequestBody String body) throws Exception {
String converterId = extractPathFromPattern(request);
service.processRequest(converterId, null, body);
}
private String extractPathFromPattern(final HttpServletRequest request) {
String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
}
测试
至thingsboard的设备管理下配置完网关的http扩展后,使用postman测试新增的http转换器:
总结
暂无