東門網(wǎng)站建設(shè)百度站長號(hào)購買
目錄
URL格式
HTTP請求和響應(yīng)報(bào)文的字段?
HTTP請求方法
常見的狀態(tài)碼
GET 和 POST 的區(qū)別
Cookie 和 Session
URL格式
?:是用來分割URL的主體部分(通常是路徑)和查詢字符串(query string)查詢字符串是一組鍵值對的參數(shù)
query string:是鍵值對的結(jié)構(gòu),&分割鍵值對,=分割鍵和值
HTTP請求和響應(yīng)報(bào)文的字段?
Content-Type: 數(shù)據(jù)類型(text/html等)。
Content-Length: 正文的長度。
Host: 客戶端告知服務(wù)器,所請求的資源是在哪個(gè)主機(jī)的哪個(gè)端口上。
User-Agent: 聲明用戶的操作系統(tǒng)和瀏覽器的版本信息。
Referer: 當(dāng)前頁面是哪個(gè)頁面跳轉(zhuǎn)過來的。
Location: 搭配3XX狀態(tài)碼使用,告訴客戶端接下來要去哪里訪問。
Cookie: 用于在客戶端存儲(chǔ)少量信息,通常用于實(shí)現(xiàn)會(huì)話(session)的功能。
Connection 字段 ---> 長連接
HTTP/1.1 版本的默認(rèn)連接都是長連接,但為了兼容老版本的 HTTP,需要指定 Connection 首部字段的值為 Keep-Alive。
開啟了 HTTP Keep-Alive 機(jī)制后, 連接就不會(huì)中斷,而是保持連接。當(dāng)客戶端發(fā)送另一個(gè)請求時(shí),它會(huì)使用同一個(gè)連接,一直持續(xù)到客戶端或服務(wù)器端提出斷開連接。
Content-Encoding 字段
Content-Encoding 字段說明數(shù)據(jù)的壓縮方法。表示服務(wù)器返回的數(shù)據(jù)使用了什么壓縮格式
Content-Encoding: gzip
HTTP請求方法
GET:用于從服務(wù)器獲取資源,通常是通過URL傳遞參數(shù)來請求資源。GET請求是冪等的,即多次請求相同資源不會(huì)產(chǎn)生不同的結(jié)果。
POST:用于向服務(wù)器提交數(shù)據(jù),通常用于創(chuàng)建新資源或在服務(wù)器上執(zhí)行某些操作。POST請求不冪等,多次提交相同的數(shù)據(jù)可能會(huì)產(chǎn)生不同的結(jié)果。
HEAD:類似于GET請求,但只返回資源的頭部信息,不返回實(shí)際的數(shù)據(jù)。通常用于檢查資源是否存在或獲取資源的元數(shù)據(jù)。
PUT:用于更新或創(chuàng)建指定的資源,通常將請求的數(shù)據(jù)放在請求體中,以覆蓋服務(wù)器上的現(xiàn)有資源或創(chuàng)建新資源。
DELETE:用于刪除指定的資源。DELETE請求用于刪除服務(wù)器上的資源。
OPTIONS:用于獲取目標(biāo)資源支持的通信選項(xiàng)??蛻舳丝梢允褂肙PTIONS請求來查詢服務(wù)器支持的請求方法、頭部信息等。
PATCH:用于部分更新資源,通常將請求的數(shù)據(jù)放在請求體中,只更新資源的一部分而不是整個(gè)資源。
TRACE:用于追蹤請求在傳輸過程中的軌跡,通常用于診斷和調(diào)試。
CONNECT:通常用于建立與代理服務(wù)器的網(wǎng)絡(luò)連接,以便進(jìn)行加密通信(如HTTPS)或隧道傳輸。
常見的狀態(tài)碼
1xx 類狀態(tài)碼屬于提示信息,是協(xié)議處理中的一種中間狀態(tài),實(shí)際用到的比較少。
2xx 類狀態(tài)碼表示服務(wù)器成功處理了客戶端的請求,也是我們最愿意看到的狀態(tài)。
- 「200 OK」是最常見的成功狀態(tài)碼,表示一切正常。如果是非 HEAD 請求,服務(wù)器返回的響應(yīng)頭都會(huì)有 body 數(shù)據(jù)。
- 「204 No Content」也是常見的成功狀態(tài)碼,與 200 OK 基本相同,但響應(yīng)頭沒有 body 數(shù)據(jù)。
- 「206 Partial Content」是應(yīng)用于 HTTP 分塊下載或斷點(diǎn)續(xù)傳,表示響應(yīng)返回的 body 數(shù)據(jù)并不是資源的全部,而是其中的一部分,也是服務(wù)器處理成功的狀態(tài)。
3xx 類狀態(tài)碼表示客戶端請求的資源發(fā)生了變動(dòng),需要客戶端用新的 URL 重新發(fā)送請求獲取資源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向,說明請求的資源已經(jīng)不存在了,需改用新的 URL 再次訪問。
- 「302 Found」表示臨時(shí)重定向,說明請求的資源還在,但暫時(shí)需要用另一個(gè) URL 來訪問。
301 和 302 都會(huì)在響應(yīng)頭里使用字段 Location,指明后續(xù)要跳轉(zhuǎn)的 URL,瀏覽器會(huì)自動(dòng)重定向新的 URL。
- 「304 Not Modified」不具有跳轉(zhuǎn)的含義,表示資源未修改,重定向已存在的緩沖文件,也稱緩存重定向,也就是告訴客戶端可以繼續(xù)使用緩存資源,用于緩存控制。
4xx 類狀態(tài)碼表示客戶端發(fā)送的報(bào)文有誤,服務(wù)器無法處理,也就是錯(cuò)誤碼的含義。
- 「400 Bad Request」表示客戶端請求的報(bào)文有錯(cuò)誤,但只是個(gè)籠統(tǒng)的錯(cuò)誤。
- 「401 Unauthorized」:表示需要身份驗(yàn)證,客戶端未提供有效的憑據(jù)。
- 「403 Forbidden」表示服務(wù)器禁止訪問資源,并不是客戶端的請求出錯(cuò)。
- 「404 Not Found」表示請求的資源在服務(wù)器上不存在或未找到,所以無法提供給客戶端。
5xx 類狀態(tài)碼表示客戶端請求報(bào)文正確,但是服務(wù)器處理時(shí)內(nèi)部發(fā)生了錯(cuò)誤,屬于服務(wù)器端的錯(cuò)誤碼。
- 「500 Internal Server Error」與 400 類型,是個(gè)籠統(tǒng)通用的錯(cuò)誤碼,服務(wù)器發(fā)生了什么錯(cuò)誤,我們并不知道。
- 「501 Not Implemented」表示客戶端請求的功能還不支持,類似“即將開業(yè),敬請期待”的意思。
- 「502 Bad Gateway」通常是服務(wù)器作為網(wǎng)關(guān)或代理時(shí)返回的錯(cuò)誤碼,表示服務(wù)器自身工作正常,訪問后端服務(wù)器發(fā)生了錯(cuò)誤。
- 「503 Service Unavailable」表示服務(wù)器當(dāng)前很忙,暫時(shí)無法響應(yīng)客戶端,類似“網(wǎng)絡(luò)服務(wù)正忙,請稍后重試”的意思。
GET 和 POST 的區(qū)別
RFC代表"Request for Comments",它是一種用于制定和描述互聯(lián)網(wǎng)標(biāo)準(zhǔn)、協(xié)議和相關(guān)信息的文檔系列。RFC文檔是由互聯(lián)網(wǎng)工程任務(wù)組和其他互聯(lián)網(wǎng)相關(guān)組織發(fā)布的,用于記錄互聯(lián)網(wǎng)的技術(shù)規(guī)范和協(xié)議。
根據(jù) RFC 規(guī)范,GET 的語義是從服務(wù)器獲取指定的資源。GET 請求的參數(shù)位置一般是寫在 URL 中,URL 規(guī)定只能支持 ASCII,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連
根據(jù) RFC 規(guī)范,POST 的語義是根據(jù)請求負(fù)荷(報(bào)文body)對指定的資源做出處理(POST方法一般用于將數(shù)據(jù)上傳給服務(wù)器)。POST 請求攜帶數(shù)據(jù)的位置一般是寫在報(bào)文 body 中
先說明下安全和冪等的概念:
- 在 HTTP 協(xié)議里,所謂的「安全」是指請求方法不會(huì)「破壞」服務(wù)器上的資源。
- 所謂的「冪等」,意思是多次執(zhí)行相同的操作,結(jié)果都是「相同」的。
如果從 RFC 規(guī)范定義的語義來看:
- GET 方法就是安全且冪等的,因?yàn)樗恰钢蛔x」操作,無論操作多少次,服務(wù)器上的數(shù)據(jù)都是安全的,且每次的結(jié)果都是相同的。所以,可以對 GET 請求的數(shù)據(jù)做緩存,這個(gè)緩存可以做到瀏覽器本身上(徹底避免瀏覽器發(fā)請求)
- POST 因?yàn)槭恰感略龌蛱峤粩?shù)據(jù)」的操作,會(huì)修改服務(wù)器上的資源,所以是不安全的,且多次提交數(shù)據(jù)就會(huì)創(chuàng)建多個(gè)資源,所以不是冪等的。所以,瀏覽器一般不會(huì)緩存 POST 請求,也不能把 POST 請求的數(shù)據(jù)做緩存。
上面是從 RFC 規(guī)范定義的語義來分析的。
但是實(shí)際過程中,開發(fā)者不一定會(huì)按照規(guī)范定義的語義來實(shí)現(xiàn) GET 和 POST 方法。比如:
- 可以用 GET 方法實(shí)現(xiàn)新增或刪除數(shù)據(jù)的請求,這樣實(shí)現(xiàn)的 GET 方法自然就不是安全和冪等。
- 可以用 POST 方法實(shí)現(xiàn)查詢數(shù)據(jù)的請求,這樣實(shí)現(xiàn)的 POST 方法自然就是安全和冪等。
如果「安全」放入概念是指信息是否會(huì)被泄漏的話,雖然 POST 用 body 傳輸數(shù)據(jù),而 GET 用 URL 傳輸,這樣數(shù)據(jù)會(huì)在瀏覽器地址攔容易看到,但是并不能說 GET 不如 POST 安全的。
雖然在瀏覽器地址攔看不到 POST 提交的 body 數(shù)據(jù),但是只要抓個(gè)包就都能看到了。
GET和POST沒有本質(zhì)區(qū)別,使用GET實(shí)現(xiàn)的場景基本上也可以使用POST,使用POST實(shí)現(xiàn)的場景基本上也可以使用GET
Cookie 和 Session
Cookie和Session是用于在Web應(yīng)用中維護(hù)用戶狀態(tài)和跟蹤用戶會(huì)話的兩種常見方式
Cookie
- cookie是請求頭中的一個(gè)重要字段,在服務(wù)器返回的響應(yīng)報(bào)文中,可以在響應(yīng)header中包含一個(gè)或多個(gè)Set-Cookie這樣的資源,瀏覽器看到這些Set-Cookie就會(huì)把這樣的數(shù)據(jù)保存在瀏覽器本地。
- Cookie典型的應(yīng)用場景,在客戶端維持登陸狀態(tài)。在某個(gè)網(wǎng)站上登陸成功之后,瀏覽器就會(huì)記住當(dāng)前登錄用戶的身份信息,然后在接下來的訪問網(wǎng)站的其他頁面,服務(wù)器也能知道是誰在登錄。
- Cookie是存儲(chǔ)在客戶端(通常是瀏覽器)中的小型文本文件(一般<=4KB)。服務(wù)器將Cookie發(fā)送給客戶端并存儲(chǔ)在客戶端的本地文件中,以便在后續(xù)HTTP請求中將Cookie發(fā)送回服務(wù)器。
- Cookie通常用于存儲(chǔ)少量簡單的文本數(shù)據(jù),例如用戶偏好設(shè)置或用于跟蹤用戶的身份驗(yàn)證令牌。
Cookie不是緩存,是持久化存儲(chǔ)數(shù)據(jù)的手段,瀏覽器自動(dòng)幫你存儲(chǔ),這個(gè)存儲(chǔ)是保存到硬盤上的;而緩存的數(shù)據(jù)不一定是持久化的(也可以在內(nèi)存里緩存);緩存的數(shù)據(jù)是用來提高訪問速度的!
- Cookie數(shù)據(jù)存儲(chǔ)在客戶端的瀏覽器中,因此可能容易受到客戶端篡改或竊取的風(fēng)險(xiǎn)。
- 由于每個(gè)HTTP請求都會(huì)包含任何相關(guān)Cookie數(shù)據(jù),因此可能會(huì)增加網(wǎng)絡(luò)流量和加載時(shí)間。
Session
- 服務(wù)器同一時(shí)刻收到的請求有很多,服務(wù)器需要清楚的區(qū)分每個(gè)請求屬于哪個(gè)客戶端,就需要先在服務(wù)器這里記錄每個(gè)用戶的身份標(biāo)識(shí)和所對應(yīng)的用戶信息。就有了session!sessionId是由服務(wù)器生成的一個(gè)唯一性字符串;
- Session數(shù)據(jù)通常存儲(chǔ)在服務(wù)器上。服務(wù)器為每個(gè)客戶端會(huì)話創(chuàng)建一個(gè)唯一的標(biāo)識(shí)符(通常是會(huì)話ID,sessionID),并使用該標(biāo)識(shí)符來跟蹤和管理與特定用戶相關(guān)的數(shù)據(jù)。
會(huì)話的本質(zhì)就是一個(gè)哈希表,存儲(chǔ)著一些鍵值對。其中key就是身份標(biāo)識(shí)(sessionId),value就是用戶信息(session)。
- Session用于存儲(chǔ)更敏感和持久的數(shù)據(jù),例如用戶身份驗(yàn)證信息。Session通常用于存儲(chǔ)更大、更復(fù)雜的數(shù)據(jù),如用戶登錄狀態(tài)、購物車內(nèi)容等。
- Session數(shù)據(jù)存儲(chǔ)在服務(wù)器上,客戶端無法直接訪問或修改Session數(shù)據(jù),因此通常比Cookie更安全。但服務(wù)器端的安全性也非常重要,以防止會(huì)話劫持等攻擊。
- Session數(shù)據(jù)存儲(chǔ)在服務(wù)器上,不會(huì)在每個(gè)請求中傳輸,因此不會(huì)對網(wǎng)絡(luò)性能產(chǎn)生太大影響。