【re:從零開始的網(wǎng)站搭建教程】#2-請求數(shù)據(jù)的獲取
先來看一看更具體的一個http請求的結(jié)構(gòu)

#http頭、http體
http頭里一般的是通信所需的默認數(shù)據(jù),而http體里是我們真正想要發(fā)送的數(shù)據(jù)。http頭有固定明確的格式,http的數(shù)據(jù)則是我們自己選擇的數(shù)據(jù),格式不固定。簡單的區(qū)分就是http的第一個空行前是頭,空行后是體。
由瀏覽器發(fā)給服務(wù)器的叫請求頭,反之則叫響應(yīng)頭。
#請求模式
從圖中可以看出瀏覽器發(fā)送的請求中的第一行是GET / HTTP/1.1,其中GET是請求的模式,除了GET以外還有POST,PUT,DELET等等。如果你學(xué)過數(shù)據(jù)庫你可以把GET、POST、PUT、DELET分別理解為數(shù)據(jù)庫操作的查、改、增、刪這些操作。在http中沒有這么嚴格,你可以根據(jù)情況任意選擇模式。GET和POST請求已經(jīng)足夠完成所有事情,我們目前就只需要研究GET和POST就夠了。
1.GET
GET請求一般用于請求頁面,有大小限制。限制多少根據(jù)瀏覽器和服務(wù)器不同而不同,不要超過2kb為佳。GET的數(shù)據(jù)一般在http頭中,不建議用GET來傳輸大量數(shù)據(jù)和敏感數(shù)據(jù)。
2.POST
POST請求一般用于提交數(shù)據(jù),無大小限制。不過在某些服務(wù)器中為了性能會限制大小,但POST本身是沒有大小限制的。POST的數(shù)據(jù)一般在http體中,傳輸大量數(shù)據(jù)使用POST。
#HTTP頭項目簡析
一、請求頭
1.GET / HTTP/1.1
GET / HTTP/1.1是請求頭的第一行,也是最重要的一行。
其中第一個為請求模式,這里是GET請求;第二個為目錄,是在域名后跟的用/劃分的一串,只有一個斜杠表示網(wǎng)站的根目錄,假如說訪問的不是index這個目錄的話那就是/index,整個第一行也就變成GET /index?HTTP/1.1;最后的HTTP/1.1表示當(dāng)前http協(xié)議的版本。
2.Cookie
這也是相當(dāng)重要的一行,保持登錄狀態(tài)、驗證用戶身份需要靠它。
3.Range
這個沒有前兩個重要,在視頻播放、斷點續(xù)傳會用到。
二、響應(yīng)頭
HTTP/1.1 200 OK
HTTP/1.1表示當(dāng)前http協(xié)議的版本;200表示響應(yīng)碼;OK是響應(yīng)信息。
(1)響應(yīng)碼
常用的有:
1開頭表示需要做出一些改變
HTTP/1.1?101?Switching?Protocols (切換協(xié)議)
2開頭表示服務(wù)器收到并且成功解析、執(zhí)行數(shù)據(jù)
HTTP/1.1?200 OK (成功)
HTTP/1.1?205?Reset?Content (成功,但不用刷新頁面)
HTTP/1.1?206?Partial?Content (成功,數(shù)據(jù)為追加的數(shù)據(jù))
4開頭表示用戶發(fā)送的數(shù)據(jù)存在問題,和服務(wù)器無關(guān)
HTTP/1.1?400?Bad?Request (失敗,http請求格式錯誤)
HTTP/1.1?404?Not?Found (失敗,所請求的文件和頁面不存在)
HTTP/1.1?405?Method?Not?Allowed (失敗,不支持的請求模式)
HTTP/1.1?414?Request-URI?Too?Large (失敗,請求太龐大)
5開頭表示服務(wù)器出現(xiàn)問題
HTTP/1.1?500?Internal?Server?Error (錯誤,服務(wù)器內(nèi)部錯誤)
2.Server
不是必要項目,是服務(wù)器程序的名字。
3.content-type
這一項規(guī)定了文件的格式和瀏覽器解析時的文本編碼,若沒有正確設(shè)置瀏覽器則無法正確渲染頁面,并且可能出現(xiàn)亂碼。
#編寫程序接收瀏覽器的請求數(shù)據(jù)
啟動剛剛編寫的文件,打開瀏覽器,地址欄輸入127.0.0.1,看到打印了這個
不太好看,手動格式化一下
發(fā)現(xiàn)每一行最后都是\r\n,最后一個空行也有\(zhòng)r\n。在編程語言中往往用\r表示回車\n表示換行,雖然直接\n就能換行,但\r\n才時一個標準的換行。
所以在python中區(qū)分請求頭是否結(jié)束就找有沒有出現(xiàn)\r\n\r\n就行了。
修改一下剛剛的代碼就可以截取請求頭了
不過于后面沒有更多的數(shù)據(jù),看不出太多效果。