调测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的每一段匹配。

大佬给出的建议是:

  1. 修改antmatcher源码
  2. /**去匹配,然后手工去拿最后一段

选择了第二种方法,比较方便。
带着问题找答案,找到一篇文章:
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转换器:

总结

暂无