昨天我們認識了AJAX,但並沒有XMLHttpRequest ,最根本的原因在於:我不會,而且現在應該很少人用這個來請求了吧?現在大家不是都用fetch、axios…因此我就沒有介紹了。
那這篇就是要來介紹現在大家最常使用的fetch 以及axios 。
fetch()是一個全域的方法,包含了需要 fetch 的網址和對應的屬性設定 ( 例如 method、headers、mode、body...等,最基本的寫法屬性不一定要填 ),執行之後會送出 Request。
fetch基本語法:
let promise = fetch(url, [options])
裡面幾個參數的介紹:
如果只有放url 這個參數,沒有放[options],就會預設這個請求的HTTP請求方法是GET。
其餘options可以觀看MDN。
Fetch()的語法結構與Promise非常相似,同樣是用then和catch方法來處理成功和失敗的結果,如果送出去的請求得到回應就會回傳帶有 Response 的 Promise 物件(狀態是fulfilled),使用 then 將回傳值傳遞下去:
fetch("http://example.com/movies.json")
.then(function (response) {
return response.json();
})
.then(function (myJson) {
console.log(myJson);
})
.catch(function (error) {
console.log(error);
});
介紹一些常用的 Request屬性,其餘部分大家可以到 MDN 上查看:
| 屬性 | 設定值 |
|---|---|
| url | 第一個參數,一定要填的項目,代表需要 fetch 對象的網址 |
| method | GET、POST、PUT、DELETE、HEAD ( 預設 GET ) |
| headers | 要求相關的 Headers 物件 ( 預設 {} ) |
| mode | cors、no-cors、same-origin、navigate ( 預設 cors ) |
| redirect | follow、error、manual ( 預設 manual ) |
| cache | default、no-store、reload、no-cache、force-cache ( 預設 default ) |
| body | 要加到要求中的內容 ( 如果 method 為 GET 或 HEAD 則不設定 ) |
介紹一些常用的 Respons 屬性,其餘部分大家可以到 MDN 上查看:
| 屬性 | 設定值 |
|---|---|
| headers | 包含與 response 相關的 Headers 物件 |
| ok | 成功回傳 true,不成功回傳 false |
| status | 狀態代碼,成功為 200 |
| statusText | 狀態文字,成功為 ok |
| type | response 的類型,例如 basic、cors...等 |
| url | response 的 url |
介紹一些常用的 Respons 方法,其餘部分大家可以到 MDN 上查看:
| 方法 | 設定值 |
|---|---|
| json() | 返回 Promise,resolves 是 JSON 物件 |
| text() | 返回 Promise,resolves 是 text string |
| formData() | 返回 Promise,resolves 是 formData ( 表單資料對應的的 Key 或 Value ) |
| clone() | 建立 Response 的複製物件 |
| error() | 返回 Response 的錯誤物件 |
注意,只能使用一種方法來取得資料。例如我用了.json()的方法後,不能再用另一種方法來取得資料,因為該資料已經被處理過了。
看了這麼多文字跟表格,我們來實際操作一次吧。
以下範例的請求都會從 httpbin.org 這個網站裡挑選,它提供了各種不同的請求方式,在練習時是個很棒的工具。
Get 用法
先來看一下code:
fetch('https://httpbin.org/get')
.then((response) => {
console.log(response)
return response.json()
//return response.text()
}).then((myJson) => {
console.log(myJson)
})
我們剛剛學到過,當fetch()裡面只有 url 這個參數時,它的HTTP請求方法是GET。
當 fetch() 接受**'https://httpbin.org/get'** 這個網址時,表示要請求這個URL。
當請求通過後我們會得到一個Promise,以及此次請求的相關資訊:

讓我們看一下Response裡面有什麼:

裡面有請求的 url 和用來判斷請求是否成功的 status 狀態,以及我們剛剛前面有看到過的屬性。
那我們用console.log(myJson) 的內容又會是怎樣呢:

這邊有件事情要提醒一下,在 response 中有兩個內建函式可以用來得到請求回傳的資料。
一個是我們目前使用的return response.json() ,他能夠將回傳的資料以物件的方式傳給第二個 then 接收。
但當今天我們使用return response.text() ,當回傳的資料無法轉換為物件時,則會將請求資料以字串方式取出。
就會像這樣:

