Vert.x - vertx-web 路由讲解总结

article/2025/8/21 5:51:31

在这里插入图片描述

一、vertx-web

上篇文章我们对 vertx 进行了简单的介绍,并使用 vertx-web 实践了 restFul 接口的书写,本篇文章接着上篇继续讲解 vertx-web 的路由。

下面是上篇文章的地址:

https://blog.csdn.net/qq_43692950/article/details/123955368

对于环境的搭建请参考上篇文章的内容。

二、vertx-web 路由

1. 精确匹配

精确路径是日常开发中常用的方式,精确匹配到某个接口。

router.get("/test1").handler(ctx -> {ctx.response().end("success");
});

在这里插入图片描述

2. 路径前缀的匹配

有的时候可能需要匹配以某某为开头的请求,此时可以使用路径前缀的路由,在vertx 中可以使用 * 代表路径,如:

router.get("/test/*").handler(ctx -> {String url = ctx.request().absoluteURI();ctx.response().end(url+"--> success");
});

在这里插入图片描述
还可以通过这种方式还可以对接口进行拦截或处理:

router.get("/test/*").handler(ctx -> {String url = ctx.request().absoluteURI();if (Objects.isNull(ctx.request().getParam("p"))){ctx.response().end("参数为空!");return;}ctx.next();
});
router.get("/test/abc").handler(ctx -> {String url = ctx.request().absoluteURI();ctx.response().end(url+"--> success2");
});

上面以/test开头的必须要携带 p 参数:
在这里插入图片描述
在这里插入图片描述

3. 获取路径上的参数

SpringMVC 中我们可以通过 @PathVariable 获取路径上的参数,在 vertx 中同样也是可以的,可以使用 :参数名 的方式,如:

router.get("/pathParam/:name/:age").handler(ctx -> {String name = ctx.pathParam("name");String age = ctx.pathParam("age");ctx.response().end(name+"  "+age);
});

在这里插入图片描述

4. 使用正则表达式进行匹配

前面有使用 * 的方式来匹配任意后缀的请求,但使用正则的话可以满足基本任何规则的匹配,在 vertx 正则的方法都带有WithRegex
在这里插入图片描述
基本上常用的请求方式都支持正则,如匹配abc结尾的后缀:

router.getWithRegex(".*abc").handler(ctx->{String url = ctx.request().absoluteURI();ctx.response().end(url + "--> success");
});

在这里插入图片描述

5. 路由顺序

上面路径前缀的匹配说到可以利用这个进行请求的拦截,其实就是使用的 vertx 中的路由顺序,在 vertx 中,声明同一个 url 不会进行覆盖而是都会加载到该 url 请求的列表中,默认进入第一个请求,可以通过 ctx.next() 执行下一个,如:

router.get("/shunxu").handler(ctx -> {if (Objects.isNull(ctx.request().getParam("p"))) {ctx.response().end("没有传递参数!");} else {ctx.next();}
});
router.get("/shunxu").handler(ctx -> {ctx.response().end("参数: " + ctx.request().getParam("p"));
});

在这里插入图片描述
在这里插入图片描述

6. 限制请求的MIME类型

有时候我们的接口可能只想接收 Content-Type=application/json的请求,其他的都不接收,可以通过 consumes 进行限制,并且在 vertx 中还提供了ctx.is 可以用来判断请求的类型是否属于某一类:如:

router.get("/mime").consumes("application/json").handler(ctx -> {String header = ctx.request().getHeader("Content-Type");boolean b = ctx.is("application/json");boolean b1 = ctx.is("application/json;charset=UTF-8");boolean b2 = ctx.is("text/json");ctx.response().putHeader("Content-Type","text/html").end(header + " , " + b + " , " + b1 + " , " + b2);});

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出限制是包含关系。

7. VirtualHost 限制

有些情况我们的接口可能只允许某个 host 的请求,此时就可以使用 VirtualHost ,如限制为127.0.0.1 则使用 localhost 则访问不同 :

router.get("/virtualHost").virtualHost("127.0.0.1").handler(ctx->{String url = ctx.request().absoluteURI();ctx.response().end(url + "--> success");
});

