如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

這篇文章將為大家詳細(xì)講解有關(guān)如何理解C語(yǔ)言編寫Http服務(wù)器中的Request,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),云溪企業(yè)網(wǎng)站建設(shè),云溪品牌網(wǎng)站建設(shè),網(wǎng)站定制,云溪網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,云溪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

制作流程

  • 觀察收到的http數(shù)據(jù)

  • 解析 request 的 method url version

  • 解析 header

  • 解析 body

觀察收到的http數(shù)據(jù)

如果你能完成一個(gè)簡(jiǎn)單的基于TCP/IP的socket server  程序,那么恭喜你,本文你可以好好讀一讀。HTTP正式基于TCP/IP的應(yīng)用層協(xié)議,所以只要我們的程序能讀懂HTTP數(shù)據(jù),并做出符合HTTP協(xié)議的響應(yīng),那么就能完成HTTP的通信。

如果你有機(jī)會(huì),可以常識(shí)使用telnet連接我們的服務(wù)器,你將的得到得是一些沒(méi)有意義的字符。如果是瀏覽器,會(huì)傳送什么呢?我們?cè)囍跒g覽器地址欄輸入我們的服務(wù)器地址:  127.0.0.1:9734 后訪問(wèn),發(fā)現(xiàn)瀏覽器說(shuō)“127.0.0.1 發(fā)送的響應(yīng)無(wú)效?!?  那是說(shuō)我們返回給瀏覽器的數(shù)據(jù)瀏覽器讀不懂,因?yàn)楝F(xiàn)代的瀏覽器默認(rèn)用http協(xié)議請(qǐng)求訪問(wèn)我們的服務(wù)器,而我們的返回的數(shù)據(jù)只是"helloworld"字符串,并不符合http協(xié)議的返回格式。雖然如此,但瀏覽器卻是很有誠(chéng)意的給我們的服務(wù)器發(fā)標(biāo)準(zhǔn)的http請(qǐng)求,不信我們看下我們的服務(wù)器收到的信息:

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

先觀察一會(huì)兒,看起來(lái)***行是http請(qǐng)求的類型,第二行開始是一些":"號(hào)分割的鍵值對(duì)。的確如此,***行告訴我們是用的GET請(qǐng)求,請(qǐng)求的url是"/",用的是1.1的HTTP版本。第二行開始是HTTP的請(qǐng)求頭部。除了GET請(qǐng)求外,另一種常用的請(qǐng)求是POST。用瀏覽器發(fā)POST請(qǐng)求稍麻煩,我們就借用curl工具來(lái)發(fā)送個(gè)HTTP  POST請(qǐng)求給服務(wù)器看下數(shù)據(jù)又會(huì)是怎們樣的:curl -d "message=nice to meet you"  127.0.0.1:9734/hello

服務(wù)器收到的信息:

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

可以看到頭部信息之后多了一空行和之后的POST的body數(shù)據(jù)信息。還要注意的是Content-Length頭,代表POST的body數(shù)據(jù)的大小。

解析 request 的 method url version

先來(lái)解析最簡(jiǎn)單的***行: "POST /hell HTTP/1.1", 只需要用空格split出三個(gè)字符串就好了。

1.request.h

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

2.request.c

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

3.編寫測(cè)試用例

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

在test目錄下執(zhí)行:` gcc ../request.h ../request.c requestTest.c &&  ./a.out`,可以看到我們解析的方法正確。

解析 header

header的解析看起來(lái)比較復(fù)雜,每一行很容易看出是用":"分割的key-value對(duì),所以我們可以用HashMap來(lái)表達(dá)。如何判斷header數(shù)據(jù)的結(jié)束呢,通過(guò)前面的觀察,可以發(fā)現(xiàn)如果是POST會(huì)有一個(gè)空行和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)代碼貼出來(lái),如果足下需要可以私信我"代碼"獲取。

解析header代碼,有了哈希結(jié)構(gòu)體后,解析header就方便多了,只要按行根據(jù)":" 拆分成 key和value就行了

關(guān)鍵代碼:

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

解析body

解析body很簡(jiǎn)單,如果***一行不是空格不是空行,說(shuō)明是有body數(shù)據(jù)的,空行后面的就是body數(shù)據(jù)了.

header里面有個(gè)關(guān)鍵的key, ‘Content-Length’ 代表了body有多長(zhǎng),我們可以利用這個(gè)字段來(lái)判斷body的結(jié)尾。

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

大功告成 ***打印我們的成果

打印解析內(nèi)容

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

執(zhí)行 gcc request.h request.c main.c tools/utils.c tools/utils.h &&  ./a.out

然后新開一個(gè)終端執(zhí)行 curl -d "message=nice to meet you"  127.0.0.1:9734/hello-everyone

看到輸出結(jié)果:

如何理解C語(yǔ)言編寫Http服務(wù)器中的Request

關(guān)于如何理解C語(yǔ)言編寫Http服務(wù)器中的Request就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前標(biāo)題:如何理解C語(yǔ)言編寫Http服務(wù)器中的Request
標(biāo)題路徑:http://muchs.cn/article34/pdgcse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣品牌網(wǎng)站設(shè)計(jì)、做網(wǎng)站、關(guān)鍵詞優(yōu)化網(wǎng)站營(yíng)銷、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司