初學者指南:了解 JavaScript 的 fetch 函數

更新日期: 2024 年 9 月 14 日

在現代網頁開發中,從伺服器獲取資料是一個非常常見的需求。

過去,我們通常使用 XMLHttpRequest 來進行這些操作。

然而,隨著 Fetch API 的出現,我們有了一種更簡單、更靈活的方式來處理 HTTP 請求。

這篇文章將帶你了解 fetch 函數的概念,並展示如何在你的代碼中使用它。

什麼是 Fetch?

fetch 是一個基於 Promise 的 API,用於發送 HTTP 請求。

與傳統的 XMLHttpRequest 相比,Fetch API 更加簡潔,並且更容易理解和使用。

fetch 函數返回一個 Promise 物件,這是處理非同步操作的核心工具。

Promise 是一種用來處理未來某個時間點完成的操作(如 HTTP 請求)的 JavaScript 物件。

它允許我們使用 .then 和 .catch 方法來處理異步操作的結果,使代碼更加清晰和易於管理。

Fetch 函數的基本架構

基本語法

fetch 函數的基本語法如下:

fetch(url, options)
  • url:一個表示資源位置的字符串,通常是 API 的端點。
  • options(可選):一個配置物件,用來設定 HTTP 請求的各種參數。

Options 物件的詳細結構

options 物件允許我們自定義請求的各種參數。以下為常用的 Options 參數

method

指定 HTTP 請求的方法,例如 ‘GET’, ‘POST’, ‘PUT’, ‘DELETE’ 等。預設為 ‘GET’。

headers

一個包含請求標頭的對象。常用來設置 Content-Type 等

body

請求的主體內容,多用於 ‘POST’ 或 ‘PUT’ 請求。通常是 JSON 字符串。

mode

請求的模式,例如 ‘cors’, ‘no-cors’, ‘same-origin’。預設為 ‘cors’。

credentials

指定是否在請求中包含憑證,例如 ‘same-origin’ 或 ‘include’。

cache

設置請求的快取模式,例如 ‘default’, ‘no-store’, ‘reload’, ‘no-cache’, ‘force-cache’。

使用 fetch 發送 GET 請求

這裡是一個基本的示例:

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.json()) // 將響應轉換為 JSON
  .then(data => {
    console.log(data); // 打印獲取到的資料
  })
  .catch(error => {
    console.error('發生錯誤:', error); // 處理錯誤
  });

步驟 1:發送請求

fetch(‘https://jsonplaceholder.typicode.com/posts/1’) 發送一個 GET 請求到指定的 URL。

這個方法返回一個 Promise,表示請求的非同步操作。

這裡,fetch 的返回值是一個 Promise 對象。

步驟 2:處理響應

fetch 返回的 Promise 會在請求完成後解析(resolve),並傳遞一個 Response 物件,給第一個 .then 方法中的回調函數。

.then(response => response.json())

這行代碼中的 response 是 fetch 請求成功後返回的 Response 物件。

response.json() 會讀取這個 Response 的內容,並返回一個解析後的 JSON 對象的 Promise。

步驟 3:處理 JSON 數據

第二個 .then 方法中的回調函數接收解析後的 JSON 數據。

.then(data => {
     console.log(data); // 打印獲取到的資料
   })

步驟 4:錯誤處理

如果在請求過程中發生錯誤,我們可以使用 .catch 方法來處理。

.catch(error => {
     console.error('發生錯誤:', error); // 處理錯誤
   });

使用 Fetch 發送 POST 請求

除了 GET 請求,我們還可以使用 fetch 發送 POST 請求。

這裡是一個範例,說明如何發送帶有數據的 POST 請求:

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST', // 指定請求方法為 POST
  headers: {
    'Content-Type': 'application/json' // 指定請求頭為 JSON
  },
  body: JSON.stringify({
    title: 'foo',
    body: 'bar',
    userId: 1
  }) // 將請求主體轉換為 JSON 字符串
})
  .then(response => response.json()) // 將響應轉換為 JSON
  .then(data => {
    console.log(data); // 打印獲取到的資料
  })
  .catch(error => {
    console.error('發生錯誤:', error); // 處理錯誤
  });

步驟 1:指定請求方法

在 fetch 方法的第二個參數中,我們指定 method: ‘POST’ 來發送 POST 請求。

步驟 2:設置請求頭

使用 headers 屬性設置請求頭,這裡我們指定了 Content-Type 為 application/json,告訴伺服器發送的數據格式是 JSON。

步驟 3:發送數據

使用 body 屬性發送請求數據。我們使用 JSON.stringify 將 JavaScript 對象轉換為 JSON 字符串。

補充:JSON.stringify 方法

JSON.stringify 是 JavaScript 提供的一個內建方法,用於將 JavaScript 對象或數組轉換為 JSON 字符串。

這在需要將複雜的數據結構傳遞給伺服器時非常有用,因為伺服器通常需要以文本格式接收數據。

JSON.stringify 方法接受一個 JavaScript 對象或數組,並返回一個表示該對象的 JSON 字符串。

const user = {
  name: "John",
  age: 30,
  email: "john@example.com"
};

const jsonString = JSON.stringify(user);
console.log(jsonString); 

// 打印 {"name":"John","age":30,"email":"john@example.com"}

步驟 4:處理響應與錯誤

與之前的示例類似,我們使用 .then 來處理成功的響應,並使用 .catch 來處理可能出現的錯誤。

使用 Fetch 發送 POST 請求(await 版本)

你也可以將代碼轉換成 async / await 版本,代碼如下:

async function postData() {
  try {
    // 發送 POST 請求
    const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST', // 指定請求方法為 POST
      headers: {
        'Content-Type': 'application/json' // 指定請求頭為 JSON
      },
      body: JSON.stringify({
        title: 'foo',
        body: 'bar',
        userId: 1
      }) // 將請求主體轉換為 JSON 字符串
    });

    // 確認響應的狀態是否為 2xx
    if (!response.ok) {
      throw new Error('網絡回應非正常狀態');
    }

    // 將響應轉換為 JSON
    const data = await response.json();
    console.log(data); // 打印獲取到的資料
  } catch (error) {
    console.error('發生錯誤:', error); // 處理錯誤
  }
}

// 調用 postData 函數
postData();

步驟 1:定義異步函數

使用 async function 定義一個名為 postData 的異步函數。

步驟 2:發送請求

使用 await fetch 發送一個 POST 請求,並等待請求完成。這裡的 fetch 請求配置與之前的代碼相同。

步驟 3:檢查響應狀態

在獲取響應後,使用 if (!response.ok) 檢查響應狀態。如果響應不是 2xx,則拋出一個錯誤。

步驟 4:處理響應數據

使用 await response.json() 將響應轉換為 JSON 格式,並打印數據。

步驟 5:錯誤處理

使用 try/catch 塊來捕捉和處理請求過程中可能發生的錯誤。

步驟 5:錯誤處理

最後,調用 postData 函數以執行上述操作。

總結

fetch 函數提供了一個靈活且強大的方式來發送 HTTP 請求。

通過設置 options 對象中的各種參數,你可以自定義請求的各個方面。

Similar Posts