您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何理解C語言編寫Http服務(wù)器中的Request,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
制作流程
觀察收到的http數(shù)據(jù)
解析 request 的 method url version
解析 header
解析 body
觀察收到的http數(shù)據(jù)
如果你能完成一個簡單的基于TCP/IP的socket server 程序,那么恭喜你,本文你可以好好讀一讀。HTTP正式基于TCP/IP的應(yīng)用層協(xié)議,所以只要我們的程序能讀懂HTTP數(shù)據(jù),并做出符合HTTP協(xié)議的響應(yīng),那么就能完成HTTP的通信。
如果你有機(jī)會,可以常識使用telnet連接我們的服務(wù)器,你將的得到得是一些沒有意義的字符。如果是瀏覽器,會傳送什么呢?我們試著在瀏覽器地址欄輸入我們的服務(wù)器地址: 127.0.0.1:9734 后訪問,發(fā)現(xiàn)瀏覽器說“127.0.0.1 發(fā)送的響應(yīng)無效?!? 那是說我們返回給瀏覽器的數(shù)據(jù)瀏覽器讀不懂,因?yàn)楝F(xiàn)代的瀏覽器默認(rèn)用http協(xié)議請求訪問我們的服務(wù)器,而我們的返回的數(shù)據(jù)只是"helloworld"字符串,并不符合http協(xié)議的返回格式。雖然如此,但瀏覽器卻是很有誠意的給我們的服務(wù)器發(fā)標(biāo)準(zhǔn)的http請求,不信我們看下我們的服務(wù)器收到的信息:
先觀察一會兒,看起來***行是http請求的類型,第二行開始是一些":"號分割的鍵值對。的確如此,***行告訴我們是用的GET請求,請求的url是"/",用的是1.1的HTTP版本。第二行開始是HTTP的請求頭部。除了GET請求外,另一種常用的請求是POST。用瀏覽器發(fā)POST請求稍麻煩,我們就借用curl工具來發(fā)送個HTTP POST請求給服務(wù)器看下數(shù)據(jù)又會是怎們樣的:curl -d "message=nice to meet you" 127.0.0.1:9734/hello
服務(wù)器收到的信息:
可以看到頭部信息之后多了一空行和之后的POST的body數(shù)據(jù)信息。還要注意的是Content-Length頭,代表POST的body數(shù)據(jù)的大小。
解析 request 的 method url version
先來解析最簡單的***行: "POST /hell HTTP/1.1", 只需要用空格split出三個字符串就好了。
1.request.h
2.request.c
3.編寫測試用例
在test目錄下執(zhí)行:` gcc ../request.h ../request.c requestTest.c && ./a.out`,可以看到我們解析的方法正確。
解析 header
header的解析看起來比較復(fù)雜,每一行很容易看出是用":"分割的key-value對,所以我們可以用HashMap來表達(dá)。如何判斷header數(shù)據(jù)的結(jié)束呢,通過前面的觀察,可以發(fā)現(xiàn)如果是POST會有一個空行和body隔開,是GET的話只能檢查客戶端的數(shù)據(jù)是否發(fā)完,發(fā)完就代表header也結(jié)尾了。在正式解析header之前,我們先構(gòu)造基本數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),以方便以后使用。
1. 創(chuàng)建鏈表結(jié)構(gòu)體
2. 創(chuàng)建哈希表結(jié)構(gòu)體
3. 按行解析header,遇到空行或字符串結(jié)尾停止
因?yàn)榇a比較多,這里不久不把兩種結(jié)構(gòu)體得實(shí)現(xiàn)代碼貼出來,如果足下需要可以私信我"代碼"獲取。
解析header代碼,有了哈希結(jié)構(gòu)體后,解析header就方便多了,只要按行根據(jù)":" 拆分成 key和value就行了
關(guān)鍵代碼:
解析body
解析body很簡單,如果***一行不是空格不是空行,說明是有body數(shù)據(jù)的,空行后面的就是body數(shù)據(jù)了.
header里面有個關(guān)鍵的key, ‘Content-Length’ 代表了body有多長,我們可以利用這個字段來判斷body的結(jié)尾。
大功告成 ***打印我們的成果
打印解析內(nèi)容
執(zhí)行 gcc request.h request.c main.c tools/utils.c tools/utils.h && ./a.out
然后新開一個終端執(zhí)行 curl -d "message=nice to meet you" 127.0.0.1:9734/hello-everyone
看到輸出結(jié)果:
關(guān)于如何理解C語言編寫Http服務(wù)器中的Request就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。