9. http協議_響應狀態碼_頁面渲染流程_路由_中介軟體
1. http協議
超文字傳輸協議
協議詳細規定了 瀏覽器 和 全球資訊網伺服器 之間互相通訊的規則
客戶端與服務端通訊時傳輸的內容我們稱之為報文(請求報文、響應報文)
- 常見的傳送 get 請求方式
在瀏覽器位址列輸入 url 地址訪問
所有的標籤預設傳送的是 get 請求:如 script link img a...
form 表單預設也是 get 請求
- 常見的傳送 post 請求方式
只能通過 form 表單,設定 method="post" 傳送
- ajax 可以傳送任意請求
2. 響應狀態碼
告訴瀏覽器(接受響應),響應內容是怎麼樣的狀態
- 1xx: 基本不用
- 2xx: 響應成功的狀態
200
- 3xx: 請求資源重定向
302 請求的資源/網址重新定向到新的一個網址
304 請求的資源/網址重新定向到快取中
- 4xx: 請求資源未找到
404 伺服器沒有問題,資源在伺服器中找不到
- 5xx: 伺服器內部錯誤
500 伺服器出錯了
3. 從瀏覽器輸入一個url地址(www.baidu.com),到最終頁面渲染完成,中間發生了什麼?
① DNS解析
將域名地址解析為 ip 地址
② TCP連線:TCP三次握手
第一次握手: 瀏覽器傳送給伺服器,告訴伺服器,我將要傳送請求了,你準備接受一下
第二次握手: 伺服器傳送給瀏覽器,告訴瀏覽器,我準備好了,你放馬過來
第三次握手: 瀏覽器傳送給伺服器,告訴伺服器,我真的要發了,你準備好
③ 傳送請求報文
請求報文
④ 接受響應
響應報文
⑤ 渲染頁面
遇到 html,呼叫 html 解析器,將 html 的 dom 結構解析為 dom 樹
遇到 css,呼叫 css 解析器,將 css 樣式解析 cssom 樹
將 dom 樹和 cssom 樹組合在一起,形成 render 樹
先佈局 layout,再渲染 render
遇到 js,呼叫 js 引擎,解析 js 程式碼,如果 js 中有操作 dom,它會修改 dom 樹,如果有修改樣式,它會修改 cssom 樹
將 dom 樹和 cssom 樹組合在一起,形成 render 樹
先佈局 layout,再渲染 render (頁面重排和重繪)
⑥ TCP四次揮手 斷開連線 ---- 斷開瀏覽器傳送的請求的連結,斷開瀏覽器接受響應的連結
第一次揮手: 瀏覽器傳送給伺服器,告訴伺服器,我東西(請求報文)發完了,你準備關閉吧
第二次揮手: 伺服器傳送給瀏覽器,告訴瀏覽器,我接受完了,我準備關閉,你也準備關閉吧
第三次揮手: 伺服器傳送給瀏覽器,告訴瀏覽器,我東西(響應報文)發完了,你準備關閉吧
第四次揮手: 瀏覽器傳送給伺服器,告訴伺服器,我接受完了,我準備關閉,你也準備關閉吧
4. 路由
組成:
請求方式 get(查) / post(增) / put(改) / delete (刪) ....
路由路徑 必須'/'開頭 /shop/:id :id部分有params引數
回撥函式(控制代碼函式)
- req 請求資訊
req.query 獲取查詢字串引數 GET 請求
req.params 獲取params引數
req.headers 獲取請求頭的所有資訊
req.body 獲取請求體引數 POST請求 (預設 express 框架是解析不了請求體資料的,要想解析需要引入中介軟體實現)
- res 響應資訊
注意:返回響應的方法有且只能設定一個,一旦有多個就會報錯
res.download(檔案相對路徑) 返回響應,讓瀏覽器自動下載指定檔案
res.sendFile(檔案絕對路徑) 返回響應,讓瀏覽器自動開啟指定檔案
res.end() 返回響應, 返回一個快速響應
res.json() 返回響應, 將傳入的資料轉化為json字串返回
res.send() 返回響應, 根據傳入的資料的型別,來自動判斷新增相應的響應頭來處理
res.redirect() 返回響應,請求資源重定向新的地址,預設響應狀態碼為302
res.get() 獲取響應頭的內容
res.set() 設定響應頭的內容
res.status() 設定響應狀態碼
作用: 接受請求、返回響應 定義請求地址
使用: app.請求方式(路由路徑, (request, response) => {});
request.query 引數(查詢字串引數): ?username=111&pwd=222
request.params 引數 : http://localhost:3000/hotel/123456 --> 123456就是params引數
5. 中介軟體
本質是一個函式 (req, res, next) => {}
作用:做一些重複做的事情。(當有多個路由重複做同一件事,這時就會交給中介軟體完成)
通過app.use(中介軟體函式)
解析原理:
所有路由和中介軟體都在一個數組中,會按照 js 引擎解析程式碼的先後順序新增路由和中介軟體
當請求傳送到伺服器的時候,伺服器獲取到當前的請求資訊(請求方式、請求路由路徑),
遍歷陣列,找到第一個匹配(請求路由路徑和請求方式必須完全一致)到的路由或者中介軟體(預設接受處理所有請求),執行其回撥函式
如果處理的是中介軟體,中介軟體內部如果呼叫了next()方法,還會接下來匹配下一個路由或者中介軟體
沒找到,返回一個狀態碼為404的響應, Cannot GET /xxx Cannot POST /xxx