Vert.x Web模块源码分析-HttpServerRequest(一)

Vert Core 为vertx-web模块提供了什么依赖?

   先来看段最原始的 vert core 提供的http 开发示例:

最简单的vertx http 服务

     首先,vertx 创建HttpServer,然后设置回调处理器hander,并传入request参数(request提供了大量方法,基本跟传统Serverlet Request类似),最后设置服务器监听端口。然后运行访问8080端口,页面显示“hello world”。

    Vert 依赖core包提供socket 通信能力以及http协议的编码解码功能(core 包源码有具体实现),最后留给用户的只剩下处理器hander以及已经封装好数据的HttpServerRequest。所以vert.x web开发的重要关注点就在这两个东西,其中HttpServerRequest将贯穿整个web模块的始终。

    上面示例,不管你访问后缀是多少,返回的结果都是一样的比如:http://localhost:8080/{x},x随便写什么。假如现在有个需求,需要根据不同的访问后缀返回对应的数据,怎么实现?首先我们要获取到用户访问的path,然后根据path去匹配结果,伪代码如下:

     if(path 匹配 “path1”){

             返回 “path1”;

      }else if(path 匹配 “path2”){

            返回 “path2”;

      }......

    path 哪来?HttpServerRequest提供了获取请求path的方法,这个类封装了所有用户请求行为,比如请求路径,参数,cookie等等在看上面例子,回调处理hander,并且传入了HttpServerRequest参数,方法体就是用户需要实现的具体业务逻辑,比如操作数据库进行业务处理,然后返回结果给客户端等等。

    回调函数是vert core 触发的,上层调用并不需要关心。大概流程:浏览器发送请求->vert core监听端口接收数据->http 协议解码,封装HttpServerRequest->触发回调函数,处理完返回结果->vert core http协议编码->返回结果到浏览器。

    到目前为止,还没提到半点vertx-web的功能。也就是说没有vertx-web,vertx core也是完全可以开发web应用的,他们关系跟severlet和 spring mvc类似,后者是对前者的进一步封装,目的是为了简化开发,提高效率。

    在回过头来看上面的伪代码,假如有几十个几百个请求后缀再加上业务逻辑代码,这样if else 的写下去,代码完全是一坨混杂在一起,直觉告诉你这样肯定是不行的。好在 core包提供了最为关键的一个类HttpServerRequest以及函数入口。

    好啦,现在我们的处境是:客户端每次发送请求之后,我们都能获取到request,request里面完全封装了用户请求数据,比如请求方法,请求参数,请求路径等。获取到request之后,我们需要通过用户请求的path分别做相应的业务处理,我们肯定不会按照上面那样 if else的去判断区分。我们需要一个更“自动化”的东西,完成这些事,而我们只需关心自己的具体业务实现(spring mvc就做的很好)。在这样的驱动下,vertx-web也就登上历史的舞台了(当然,假如用的不爽,也完全可以自己写个web模块)。

      额。。有点跑题了,现在来看下HttpServerRequest,它是个接口,在core包中有具体实现,request相关的类并不是vertx-web提供的,都在core里面的http包下。所以,request压根就不是 web模块中的源码。但这个类是core和web模块通信的桥廊,地位十分重要,所以也就在这Vert.x Web模块源码分析第一篇做个基本介绍,但不展开源码分析,因为这涉及到http编码解码等一系列东西,不在web模块分析的范畴。

      HttpServerRequest可以理解为对http协议字段的功能性封装,每次用户发送请求,所有相关的请求行为全部会记录到HttpServerRequest,比如http 头部,host,parameter等等。具体可以参数api 文档。后续章节会涉及到HttpServerRequest部分接口,具体到时候在讲解。

PS:结束之前说个比较重要的类

   在vert中有许都地方用到 Hander类,源码

@FunctionalInterface

public interface Handler<E>{

void handle(E event);

}

其中@FunctionalInterface是java8新加的一个注解,用于说明该接口是函数式接口

之前示例代码中的server.requestHandler()的参数就是具体实现。

server.requestHandler(request -> {

   HttpServerResponse response = request.response();

  response.putHeader("content-type","text/plain");

   response.end("Hello World!");

});

因为Hander<E>使用了泛型,几乎所有Vert.x Hander类型的功能都是基于这个跟接口实现回调,其中E可以根据具体业务变化,在之后章节源码分析中有大量实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容