在这里插入图片描述
在这里插入图片描述

8. 上下文数据传递

在上面说请求顺序的时候,涉及到多个 请求handler , 而多个 handler 之间也是可以传递数据的,可以通过 ctx.put 进行:

router.get("/put").handler(ctx->{String p = ctx.request().getParam("p");ctx.put("p",p+"123");ctx.next();
}).handler(ctx->{Optional.ofNullable(ctx.get("p")).map(String::valueOf).ifPresent(p->{ctx.response().end(p);});
});

在这里插入图片描述

9. 重定向

在vertx 中直接使用 ctx.redirect 即可实现重定向,如:重定向到百度:

router.get("/redirect").handler(ctx -> {ctx.redirect("http://www.baidu.com");
});

在这里插入图片描述

重定向到内部其他接口:

router.get("/redirect").handler(ctx -> {ctx.redirect("/test");
});

10. 返回JSON

vertx 中返回 json ,可以直接使用提供的 ctx.json 即可,传入一个 JsonObject

router.get("/getJson").handler(ctx -> {JsonObject jsonObject = new JsonObject().put("code", "200").put("message", "success");ctx.json(jsonObject);
});

在这里插入图片描述

11. 失败处理

在逻辑执行时,如果遇到异常此时没有捕获的话就会返回 500 ,对此 vertx 提供了 failureHandler ,来捕获异常,有点类似于服务的降级,failureHandler 可以全局捕获也可以针对某个请求:

router.get("/err").handler(ctx -> {int a = 1 / 0;
}).failureHandler(ctx -> {ctx.response().end("请求异常:" + ctx.failure().getMessage());
});

在这里插入图片描述
全局捕获:

router.route().failureHandler(ctx->{ctx.response().end("请求异常:" + ctx.failure().getMessage());
});router.get("/err").handler(ctx -> {int a = 1 / 0;
});

12. 文件上传

vertx 的文件上传已经帮我们做了简化,直接使用BodyHandler进行处理即可,文件默认放在当前的 file-uploads 下,并且为了防止重名,存在该目录下的并不是我们上传的文件名,而是 UUID,到我们自己的 handler 中只需使用 ctx.fileUploads 即可获取到上传的文件信息。

注意点:本篇文章采用的 vertx 版本为 4.1.8 ,如果整合 SpringBoot ,需要使用 2.2.X的版本,如果是 2.3.X 上传文件会卡住,解决办法是使用 vertx 4.2.x 的版本在 SpringBoot 2.3.X 是正常的。

router.post("/fileupload").handler(BodyHandler.create().setHandleFileUploads(true).setBodyLimit(5*1024*1024).setPreallocateBodyBuffer(true)).handler(ctx -> {Set<FileUpload> set = ctx.fileUploads();System.out.println("上传文件数:"+set.size());if (set.isEmpty()) {ctx.response().end("文件为空!");return;}set.forEach(f -> {System.out.println("name: "+f.name());System.out.println("fileName: "+f.fileName());System.out.println("uploadedFileName: "+f.uploadedFileName());});ctx.response().end("success");});

在这里插入图片描述
在这里插入图片描述
下面是上传到服务的文件:
在这里插入图片描述

13. 静态资源

Vertx 带有开箱即用的 StaticHandler 实例处理静态资源,用于处理静态Web资源,默认静态文件目录为 webroot。

router.route("/static/*").handler(StaticHandler.create());

在这里插入图片描述
在这里插入图片描述

14. 允许跨域

Vertx 中跨域也有开箱即用的 CorsHandler,首先写一个普通接口:

router.get("/cors").handler(ctx -> {ctx.response().end("success");
});

使用 ajax 调用上面的接口:

$.ajax({url: "http://localhost:8090/cors",type: "get",success: function (result) {console.log(result)}
});

浏览器请求:
在这里插入图片描述
出现了跨域的错误,下面添加跨域的允许:

router.route().handler(CorsHandler.create().addOrigin("*").allowedHeader(" x-www-form-urlencoded, Content-Type,x-requested-with").allowedMethod(HttpMethod.GET).allowedMethod(HttpMethod.POST).allowedMethod(HttpMethod.PUT).allowedMethod(HttpMethod.DELETE));