我們可以看到前面回傳的都是一樣的,但是在第二個then()之後,console出來的卻都是字串了。
Post 用法
一樣先看一下code:
fetch('https://httpbin.org/post', {
method: 'POST',
body: JSON.stringify(
{
name: 'GQSM',
age: 25
}
)
}).then((response) => {
return response.json()
}).then((myJson)=>{
console.log(myJson)
})
我們可以看到使用 POST 請求時需另外在 method 屬性內指定 POST 方式,且多了 body 屬性指定要送出的資料。
另外我們還可以看到這裡:JSON.stringify() 。
為什麼要先轉換成字串型態呢?這是因為:
body 須為字符串:body 可以包含不同類型的數據,如純文本、XML、JSON 等。然而,無論您要傳遞什麼類型的數據,它都必須是字符串。我們可以來看一下沒有轉成字串會發生什麼事:

注意到了嗎?在data那欄出現的是 [object Object] ,這也導致我們的請求在 server 端則是沒有辦法接收到正確的內容。
在 Fetch 中,請求失敗時不會有 error 可以直接捕捉,而是要以 response 的 status 的屬性值判斷,當 status 的值不等於 200 時,將在 .then 中使用 throw 創建一個錯誤,並由 .catch 接收錯誤內容處理
以上就是簡單Fetch()介紹,接下來換axios 。
什麼是axios ?
它是一個基於 Promise 的 HTTP 客戶端庫,主要用於瀏覽器和 Node.js 環境中進行 HTTP 請求。它簡化發送 HTTP 請求、處理回應和處理異常。
以下是 Axios 的一些主要特點和功能:
axios(url[,config])
axios回傳的物件是Promise(fulfilled狀態),所以我們一樣可以用.then和.catch去處理成功和失敗結果。
Get 用法
axios.get('https://httpbin.org/post')
.then(response => {
// 成功的回應
console.log('成功:', response.data);
})
.catch(error => {
// 失敗或錯誤處理
console.error('錯誤:', error);
});
Post 用法
axios.post('https://httpbin.org/post', {
title: '標題',
body: '內容',
userId: 1
})
.then(response => {
// 成功的回應
console.log('成功:', response.data);
})
.catch(error => {
// 失敗或錯誤處理
console.error('錯誤:', error);
});
config物件 用法
我們還可以通過傳遞一個 object 來自定義請求。
// 定義請求配置
const config = {
method: 'POST', // 請求方法
url: 'https://httpbin.org/post', // 請求的URL
headers: {
'Content-Type': 'application/json', // 請求標頭
},
data: { // 請求主體的數據
title: '標題',
body: '內容',
userId: 1
},
};
// 發送請求
axios(config)
.then(response => {
// 成功的回應
console.log('成功:', response.data);
})
.catch(error => {
// 失敗或錯誤處理
console.error('錯誤:', error);
});
使用 config 的方式使您能夠更靈活地設置和自定義每個請求。
.create來預設axios裏的config物件剛剛我們有介紹使用**config** 的方式來傳遞請求,axios有一個很方便的方法讓我們預設config。
const instance = axios.create({
baseURL: 'https://httpbin.org/post', // 設定基本 URL
timeout: 5000, // 設定請求超時時間,超過時間請求就會被中斷
headers: {
'Content-Type': 'application/json', // 預設請求標頭
},
});
// 使用預設配置的 GET 請求
instance.get('/posts/1')
.then(response => {
// 成功的回應
console.log('成功:', response.data);
})
.catch(error => {
// 失敗或錯誤處理
console.error('錯誤:', error);
});
// 使用預設配置的 POST 請求
instance.post('/posts', {
title: '標題',
body: '內容',
userId: 1
})
.then(response => {
// 成功的回應
console.log('成功:', response.data);
})
.catch(error => {
// 失敗或錯誤處理
console.error('錯誤:', error);
});
利用.create方法,我們就少寫一些重複的東西。這是一個最適合懶人的做法XD
我承認我有點懶惰了axios確實找比較少的資料,原諒我吧!!!
明天就是最後一天了,這段旅程真的要結束了!!!
參考資料:
https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/ajax_fetch.html
https://www.meticulous.ai/blog/fetch-vs-axios
https://medium.com/enjoy-life-enjoy-coding/jacascript-fetch-讓-es6-擁有一對翅膀-基礎教學-2f98efe55ba4