HTTP請求
HTTP請求由三部分組成:html
- 請求行:包含請求方法、地址和HTTP的協議版本
- 消息報頭:包含一系列的鍵值對
- 請求正文(可選):和消息報頭之間有一個空行
信息報頭中的主要信息有數據庫
- Host 是請求報頭域,用於指定被請求資源的 Internet 主機和端口號,它一般從 HTTP URL 中提取出來;
- Connection 表示鏈接狀態,keep-alive 表示該鏈接是持久連(persistent connection),即 TCP 鏈接默認不關閉,能夠被多個請求複用,若是客戶端和服務器發現對方有一段時間沒有活動,就能夠主動關閉鏈接;
- Cache-Control 用於指定緩存指令,它的值有 no-cache, no-store, max-age 等,max-age=秒錶示資源在本地緩存多少秒;
- User-Agent 用於標識請求者的一些信息,好比瀏覽器類型和版本,操做系統等; Accept
用於指定客戶端但願接受哪些類型的信息,好比 text/html, image/gif 等;
- Accept-Encoding 用於指定可接受的內容編碼;
- Accept-Language 用於指定可接受的天然語言;
- Cookie 用於維護狀態,可作用戶認證,服務器檢驗等,它是瀏覽器儲存在用戶電腦上的文本片斷;
HTTP的請求方式
HTTP請求方式一般有幾種方式瀏覽器
- GET(SELECT):
從服務器取出資源(一項或多項),從服務器獲取指定(請求地址)的資源信息,它一般只用於讀取數據,就像數據庫查詢同樣,不會對資源進行修改
- POST(CREATE):在服務器新建一個資源。向指定資源提交數據(好比提交表單,上傳文件),請求服務器進行處理。數據被包含在請求正文中,這個請求可能會建立新的資源,或者更新現有的資源
- PUT(UPDATE): 在服務器更新資源(客戶端提供改變後的完整資源)。經過指定資源的惟一標識(在服務器上的具體存放位置),請求服務器建立或更新資源。
- PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
- DELETE(DELETE):從服務器刪除資源。
- HEAD:獲取資源的元數據
- OPTIONS:獲取信息,關於資源的哪些屬性是客戶端能夠改變的。
GET和POST的區別:
- get的數據在url上,post在request body上
- get只能進行url編碼,post有多種編碼方式
- get是tcp/ip一次,post是兩次
- 對get的參數有字符限制,而post沒有(瀏覽器對URL的長度有限制,因此GET請求不能代替POST請求發送大量數據)
- get請求會被瀏覽器緩存,可是post不會,除非手動設置
- 當瀏覽器回退時,get是沒有影響的,可是post會再次提交請求
- 對參數的數據類型,get只能是ASCII字符,可是post沒有限制
- 對於第三點中的:get只產生一個TCP數據包,post是兩個數據包。get請求中會把header和data一併發送,可是post會先發送header,瀏覽器響應100 continue以後,再發送data。
- GET請求是冪等的
舉個例子:
GET只須要汽車跑一趟就能把貨送到,而POST要跑兩趟。第一趟先去和服務器打個招呼「hi,我等下要送一批貨,大家打開門迎接我」,而後再回頭把貨送過去。緩存
由於POST須要兩步,時間上消耗的要多一點,看起來GET比POST更有效,可是不能隨便改變兩種請求方式
1.get和post都有本身的語義,不能隨便混用
2.網絡環境好的時候,發一次包的時間和發兩次寶的時間基本能夠忽略。可是在網絡環境差的狀況下,兩次包的TCP在驗證數據包完整性上,有很是大的優勢
3.並非全部瀏覽器都會在POST中發送兩次包,Firefox就只發送一次。安全
HTTP特色
- 客戶端/服務端模式
- 簡單快速:客戶端向服務器請求服務時,經過傳送請求方式、請求地址和數據體(可選)便可
- 靈活:容許傳輸任意類型的數據對象,經過Content-Type標識
- 無狀態:對事物處理沒有記憶能力
小結
- GET 可提交的數據量受到 URL 長度的限制,HTTP 協議規範沒有對 URL 長度進行限制,這個限制是特定的瀏覽器及服務器對它的限制。
- 理論上講,POST 是沒有大小限制的,HTTP 協議規範也沒有進行大小限制,出於安全考慮,服務器軟件在實現時會作必定限制
參考連接:網絡
99%的人都理解錯了HTTP中GET與POST的區別併發