再次刷新页面:
在这里插入图片描述
在这里插入图片描述
喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!


http://chatgpt.dhexx.cn/article/1ovuHbLC.shtml

相关文章

vertx的http服务实现分布式session

vetrx是基于netty封装的java网络编程框架&#xff0c;比netty开发较为简单&#xff0c;在其基础上提供很多有用功能&#xff0c;能在较短的时间内开发一个http服务器&#xff0c;或其他网络服务。今天我们展示下如何为vertx开发http网关实现分布式session,实现参考spring sessi…

Vert.x入门1 —— 《基础概念》

一、什么是Vertx Vert.x 在JVM上构建响应式应用程序的工具包&#xff0c;Vert.x不是框架而是工具包。Vert.x基于Netty项目&#xff0c;该项目是JVM的高性能异步网络库。 此描述中有三个重要点&#xff1a;工具包&#xff0c;响应式和“在JVM上”。 首先&#xff0c;Vert.x是…

Vertx快速入门参考

Vertx学习 什么是vertx&#xff1f; Vert.x最大的特点就在于异步&#xff08;底层基于Netty&#xff09;&#xff0c;通过事件循环&#xff08;EventLoop&#xff09;来调起存储在异步任务队列&#xff08;CallBackQueue&#xff09;中的任务&#xff0c;大大降低了传统阻塞模…

Vertx入门学习(含代码)

Vertx入门学习 一、Vertx是什么&#xff1f;二、Vertx基本概念三、Vertx能干什么&#xff1f;四、Vertx的技术体系五、快速体验&#xff1a;搭建一个简单的Vertx项目并输出Hello World六、单元测试总结 一、Vertx是什么&#xff1f; github: https://github.com/vert-x3 官网&…

Vert.x(vertx) 简明介绍

摘要 Vert.x最大的特点就在于异步&#xff08;底层基于Netty&#xff09;&#xff0c;通过事件循环&#xff08;EventLoop&#xff09;来调起存储在异步任务队列&#xff08;CallBackQueue&#xff09;中的任务&#xff0c;大大降低了传统阻塞模型中线程对于操作系统的开销。因…

Vertx学习一:这玩意是到底是个啥

Vertx&#xff0c;融合Java、Ruby、Python等语言的高性能架构&#xff0c;架构师必读 原文链接&#xff1a; http://www.360doc.com/content/18/0203/14/39530679_727432611.shtml 目录&#xff1a; 一、Vert.x简介 二、Vert.x原理解析 三、Vert牛刀小试 四、Vert应用实践 五…

【java】vertx从入门到放弃——入门(四)Codec

什么是Codec&#xff1f;概念这个玩意我是真不想说&#xff0c;毕竟我没有找到具体的概念&#xff0c;我自己大致的理解就是&#xff0c;用EventBus传输类的时候&#xff0c;对这个类进行序列化和反序列化的东西&#xff0c;因为vertx使用json进行传输&#xff0c;所以这个玩意…

Android thinker

国家虽安&#xff0c;忘战必危&#xff0c; Android虽爽&#xff0c;不学则忙&#xff0c;老夫纵横江湖数十载&#xff0c;深谙世事之难料&#xff0c;顾。。 ok&#xff0c;ok 不装比了&#xff0c;进入正题&#xff0c;今天要讲的是Android 热修之 thinker。 在研究这个之前…

ESP32-CAM AI THINKER 引脚排列:GPIO 用法说明

ESP32-CAM 是一款开发板,带有一个 ESP32-S 芯片、一个 OV2640 摄像头、microSD 卡插槽和几个用于连接外设的 GPIO。在本指南中,我们将介绍 ESP32-CAM GPIO 以及如何使用它们。 引脚排列图 下图显示了 ESP32-CAM AI-Thinker 的引脚排列图。 电路原理示意图 下图显示了 ESP…

Thinkpad 各系列简介

ThinkPad 各系列简介 如果提到商务笔记本&#xff0c;大家一定会想到凭借坚固和可靠的特性在业界享有很高声誉ThinkPad笔记本电脑&#xff0c;以及ThinkPad那经典的键盘红点设计和纯黑低调的外表。 在这里我就简单介绍一下ThinkPad的各系列产品。 Thinkpad名称来历 “ThinkP…

