Http基礎
- HTTP基礎
- HTTP協議
- 請求方法
- 持久連接
- 管線化
- 無狀態協議
- 使用Cookie狀態管理
- 狀態碼
- 1XX
- 2XX OK
- 200 OK
- 204 NO Content
- 206 Content-Range
- 3XX 重定向
- 301
- 302
- 304
- 307
- 4XX
- 400
- 401
- 403
- 404
- 5XX
- 500
- 503
- HTTP報文
- 請求報文
- 響應報文
- 通用首部字段
- Cache-Control
- Connection
- Date
- 請求首部字段
- Accept
- Accept-Charset
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Host
- If-Match
- If-Modified-Since
- If-None-Match
- Referer
- User-Agent
- 響應首部字段
- Accept-Ranges
- Age
- Location
- Server
- 實體首部字段
- Allow
- Content-Encoding
- Content-Language
- Content-Type
- Expires
- Last-Modified
- 跨域-cors
- 兩種請求
- 簡單請求
- 瀏覽器不同的處理方式
- 非簡單請求
HTTP基礎
HTTP協議
HTTP- Hyper Text Transfer Protocl 超文本傳輸協議
對我們的客戶端和服務端值之間數據之間實現傳輸(文字、圖片、音頻、視頻等等)
客戶端 => 服務端通信
- 客戶端:請求訪問文本資源的一端
- 服務端: 提供資源響應的一端
HTTP協議規定:客戶端發起請求、服務端回復響應
先從客戶端建立通信、服務端在沒有接收通信之前不發送響應
屬于應用層 第一層HTTP
請求方法
- GET 一獲取資源
- POST - 傳輸實體主體
- 雖然GET也可以傳輸實體主體,但是一般我們不用
- PUT傳輸文件
- HEAD -獲取報文首部
- HEAD 不返回報文主體部分
- DELETE 一刪除文件
- OPTION -預檢請求
- TRACE 一 追蹤路徑
持久連接
HTTP請求在應用層,核心通道基于TCP連接
頁面有很多的圖片,在發送請求訪問HTML,也可能包含其他的資源、所以我們每一次請求都要建立一次TCP的鏈接和斷開增加了通信量的開銷
過去的http連接:
建立TCP連接:三次握手
斷開TCP連接:四次揮手
Http1.1中:Connection:Keep-Alive
Connection:代表TCP信道的鏈接
只要任意一端沒有明確提出端口鏈接,則保持TCP連接狀態
(建立一次TCP鏈接,可以一次性的發送所有http請求)
好處:減少了TCP鏈接的重復建立以及我們斷開鏈接的開銷、減輕了服務器的負載、提高了運行速度
HTTP 1.1 默認就是持久連接
如何區分http用的是同一個TCP信道?
connectionID(連接ID)相同的是同一個TCP信道
connectionID:標識 標識單個請求新建立信道索引
管線化
并行發送多個請求,不是一個一個等著響應
無狀態協議
http協議就是一種無狀態協議,不保存狀態
不對請求和響應之間的通信狀態進行保存
目的:更快的處理大量事務、確保協議的可伸縮性
使用Cookie狀態管理
引入cookie
服務端 set-Cookie 通知客戶端保存Cookie
客戶端下一次在進行發送的時候,會將之前設置的cookie進行攜帶
性能: cookie 每次請求都會攜帶,性能受到影響
跨域:cookie無法跨域調用,需要指定一個作用域
狀態碼
負責客戶端HTTP請求的返回結果
當客戶端向服務器發送請求時候,描述返回的請求結果。能夠知道服務端是正常除了請求,還是有錯誤
1XX
信息性狀態碼
作用:接收的請求正在處理中
2XX OK
Success -成功狀態碼
表示請求處理正常且成功
200 OK
表示從客戶端發來的請求在服務端進行正常處理了
204 NO Content
表示服務器接收的請求已經成功處理,但是返回的響應報文中不包含實體的主體部分,而且不返回任務實體的主體
場景:從客戶端發送請求給服務端,對客戶端不需要發送新信息內容的情況
206 Content-Range
表示客戶端進行了范圍請求
Content-Range
3XX 重定向
表示瀏覽器需要執行某些特殊的處理以及正確處理請求
301
永久性重定向:請求該資源時候每次都返回一個新的url
302
臨時性重定向:請求該資源時候每次都返回一個新的url,可能只限于本次
代表資源不是被永久移動,只是臨時的。
304
表示發送一些附帶條件的請求。
加上一些附帶的條件
if-Match, if-Modified-since ,if-Range
雖然是3xx系列,但是和重定向沒啥關系
307
臨時重定向:期望客戶端保持請求方法不變,向新的地址發出請求
4XX
客戶端錯誤
400
表示請求報文中存在語法錯誤
錯誤發生、需要修改請求的內容然后重新發送,瀏覽器會像200 對待
401
表示需要有通過HTTP認證的認證信息
403
表示對請求資源的訪問被服務器拒絕了。而且沒有必要給出拒絕的詳細理由。如果想說明,則在主體返回
404
無法找到請求的資源
5XX
服務器本身發生了錯誤
500
表示服務器在執行請求的時候發生了錯誤
503
服務器超負載了處理停機維護狀態
HTTP報文
- 報文首部 一客戶端和服務器處理是的請求或者響應的內容以及屬性
- 報文主體 -應該被發送的數據
請求報文
客戶端的HTTP報文
請求行 - 方法、URL \HTTP版本
首部字段:
- 請求
- 通用
- 實體
響應報文
服務器的HTTP報文
狀態行一HTTP版本、狀態碼
首部字段:
- 響應首部字段
- 通用首部字段
- 實體首部字段
HTTP首部字段類型
- 通用首部字段-請求報文和響應報文 都會使用的首部
- 請求首部字段 一 從客戶端向服務器發送請求報文時使用的首部
- 響應首部字段一從服務器向客戶端返回響應報文使用的首部
- 實體首部字段 —請求報文 和響應報文使用的首部
通用首部字段
Cache-Control
能操作緩存的工作機制
- public 表明其他用戶可以利用緩存
- private 只以特定的用戶作為對象
public private 相反 - no-cache一防止從緩存中返回過期的資源,緩存服務器轉發給源服務器
Connection
作用:
- 控制不在轉發給代理的首部字段
connection:不在轉發的首部字段
Hop-by-hop - 管理持久連接
connection:close
- 服務器明確的斷開鏈接connection: Keep-Alive
- 持久連接
Date
表明創建http報文的日期和時間
請求首部字段
作用: 補充一些請求的附加信息、客戶端信息、對響應內容相關的優先級等
Accept
能夠處理的媒體類型以及媒體類型的優先級
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
- 文本文件
- text/html - HTML格式 text/plain-純文本格式,text/css -css格式
- 組合application/xhtml+xml,application/xml,application/json ,application/pdf
- 圖片文件
- image/jpeg - jpeg 格式,image/webp,image/apng image/png,image/gif
- 視頻
- video/mpeg,video/quicktime
- 應用程序中使用的二進制文件
- application/octet-stream, application/zip,application/x-www-form-urlencoded
q=0.9 權重
范圍0~1可以精確到小數點后3位
1為最大值、默認為1.0
accept—期望,提供給服務端的一些參考意見
Accept-Charset
期望支持的字符集優先級
Accept-Charset
期望支持的字符集 優先級
http
Accept-Charset: charset = utf-8
Accept-Encoding
期望支持的內容編碼,被壓縮的
包裝
好處:減少網絡流程,提升我們的性能
- gzip
- compress
- deflate
-br - identity - 不執行壓縮或者不會發生變化的默認編碼格式
注:
我們在要求服務器按照某種方式返回,但是這不是強制。如果說服務器不支持或者不開啟,那么不起作用
如果服務器支持壓縮,或者開啟,響應報文的Content-Encoding 告知
Accept-Language
期望能夠處理的語言集
zh-CN,zh;q=0.9,en;q=0.8
Host
Host:
www.baidu.com
請求資源所處的互聯網主機名和端口號
唯一一個必須要包含在請求內的首部字段
相同的IP地址下部署了多個域名,那么服務器就無法知道哪一個域名對應的請求。
If-Match
像If-xxx 條件請求。服務器接收到附帶的條件的請求后,只有判斷指定條件為真,才會執行請求
If-Match: “12345”
兩端資源進行比較,只有判斷條件為真才會接收請求
If-Modified-Since
如果服務器If-Modified-Since 早于資源的更新時間,希望能處理請求
不滿足條件的話,服務器返回304代碼
If-None-Match
實體標記(ETag) 值和請求資源的ETag的值不一致的時候,告訴服務器處理請求
Referer
告訴服務器,請求的原始資源的地址
User-Agent
客戶端的信息傳給服務器了
內容包含:操作系統/版本 、瀏覽器/版本、設備信息(移動端)/版本
響應首部字段
用于補充響應的附加信息、服務器信息、對客戶端的附加要求
Accept-Ranges
告訴客戶端,我服務器是否可以接受范圍請求,是bytes,否none
Age
資源在代理緩存中存在的時間
Location
客戶端重定向的URL
Server
服務器的名字:Apache Nginx BWS gws
實體首部字段
Allow
資源的正確請求方式:GET HEAD POST
服務器接收到了不支持的HTTP方法,會以狀態碼405
Content-Encoding
- gzip
- compress
- deflate
- br
Content-Language
告訴客戶端,用的哪一種語言
Content-Type
說明了實體主題內對象的媒體類型
text/html charset=utf-8
Expires
資源失效的日期
緩存服務器 如果接收到了這個字段,會以緩存來應答,如果在這個時間之前,響應的副本會一直保存
如果超過了這個時間,會轉發給服務器
如果源服務器不希望緩存服務器對資源進行緩存,那么這個時間設置為Date相同的時間即可。
Last-Modified
指明資源在最后修改的時間
跨域-cors
Cors => 跨域資源共享
同源策略:端口、域名、協議
跨域構成條件:
- 端口不同
- 協議不同
- 域名不同
三個只要一個不同,就是不同源。只要不同源,就是跨域
兩種請求
簡單請求
兩個條件:
- 請求方法是:HEAD,GET,POST
- header中只能包含以下請求字段:
- Accept
- Accept-Language
- Content-Language
- Content-Type
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
瀏覽器不同的處理方式
簡單請求跨域,瀏覽器會讓請求發出
GET /cors HTTP/1.1
Origin: http://www.baidu.com
Host: api.alice.com
Accept-Language: en-US
Connection: keep-alive
User-Agent: Mozilla/5.0 ...
響應頭會加Access-Control-Allow-Origin
,表示對該來源的請求是允許的
Access-Control-Allow-Origin: http://www.baidu.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type:text/html; charset=utf-8
Access-Control-Allow-Origin
是必須的
要么是請求時,Origin的值。
那么就是 * => 表示接受任意域名的請求但是存在安全隱患
如果沒有這個頭部信息,說明了服務器沒有開啟資源共享,瀏覽器會認為這次請求失敗Access-Control-Allow-Credentials
是可選的
表示允許發送Cookie
true: 表示服務器明確許可,可以在請求中一起發送
如果不要瀏覽器發送cookie那么刪掉
非簡單請求
只要不是簡單請求,那就是非簡單請求
先發送OPTIONS 預檢請求
OPTIONS請求按照簡單請求的方式處理
目的: 保護客戶端的安全,防止不受信任的網站利用用戶的瀏覽器向其他網站發送惡意請求
- Access-Control-Request-Method:告訴服務器實際發送的HTTP請求方法
- Access-Control-Request-Header:告訴服務器實際請求所攜帶的自定義的頭部信息
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding:gzip,deflate
Accept-Charset:IS0-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://www.baidu.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers:X-PINGOTHER,Content-Type
服務器根據這些信息決定,該請求是否被允許
響應的
Access-Control-Allow-Methods:POST
Access-Control-Allow-Headers:X-PINGOTHER,Content-Type
什么時候觸發OPTIONS請求?
- 跨域的時候,Access-Control-Request-Headers: X-PINGOTHER,Content-Type
- 發送跨域的時候,使用PUT、DELETET、CONNECT、OPTIONS、TRACE、PATCH