Vert.x Web模塊源碼分析-HttpServerRequest(一)

Vert Core 為vertx-web模塊提供了什么依賴?

? ?先來看段最原始的 vert core 提供的http 開發(fā)示例:

最簡單的vertx http 服務

? ? ?首先,vertx 創(chuàng)建HttpServer,然后設置回調處理器hander涎拉,并傳入request參數(shù)(request提供了大量方法,基本跟傳統(tǒng)Serverlet Request類似)翼岁,最后設置服務器監(jiān)聽端口开财。然后運行訪問8080端口,頁面顯示“hello world”惹悄。

? ??Vert 依賴core包提供socket 通信能力以及http協(xié)議的編碼解碼功能(core 包源碼有具體實現(xiàn))春叫,最后留給用戶的只剩下處理器hander以及已經封裝好數(shù)據(jù)的HttpServerRequest。所以vert.x web開發(fā)的重要關注點就在這兩個東西泣港,其中HttpServerRequest將貫穿整個web模塊的始終暂殖。

? ? 上面示例,不管你訪問后綴是多少当纱,返回的結果都是一樣的比如:http://localhost:8080/{x},x隨便寫什么呛每。假如現(xiàn)在有個需求,需要根據(jù)不同的訪問后綴返回對應的數(shù)據(jù)坡氯,怎么實現(xiàn)晨横?首先我們要獲取到用戶訪問的path,然后根據(jù)path去匹配結果箫柳,偽代碼如下:

? ? ?if(path 匹配 “path1”){

? ? ? ? ? ? ?返回 “path1”手形;

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

? ? ? ? ? ? 返回 “path2”;

? ? ? }......

? ? path 哪來悯恍?HttpServerRequest提供了獲取請求path的方法库糠,這個類封裝了所有用戶請求行為,比如請求路徑坪稽,參數(shù)曼玩,cookie等等鳞骤。在看上面例子窒百,回調處理hander黍判,并且傳入了HttpServerRequest參數(shù),方法體就是用戶需要實現(xiàn)的具體業(yè)務邏輯篙梢,比如操作數(shù)據(jù)庫進行業(yè)務處理顷帖,然后返回結果給客戶端等等。

? ? 回調函數(shù)是vert core 觸發(fā)的渤滞,上層調用并不需要關心贬墩。大概流程:瀏覽器發(fā)送請求->vert core監(jiān)聽端口接收數(shù)據(jù)->http 協(xié)議解碼,封裝HttpServerRequest->觸發(fā)回調函數(shù),處理完返回結果->vert core http協(xié)議編碼->返回結果到瀏覽器妄呕。

? ? 到目前為止陶舞,還沒提到半點vertx-web的功能。也就是說沒有vertx-web,vertx core也是完全可以開發(fā)web應用的绪励,他們關系跟severlet和 spring mvc類似肿孵,后者是對前者的進一步封裝,目的是為了簡化開發(fā)疏魏,提高效率停做。

? ? 在回過頭來看上面的偽代碼,假如有幾十個幾百個請求后綴再加上業(yè)務邏輯代碼大莫,這樣if else 的寫下去蛉腌,代碼完全是一坨混雜在一起,直覺告訴你這樣肯定是不行的只厘。好在 core包提供了最為關鍵的一個類HttpServerRequest以及函數(shù)入口烙丛。

? ? 好啦,現(xiàn)在我們的處境是:客戶端每次發(fā)送請求之后羔味,我們都能獲取到request蜀变,request里面完全封裝了用戶請求數(shù)據(jù),比如請求方法介评,請求參數(shù)库北,請求路徑等。獲取到request之后们陆,我們需要通過用戶請求的path分別做相應的業(yè)務處理寒瓦,我們肯定不會按照上面那樣 if else的去判斷區(qū)分。我們需要一個更“自動化”的東西坪仇,完成這些事杂腰,而我們只需關心自己的具體業(yè)務實現(xiàn)(spring mvc就做的很好)。在這樣的驅動下椅文,vertx-web也就登上歷史的舞臺了(當然喂很,假如用的不爽惜颇,也完全可以自己寫個web模塊)。

? ? ? 額少辣。凌摄。有點跑題了,現(xiàn)在來看下HttpServerRequest漓帅,它是個接口锨亏,在core包中有具體實現(xiàn),request相關的類并不是vertx-web提供的忙干,都在core里面的http包下器予。所以,request壓根就不是 web模塊中的源碼捐迫。但這個類是core和web模塊通信的橋廊乾翔,地位十分重要,所以也就在這Vert.x Web模塊源碼分析第一篇做個基本介紹施戴,但不展開源碼分析反浓,因為這涉及到http編碼解碼等一系列東西,不在web模塊分析的范疇暇韧。

? ? ? HttpServerRequest可以理解為對http協(xié)議字段的功能性封裝勾习,每次用戶發(fā)送請求,所有相關的請求行為全部會記錄到HttpServerRequest懈玻,比如http 頭部巧婶,host,parameter等等涂乌。具體可以參數(shù)api 文檔艺栈。后續(xù)章節(jié)會涉及到HttpServerRequest部分接口,具體到時候在講解湾盒。

PS:結束之前說個比較重要的類

? ?在vert中有許都地方用到 Hander類湿右,源碼

@FunctionalInterface

public?interface Handler<E>{

void handle(E event);

}

其中@FunctionalInterface是java8新加的一個注解,用于說明該接口是函數(shù)式接口

之前示例代碼中的server.requestHandler()的參數(shù)就是具體實現(xiàn)罚勾。

server.requestHandler(request -> {

? ?HttpServerResponse response = request.response();

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

? ?response.end("Hello World!");

});

因為Hander<E>使用了泛型毅人,幾乎所有Vert.x Hander類型的功能都是基于這個跟接口實現(xiàn)回調,其中E可以根據(jù)具體業(yè)務變化尖殃,在之后章節(jié)源碼分析中有大量實現(xiàn)丈莺。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市送丰,隨后出現(xiàn)的幾起案子缔俄,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俐载,死亡現(xiàn)場離奇詭異蟹略,居然都是意外死亡,警方通過查閱死者的電腦和手機遏佣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門挖炬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贼急,你說我怎么就攤上這事茅茂∧笃迹” “怎么了太抓?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長令杈。 經常有香客問我走敌,道長,這世上最難降的妖魔是什么逗噩? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任掉丽,我火速辦了婚禮,結果婚禮上异雁,老公的妹妹穿的比我還像新娘捶障。我一直安慰自己,他們只是感情好纲刀,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布项炼。 她就那樣靜靜地躺著,像睡著了一般示绊。 火紅的嫁衣襯著肌膚如雪锭部。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天面褐,我揣著相機與錄音拌禾,去河邊找鬼。 笑死展哭,一個胖子當著我的面吹牛湃窍,可吹牛的內容都是我干的。 我是一名探鬼主播匪傍,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼您市,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了析恢?” 一聲冷哼從身側響起墨坚,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泽篮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盗尸,經...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年帽撑,在試婚紗的時候發(fā)現(xiàn)自己被綠了泼各。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡亏拉,死狀恐怖扣蜻,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情及塘,我是刑警寧澤莽使,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站笙僚,受9級特大地震影響芳肌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜肋层,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一亿笤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栋猖,春花似錦净薛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至全陨,卻和暖如春爆班,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辱姨。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工柿菩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雨涛。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓枢舶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親替久。 傳聞我的和親對象是個殘疾皇子凉泄,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容