HTTP協議
- 應用層協議
- 應用層的作用:為應用程序提供網絡服務
- 序列化的意義、為什么要將數據序列化?
- HTTP協議概述
- HTTP的協議格式
- 請求
- 響應
- GET方法和POST方法的出現的場景和區別?
應用層協議
在應用層,需要我們傳遞應用層所需特殊的數據格式,這種數據可能是連續數據,例如int類型的整形變量,也可能是string類型的字符串,也可能是多個變量構成的結構體,那么就意味著我們發送的數據可能是連續的,也可能是不連續的,這時為了統一數據的解析方法,我們對數據在發送前進行序列化,在接收后進行反序列化。那么無論使用序列化還是反序列化,都需要對數據格式進行約定,以便于一端能夠正常進行解析。
而對數據進行約定,使之能夠正常的進行構造和解析,這種約定就是應用層協議
應用層的作用:為應用程序提供網絡服務
序列化的意義、為什么要將數據序列化?
序列化本質是將離散存儲的數據轉換為連續的數據,由于大量的數據存儲并非連續的,例如一個結構體中嵌套一個指針,而這個指針所指向的是一另一個結構體對象,那么此時當前結構體在存儲角度來看就是一個不連續的數據,如果我們貿然當當前的數據進行發送,對方接收到之后,其內部的指針指向的地址就無效了,因此我們需要將數據進行序列化,之后才可以進行存儲或者通過網絡發送出去。
HTTP協議概述
雖然應用層協議是程序員定的,但是為了方便大量的程序員使用,大佬們已經定義了現成的應用層協議可以直接使用,就比如HTTP協議
HTTP協議是無連接,無狀態,工作在應用層的協議。
其中無連接表示HTTP協議本身不維護連接信息,但是HTTP的數據會交給傳輸層的TCP協議,而TCP是面向連接的。
無狀態是指:HTTP本身不會對數據的請求和響應狀態進行保存。
HTTP的協議格式
協議格式分為:請求和響應
請求中包含:請求首行,請求頭部,空行,請求體
響應中包含:響應首行,響應頭部,空行,響應體
請求
注意:GET類型的請求沒有請求體
請求首行:[方法] + [url] + [版本]
請求方法主要有:GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及擴展方法,但常用的只有前兩個。
請求頭部:為請求報文添加了一些附加信息,由“名/值”對組成,每行一對,名和值之間使用冒號分隔
常見請求頭部如下:
請求頭 | 說明 |
---|---|
Host | 接受請求的服務器地址,可以是IP:端口號,也可以是域名 |
User-Agent | 發送請求的應用程序名稱 |
Connection | 指定與連接相關的屬性,如Connection:Keep-Alive |
Accept-Charset | 通知服務端可以發送的編碼格式 |
Accept-Encoding | 通知服務端可以發送的數據壓縮格式 |
Accept-Language | 通知服務端可以發送的語言 |
請求體:GET沒有請求體
請求體:POST請求體
響應
響應首行: [版本號] + [狀態碼] + [狀態碼解釋]
常見的狀態碼及其含義
狀態碼 | 含義 |
---|---|
200 | 響應成功 |
301 | 永久重定向,刪除源地址,保留重定向地址 |
302 | 臨時重定向 |
400 | 客戶端請求有語法錯誤,無法被服務器識別 |
403 | 服務器收到請求,但是拒絕提供服務 |
404 | 請求資源不存在 |
500 | 服務器內部錯誤 |
響應頭部:與請求頭部類似,為響應報文提供一些附加信息
常見的響應頭部如下:
響應頭部 | 說明 |
---|---|
Server | 服務器應用程序軟件的名稱和版本 |
Content-Type | 響應正文的類型(是圖片還是二進制字符串) |
Content-Length | 響應正文長度 |
Content-Charset | 響應正文使用的編碼 |
Content-Encoding | 響應正文使用的數據壓縮格式 |
Content-Language | 響應正文使用的語言 |
GET方法和POST方法的出現的場景和區別?
GET方法是最常見的請求方法,一般出現于以下幾種場景:
1.在瀏覽器輸入URL后點擊回車,實際上只要是網址,點擊之后都會觸發GET請求
2.一些圖片的src屬性,也會被構造出一個URL
POST方法也比較常見,一般出現于輸入用戶名和密碼之后,點擊登錄會觸發POST請求
GET方法和POST方法的區別?
1.沒有本質的區別,可以互相替換
2.語義不同,GET習慣于從服務器獲取數據,POST是向服務器提交數據
2.格式不同,GET方法一般沒有請求體,而POST方法有,所以GET習慣用URL傳遞數據,POST習慣用請求體傳遞數據
3.長度不同:GET方法一般有長度限制,POST請求沒有長度限制
4.后續維護不同:GET請求方法返回的內容可以被瀏覽器緩存起來,而POST方法不會緩存返回的內容
5.讀寫不同:GET主要是對數據查詢,而POST主要對數據進行修改