Vertx 网络路由 - 多个主体处理程序

Vertx web routing - multiple body handlers

我正在通过 Vertx 中的 REST 上传文件。我正在现有项目中实现它,因此已经有很多路由定义。我在为我的上传路径定义正文处理程序时遇到问题。在现有的路由定义中,首先定义 body handler 如下:

router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));

这应该为所有传入请求设置此正文处理程序。现在在代码的后面我想为上传定义特殊的主体处理程序:

router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));

但这不起作用。 BodyHandler 不是 "overriden"。它仅在我首先定义上传定义时有效,在 "common" 主体处理程序之前。所以这对我有用:

router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));

但我想知道有没有办法先定义一个通用的处理程序,然后一些路由可以定义另一个处理程序。谢谢

我认为这是不可能的。我也为此苦苦挣扎。根据我的经验,vert.x 有一个匹配第一个可能的注册路由的路由匹配算法。这意味着如果你有

router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));

然后它将首先与router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));匹配,如果您尝试通过另一个body处理程序运行请求,它将抛出错误。

如果是:

router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));

它将首先匹配您的 body 处理程序并忽略另一个,因为它已经匹配了路径的一部分。

您可以在

中添加一个 if 子句
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));

"/upload/path" 上,您只需调用 next() 而不是 body 处理程序,但我认为这不是一个好的解决方案。

您不能 "override" 处理程序。 BodyHandler 任务是在传入请求中设置适当的处理程序并解析请求正文。这些事件只会触发一次,因此如果您添加多个处理程序,则只有第一个匹配的处理程序才能处理这些事件。

您可能不需要让多个处理程序拥有一个可以解析请求正文并在路由上下文中填充表单数据和文件上传属性的顶级处理程序。所以如果你想让它有不同的表现,上传到不同的位置你可以只执行文件移动操作。

如果您需要完全不同的配置,那么您需要指定不相交的路线,例如:

router.post("/upload/path")
  .handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route("/something/else")
  .handler(BodyHandler.create().setBodyLimit(1024*1024));

如您所见,2 个路由器不同,只有 1 个匹配,让您拥有正确的上传配置。