python thinker canvas create_arc 使用详解

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/A757291228/article/details/106739556 ———————————————— 版权声明&#xff1a;本文…

二、让界面动起来,Python基于thinker实现的简单的俄罗斯方块小游戏

文章目录 界面动起来定时刷新页面移动俄罗斯方块 界面动起来 **功能&#xff1a;**如何让方块「动起来」? 分析过程&#xff1a; 要想让方块动起来&#xff0c;需要实现以下两点&#xff1a; 定时刷新页面移动页面内部的俄罗斯方块 定时刷新页面 实现定时刷新页面&#xff…

三、生成随机方块,Python基于thinker实现的简单的俄罗斯方块小游戏

文章目录 生成第一步&#xff1a;随机生成方块对象第二步&#xff1a;修改游戏运行方法 固定第一步&#xff1a;记录固定的方块第二步&#xff1a;修改check_move方法 左右移动第一步&#xff1a;左右移动方块第二步&#xff1a;绑定键盘 旋转第一步&#xff1a;添加旋转方法第…

【G-thinker】G-thinker部分源码解析

一、main 子图匹配程序run.cpp中主要使用到worker.h和comper.h分别对应线程和进程单位&#xff0c;接下来我们从main函数入手解析源码 从主函数可以看到&#xff0c;子图匹配程序中GMatchWorker继承了worker&#xff0c;主函数声明了workerparams并且传入了路径和线程参数&am…

python用thinker库制作一个进制转换器(可打包exe)

进制类型分为&#xff1a; 二进制 字母B表示 八进制 字母O表示 十进制 字母D表示 十六机制 字母H表示 进制转换之间很麻烦&#xff0c;还得计算&#xff0c;如果可以做一个进制转换器多nice&#xff0c;其实也不难&#xff0c;就利用一个tkinter库就能制作&#xff0c;废话不多…

Thinker Board 2开发板上使用奥比中光 astra 深度相机

Thinker Board 2 国产开发板 arm架构 上使用奥比中光 astra 深度相机 准备工作 1、下载astraSDK 选择linux_arm 下载 https://developer.orbbec.com.cn/download.html?id53 2、下载openNI https://dl.orbbec3d.com/dist/openni2/OpenNI_2.3.0.66.zip 开始安装 1、安装fre…

think

我167&#xff0c;97斤&#xff0c;胸d&#xff0c;腰很细&#xff0c;反手轻松摸肚脐那种&#xff0c;骨架小&#xff0c;总结就是身高刚好人瘦胸大屁股大腿细腰细肤白。走路腰杆能挺到天上&#xff0c;气质挺好。漂亮女生太多了&#xff0c;想取胜只能从气质下手了。脸呢&…

Python基于thinker实现的简单的俄罗斯方块小游戏源代码:一、搭建界面

文章目录 一、搭建界面搭建基础窗体第一步&#xff1a;创建画板大小第二步&#xff1a;在画板上作画 绘制俄罗斯方块第一步&#xff1a;绘制o形俄罗斯方块第二步&#xff1a;绘制其他形状方块 记录俄罗斯方块小游戏的游戏思路和过程 一、搭建界面 **目标&#xff1a;**搭建基础…

thinker board s debian系统安装配置

thinker board s debian系统安装配置 好多年前买了一块thinker board s&#xff0c;装安卓系统来用&#xff0c;结果经常性卡死不知道为啥&#xff0c;可能是供电问题&#xff0c;也可能是系统bug&#xff0c;之后就吃灰不怎么用了&#xff0c;最近想装一个计算服务器&#xff…

python利用thinker制作多页面切换的桌面应用实例教程

本篇文章主要讲解&#xff0c;python利用thinker制作多页面的桌面实例教程。可以在一个主界面中相互进行切换和设置相关的表单信息&#xff0c;布局等方法 代码片段的实际效果 视频演示&#xff1a; python使用thinker制作多窗口代码片段实例效果 gif动态图&#xff1a; 构建…