前端的請(qǐng)求如何到后端的 ?
前端的請(qǐng)求到達(dá)后端的步驟通常如下:
- 前端發(fā)起請(qǐng)求。前端通過(guò)瀏覽器向后端發(fā)送HTTP請(qǐng)求,可以使用Fetch、Axios、Ajax等庫(kù)來(lái)發(fā)起請(qǐng)求。
- 前端請(qǐng)求傳遞給web服務(wù)器。通過(guò)網(wǎng)絡(luò)通信,前端請(qǐng)求發(fā)送給Web服務(wù)器,一般使用HTTP協(xié)議。
- Web服務(wù)器接收請(qǐng)求并處理。Web服務(wù)器會(huì)接收到前端發(fā)送來(lái)的請(qǐng)求,然后根據(jù)請(qǐng)求URL、請(qǐng)求方法等信息,將請(qǐng)求路由到指定的后端處理程序。處理程序可以是使用Java、PHP、Python、Node.js等后端語(yǔ)言編寫(xiě)的程序。
- 后端處理請(qǐng)求并返回響應(yīng)。后端處理程序根據(jù)請(qǐng)求的具體類型及內(nèi)容,在處理過(guò)程中可能需要讀寫(xiě)數(shù)據(jù)庫(kù)、調(diào)用其他API等操作,處理完成后將返回JSON、HTML、XML等類型的響應(yīng)內(nèi)容。
- 響應(yīng)傳遞給Web服務(wù)器。后端程序處理完成后,將響應(yīng)內(nèi)容傳遞給Web服務(wù)器。
- Web服務(wù)器將響應(yīng)返回給前端。Web服務(wù)器收到后端返回的響應(yīng)內(nèi)容后,將響應(yīng)內(nèi)容封裝成HTTP響應(yīng)格式再返回給前端。
- 前端接收響應(yīng)并處理。前端接收到響應(yīng)內(nèi)容后,通過(guò)JavaScript等語(yǔ)言進(jìn)行解析和處理,更新用戶界面。
在這個(gè)過(guò)程中,前后端之間的數(shù)據(jù)傳輸一般是通過(guò)網(wǎng)絡(luò)協(xié)議完成,通常是HTTP協(xié)議。前端可以使用各種方式提供請(qǐng)求,如通過(guò)地址欄、超鏈接、表單、JavaScript等方式。后端則通過(guò)Web服務(wù)器及后端程序進(jìn)行處理,并將處理結(jié)果發(fā)送回前端。
HTTP請(qǐng)求解析
HTTP請(qǐng)求由請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求正文組成。
- 請(qǐng)求方法:
請(qǐng)求方法表示瀏覽器想要對(duì)服務(wù)器做什么,常見(jiàn)的有以下幾種:
- GET:獲取資源,一般用于查詢操作
- POST:提交數(shù)據(jù),一般用于更新/插入操作
- PUT:更新資源
- DELETE:刪除資源
- HEAD:獲取報(bào)文首部
- OPTIONS:查詢服務(wù)器支持哪些請(qǐng)求方法
- 請(qǐng)求頭:
請(qǐng)求頭包含了關(guān)于瀏覽器、客戶端所使用的操作系統(tǒng)、瀏覽器版本、請(qǐng)求的客戶端支持什么類型等信息,常見(jiàn)的請(qǐng)求頭有以下幾種:
- User-Agent:瀏覽器及操作系統(tǒng)信息
- Accept-Encoding:瀏覽器支持的壓縮算法
- Referer:表示當(dāng)前請(qǐng)求referer請(qǐng)求頭字段的值指示了當(dāng)前請(qǐng)求的上一個(gè)頁(yè)面。
- 請(qǐng)求正文:
如果是POST請(qǐng)求,可能會(huì)攜帶請(qǐng)求參數(shù),位于請(qǐng)求報(bào)文的報(bào)文主體中。
以下是一個(gè)示例的HTTP請(qǐng)求報(bào)文:
在這個(gè)示例中,請(qǐng)求方法是POST,請(qǐng)求頭包含瀏覽器信息、接受的數(shù)據(jù)類型、支持的壓縮算法等信息。請(qǐng)求正文是一個(gè)URL編碼的數(shù)據(jù)字符串,包含了用戶名和密碼字段。
什么場(chǎng)景下使用Fetch?什么場(chǎng)景下使用Axios?
Fetch 和 Axios 都是前端常用的網(wǎng)絡(luò)請(qǐng)求庫(kù)。它們都可以用來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求并處理相應(yīng)數(shù)據(jù),但是它們又有各自的優(yōu)缺點(diǎn)。下面是它們的特點(diǎn)以及使用場(chǎng)景的建議:
使用 Fetch 庫(kù)的場(chǎng)景
Fetch 是 Window 的一個(gè)新的 API,它是一個(gè)原生的JavaScript庫(kù),內(nèi)置于現(xiàn)代瀏覽器中。優(yōu)點(diǎn)如下:
- 原生支持 Promise,代碼更加簡(jiǎn)潔易懂;
- 支持流式( stream)傳輸,可以處理較大的響應(yīng)數(shù)據(jù);
- 提供了 Service Workers 支持,可以實(shí)現(xiàn)支持離線使用。
根據(jù)上面的優(yōu)點(diǎn),我們可以在以下場(chǎng)景使用 Fetch:
- 適用于現(xiàn)代瀏覽器,并且項(xiàng)目不需要考慮老版本瀏覽器的兼容性;
- 對(duì)于處理大響應(yīng)數(shù)據(jù),或者需要實(shí)現(xiàn)離線支持的項(xiàng)目。
因?yàn)?Fetch 不支持跨域的會(huì)話 Cookies,因此它的失敗率也會(huì)比較高,此外,F(xiàn)etch 的請(qǐng)求頭不能手動(dòng)設(shè)置,需要通過(guò) Headers 對(duì)象設(shè)置,因此在一些場(chǎng)景下使用可能會(huì)比較麻煩,需要自己封裝一些方法來(lái)使用。
使用 Axios 庫(kù)的場(chǎng)景
Axios 是一個(gè)基于 Promise 的 HTTP 請(qǐng)求庫(kù),其特點(diǎn)如下:
- 支持在 Node 環(huán)境中使用;
- 支持請(qǐng)求取消、請(qǐng)求攔截、響應(yīng)攔截等高階操作;
- 鏈?zhǔn)秸{(diào)用使得代碼更加簡(jiǎn)潔明了;
- 自動(dòng)轉(zhuǎn)換 JSON 格式數(shù)據(jù)。
根據(jù)上面的特點(diǎn),我們可以在以下場(chǎng)景使用 Axios:
- 在需要支持 Node.js 框架的項(xiàng)目中使用;
- 對(duì)于需要高階操作(比如請(qǐng)求取消、請(qǐng)求攔截等),以及需要在多個(gè)組件中使用相同的請(qǐng)求實(shí)例時(shí)使用;
- 對(duì)于需要處理 JSON 格式數(shù)據(jù)的應(yīng)用。
因?yàn)?Axios 是第三方庫(kù),它的體積比起 Fetch 來(lái)會(huì)比較大些,如果只是一個(gè)小型的項(xiàng)目,可能沒(méi)有必要使用它,不過(guò)對(duì)于一個(gè)大型的項(xiàng)目而言,使用 Axios 會(huì)更加方便和靈活。
綜上所述,我們可以根據(jù)項(xiàng)目的實(shí)際需求選擇使用 Fetch 或者 Axios,以達(dá)到最優(yōu)的網(wǎng)絡(luò)請(qǐng)求效果。
如何使用Fetch庫(kù)?
Fetch 是一個(gè)新的JavaScript庫(kù),用于發(fā)起網(wǎng)絡(luò)請(qǐng)求以獲取資源。它提供了一個(gè)更簡(jiǎn)單和更靈活的方式發(fā)送HTTP請(qǐng)求,比傳統(tǒng)的 Ajax 更為先進(jìn)和功能豐富。Fetch 它通過(guò) Promise 來(lái)處理異步請(qǐng)求和響應(yīng),讓代碼更加簡(jiǎn)潔和易于維護(hù)。
Fetch 語(yǔ)法如下:
- url: 請(qǐng)求的地址。
- options: 包含請(qǐng)求的參數(shù),如請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求體等。它是一個(gè)可選的參數(shù)對(duì)象,可設(shè)置以下屬性:method: 請(qǐng)求方法,如 GET、POST、PUT、DELETE 等,默認(rèn)是 GET。headers: 請(qǐng)求頭信息,它是一個(gè)對(duì)象,表示請(qǐng)求頭字段和其值的集合。body: 請(qǐng)求體,通常用于指定提交的數(shù)據(jù)格式,如 JSON、文本、formData 等。mode: 請(qǐng)求模式,例如 CORS、no-cors、same-origin 等,它是一個(gè)字符串類型。credentials: 是否允許發(fā)送包含憑據(jù)(如 cookie、認(rèn)證頭等)的請(qǐng)求。cache: 控制瀏覽器是否緩存請(qǐng)求。
當(dāng) fetch 函數(shù)被調(diào)用后,它會(huì)返回一個(gè) Promise 對(duì)象。這個(gè) Promise 對(duì)象會(huì)在請(qǐng)求成功后傳遞一個(gè)響應(yīng)對(duì)象( response)并調(diào)用對(duì)應(yīng)的 then() 方法。在響應(yīng)對(duì)象中可以取得請(qǐng)求返回的數(shù)據(jù),以及請(qǐng)求的狀態(tài)碼等信息。
以下是一個(gè)發(fā)送 GET 請(qǐng)求的示例:
以下是一個(gè)發(fā)送 POST 請(qǐng)求的示例:
在以上示例中,fetch 函數(shù)接受兩個(gè)參數(shù)。第一個(gè)參數(shù)是請(qǐng)求的URL,第二個(gè)參數(shù)包含請(qǐng)求的參數(shù),如 POST 請(qǐng)求的 body、headers 等。在 then() 方法中,我們可以使用 response.json() 解析響應(yīng)的 JSON 數(shù)據(jù),然后處理返回的數(shù)據(jù)。在 catch() 方法中,可以處理請(qǐng)求過(guò)程中可能出現(xiàn)的錯(cuò)誤。
如何在vue中引入Fetch庫(kù)?
在 Vue 項(xiàng)目中使用 Fetch 庫(kù),需要先在項(xiàng)目中安裝 Fetch 庫(kù):
安裝完成后,在 main.js 文件中添加以下代碼:
這樣,F(xiàn)etch 庫(kù)就可以在整個(gè)項(xiàng)目中使用了。在需要發(fā)送網(wǎng)絡(luò)請(qǐng)求的組件中,可以使用以下示例代碼:
其中,url 和 options 的使用方式與上文中介紹的一致。在 then() 方法中,可以通過(guò) response 對(duì)象獲取響應(yīng)數(shù)據(jù)。由于 fetch 返回的是一個(gè) Promise,因此我們也可以使用 async/await 來(lái)進(jìn)行異步代碼處理:
如果你想在 Vue 中全局使用 Fetch 庫(kù),你可以通過(guò)在 Vue.prototype 上添加一個(gè)方法實(shí)現(xiàn)全局調(diào)用:
這樣,在任何 Vue 組件中都可以通過(guò) this.$fetch 方法來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求了:
如果你習(xí)慣使用 Axios 等其它的網(wǎng)絡(luò)請(qǐng)求工具,也可以在 Vue 項(xiàng)目中使用它們來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求。只需要在項(xiàng)目中安裝和引入對(duì)應(yīng)的庫(kù)即可。