HTTP請(qǐng)求過程
我們?cè)跒g覽器輸入百度首頁(yè)的地址:https://www.baidu.com盛卡,輸入之后瀏覽器會(huì)給我們打開百度首頁(yè)摩钙。實(shí)際上這個(gè)過程是瀏覽器向網(wǎng)站所在的服務(wù)器發(fā)送了一個(gè)Request請(qǐng)求,網(wǎng)站服務(wù)器接收到這個(gè)Request之后進(jìn)行處理和解析说墨,然后返回對(duì)應(yīng)的一個(gè)Response響應(yīng),然后傳回給瀏覽器苍柏,Response里面就包含了頁(yè)面的源代碼等內(nèi)容尼斧,瀏覽器再對(duì)其進(jìn)行解析便將網(wǎng)頁(yè)呈現(xiàn)了出來。
在網(wǎng)頁(yè)中按F12可查看詳細(xì)的請(qǐng)求和響應(yīng)內(nèi)容
Request(請(qǐng)求)
由客戶端向服務(wù)端發(fā)出试吁⊥患眨可以將Request劃分為四部分內(nèi)容:
- Request Method:請(qǐng)求方式
- Request URL:請(qǐng)求鏈接
- Request Headers:請(qǐng)求頭
- Request Body:請(qǐng)求體
Request Method
請(qǐng)求方式常見的有兩種類型,GET和POST。
- GET用于信息獲取律秃,而且應(yīng)該是安全的和冪等的(冪等的意思就是一個(gè)操作不會(huì)修改狀態(tài)信息爬橡,并且每次操作的時(shí)候都返回同樣的結(jié)果。)從發(fā)送請(qǐng)求的角度棒动,GET請(qǐng)求相當(dāng)于我們?cè)跀?shù)據(jù)庫(kù)中做了查詢的操作糙申,這樣的操作不影響數(shù)據(jù)庫(kù)本身的數(shù)據(jù)。
- POST表示可能會(huì)修改服務(wù)器上資源的請(qǐng)求船惨,也相當(dāng)于在數(shù)據(jù)庫(kù)中做了修改的操作柜裸,會(huì)影響數(shù)據(jù)庫(kù)本身的數(shù)據(jù)(比如:注冊(cè)了賬戶,發(fā)了帖子粱锐,做了評(píng)論疙挺,得到了積分等。這種情況下怜浅,資源狀態(tài)被改變了)铐然。
案例1——GET請(qǐng)求
在瀏覽器輸入:https://www.baidu.com/s?wd=appium 并回車,這個(gè)其實(shí)就是在百度搜索appium這個(gè)關(guān)鍵詞恶座。URL中包含了請(qǐng)求的參數(shù)信息搀暑,這里參數(shù)wd就是要搜尋的關(guān)鍵字。在瀏覽器可以看到Query String Parameters 選項(xiàng)就是請(qǐng)求的參數(shù)跨琳。發(fā)起一次GET請(qǐng)求時(shí)自点,參數(shù)會(huì)以u(píng)rl string的形式進(jìn)行傳遞。即脉让?后的字符串則為其請(qǐng)求參數(shù)桂敛。并以&作為分隔符。
案例2——POST請(qǐng)求
一般來說溅潜,網(wǎng)站登錄驗(yàn)證的時(shí)候术唬,需要提交用戶名密碼,這里包含了敏感信息伟恶,使用GET方式請(qǐng)求的話密碼就會(huì)暴露在URL里面碴开,造成密碼泄漏,所以這里最好以POST方式發(fā)送博秫。文件的上傳時(shí)潦牛,由于文件內(nèi)容比較大,也會(huì)選用POST方式挡育。
除了常規(guī)的GET巴碗,POST請(qǐng)求,另外還有一些請(qǐng)求方式即寒,如HEAD橡淆、PUT召噩、DELETE等,簡(jiǎn)單將其總結(jié)如下:
Request URL
Request URL就是請(qǐng)求的網(wǎng)址逸爵,即統(tǒng)一資源定位符具滴,用URL 可以唯一確定我們想請(qǐng)求的資源。比如:https://www.baidu.com/
Request Headers
請(qǐng)求頭师倔,用來說明服務(wù)器要使用的附加信息构韵,比較重要的信息有Cookie、Referer趋艘、User-Agent等疲恢,下面將一些常用的頭信息說明如下:
- Accept,請(qǐng)求報(bào)頭域瓷胧,用于指定客戶端可接受哪些類型的信息显拳。
- Accept-Language,指定客戶端可接受的語(yǔ)言類型搓萧。
- Accept-Encoding杂数,指定客戶端可接受的內(nèi)容編碼。
- Host矛绘,用于指定請(qǐng)求資源的主機(jī)IP和端口號(hào)耍休,其內(nèi)容為請(qǐng)求URL的原始服務(wù)器或網(wǎng)關(guān)的位置刃永。從HTTP1.1版本開始货矮,Request必須包含此內(nèi)容。
- Cookie斯够,也常用復(fù)數(shù)形式Cookies囚玫,是網(wǎng)站為了辨別用戶進(jìn)行Session跟蹤而儲(chǔ)存在用戶本地的數(shù)據(jù)。Cookies的主要功能就是維持當(dāng)前訪問會(huì)話读规。
- Referer抓督,此內(nèi)容用來標(biāo)識(shí)這個(gè)請(qǐng)求時(shí)從哪個(gè)頁(yè)面發(fā)過來的,服務(wù)器可以拿到這一信息并做相應(yīng)的處理束亏,如做來源統(tǒng)計(jì)铃在、做防盜鏈處理等。
- User-Agent碍遍,簡(jiǎn)稱UA定铜,它是一個(gè)特殊字符串頭,使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng)及版本怕敬、瀏覽器及版本等信息揣炕。在做爬蟲時(shí)加上此信息可以偽裝為瀏覽器,如果不加很可能會(huì)被識(shí)別出為爬蟲东跪。
- Content-Type畸陡,即Internet Media Type鹰溜,互聯(lián)網(wǎng)媒體類型,也叫做MIME類型丁恭,在HTTP協(xié)議消息頭中曹动,使用它來表示具體請(qǐng)求中的媒體類型信息。例如 application/x-www-form-urlencoded表示表單數(shù)據(jù)牲览,text/html代表HTML格式仁期,image/gif代表GIF圖片,application/json代表json類型竭恬。
Request Body
請(qǐng)求體跛蛋,一般用于POST請(qǐng)求中,主要定義向服務(wù)器提交的數(shù)據(jù)類型痊硕,而對(duì)于GET請(qǐng)求Request Body則為空赊级。
比如在登錄之前我們填寫了用戶名和密碼信息,提交時(shí)就這些內(nèi)容就會(huì)以Form Data的形式提交給服務(wù)器岔绸,此時(shí)注意Request Headers中指定了Content-Type為application/x-www-form-urlencoded理逊,只有設(shè)置Content-Type為application/x-www-form-urlencoded才會(huì)以Form Data形式提交,另外我們也可以將Content-Type設(shè)置為application/json提交Json數(shù)據(jù)盒揉,或者設(shè)置為multipart/form-data來上傳文件晋被。
常用Content-Type和POST提交數(shù)據(jù)方式的關(guān)系:
application/x-www-form-urlencoded與multipart/form-data 區(qū)別
- 在沒有type=file時(shí)候,用默認(rèn)的application/x-www-form-urlencoded就行刚盈。
- 在有type=file時(shí)候羡洛,要用multipart/form-data編碼方式。瀏覽器就會(huì)把表單以控件為單位分割,并且為每個(gè)部分加上Content-Disposition(form-data或file)、Content-Type(默認(rèn)text/plain)环揽、name(控件name)等信息蟀淮,并加上分割符(boundary)。