JS Fetch: 一站式網路請求利器

在前端開發中,一次網路請求是無法避免的,而JS Fetch作為一種新型的網路請求API,其能夠幫助開發者更加簡潔、高效地完成數據請求,取代了原有的XMLHttpRequest(XHR)對象。

一、JS Fetch是什麼?

JS Fetch是一個現代化的API,用於代表HTTP請求的響應,並且支持Promise API(解決了XHR對象存在的非同步問題)。JS Fetch使從網路獲取資源變得非常容易,可以使用XMLHttpRequest對象替代傳統XHR對象,也可以通過其它 HTTP請求的工具庫進行替代。

fetch('http://example.com/movies.json')
  .then(response => response.json())
  .then(data => console.log(data));

fetch函數用於發起請求,它返回一個Promise對象,其中Promise的resolve方法返回一個Response對象,該對象表示與伺服器響應相關的信息。Response對象的body屬性包含通過fetch請求獲取到的BodyStream,而且可以通過使用各種解析器來解析文本數據。

二、JS Fetch的MDN文檔

MDN的JS Fetch文檔是學習使用JS Fetch時的最好指南之一。通過訪問MDN文檔,可以得到JS Fetch的基礎知識及使用方式。

// 獲取請求
fetch('http://example.com/movies.json')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(JSON.stringify(myJson));
  });

文檔中的這個例子展示了如何使用JS Fetch API從伺服器獲取JSON數據,而後使用console.log方法將數據列印到控制台中。其中的then方法鏈用於處理來自fetch函數的響應結果,並且返回一個Promise對象。

三、JS Fetch的API

fetch函數可接受多個參數,其中最重要的一個是URL參數,用於指定要獲取資源的URL字元串。除此之外,JS Fetch還支持一系列內置API,例如:

  • response.headers:包含響應標頭的「只讀」屬性。
  • response.ok:表示伺服器是否成功響應,其值為布爾類型。
  • response.status:響應狀態碼,它會根據錯誤代碼返迴響應。這個值在從伺服器獲取響應的時候非常常用,可用於判斷伺服器響應情況。
  • response.statusText:響應狀態類型的描述文本。
fetch('http://example.com/movies.json')
  .then(response => {
    console.log(response.headers.get('Content-Type'));
  });

上述代碼中,使用fetch獲取資源後,獲取響應的Content-Type,content-type是HTTP標頭,指示在得到伺服器響應的情況下接收的實體的媒體類型。

四、JS Fetch的await用法

JS Fetch支持ES7的Async/Await語法,把Promise代碼變成更容易可讀的同步代碼。我們可以在運行fetch時等待結果:

async function getUsername() {
  try {
    const response = await fetch('/api/user');
    const user = await response.json();
    return user.name;
  } catch (error) {
    console.error('獲取信息失敗', error);
  }
}

這裡是一個使用async/await獲取用戶信息的示例。當fetch請求成功後,它將返回一個響應對象,返回的結果將是可以調用JSON()函數的BodyStream對象的非同步解析。接下來,我們可以使用用戶的名字返回結果。

五、JS Fetch的POST請求

在HTTP中,POST請求是一種方法,HTTP客戶端用該方法向伺服器發送數據。同樣地,JS Fetch可以用於發送POST請求,代碼如下:

fetch('/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    user: 'john-doe'
  })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error))

在上述代碼中,我們可以看到fetch的第二個參數包含HTTP方法(這裡是’POST’)和用於發送與請求一起發送的數據體的附加信息。”headers”選項允許我們發送JSON響應,而”body”選項是POST請求中的數據負載。

六、JS Fetch函數

JS Fetch帶有內置方法,其中包括對通過fetch請求獲取文本內容(text)、JSON數據(json)以及ArrayBuffer對象等的處理方法。比如,我們可以使用如下代碼來解析來自fetch請求的文本響應:

fetch('/example.txt')
  .then(response => response.text())
  .then(data => console.log(data))
  .catch(error => console.log(error));

這裡,我們使用text()方法來解析來自fetch請求的文本響應。取決於響應,text()方法會返迴文本字元串。

七、JS Fetch跨域問題

JS Fetch默認會遵循『同域數據源』限制,以限制由於跨站點資源獲取而導致的數據泄露風險。但是,如果需要,我們也可以以跨域方式使用JS Fetch。

以下是一些例子:

fetch('https://api.example.com/data')
  .then((response) => {
    console.log(response);
  })
  .catch((error) => {
    console.error(error);
  });

上述例子中,我們使用了https://api.example.com上的API endpoint作為數據源。由於這是一個不同的域名,fetch請求將被阻止,因為它違反了「同源策略」。

如果我們嘗試在此情況下進行跨域請求,則需要向請求頭中添加credentials屬性:

fetch('https://api.example.com/data', {
  credentials: 'include'
})
  .then((response) => {
    console.log(response);
  })
  .catch((error) => {
    console.error(error);
  });

設置了credentials之後,fetch請求將可成功跨域。

八、JS Fetch Stream

JS Fetch Stream允許我們像流式傳輸一些數據一樣逐步接收數據。下面是fetch().body實現HTTP/2流傳輸的示例:

const res = await fetch('/stream');
const reader = res.body.getReader();

if (res.body === null) return;

while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  console.log(value);
}

上述代碼中的fetch()函數會返回一個Response對象,其中response.body是一個可讀的流。然後,我們為流創建一個reader對象,reader對象允許我們從可讀流中讀取數據。

九、JS Fetch Headers

Headers對象是與請求和響應頭部相關的相鄰信息,該對象包含所有HTTP報頭(也可以說成META數據)的集合。我們可以使用Headers對象來檢查fetch請求和響應的HTTP標頭:

fetch('/data')
  .then(response => {
    const headers = response.headers;
    console.log(headers);
  })
  .catch(console.error);

上述代碼中,我們使用了Headers對象來檢查來自fetch請求的響應頭。由於headers對象包含HTTP報頭的集合,因此我們可以輕鬆地得到伺服器響應的HTTP響應頭信息。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/280559.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-21 13:05
下一篇 2024-12-21 13:15

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python刷課:優化學習體驗的利器

    Python刷課作為一種利用自動化技術優化學習體驗的工具已經被廣泛應用。它可以幫助用戶自動登錄、自動答題等,讓用戶在學習過程中可以更加專註於知識本身,提高效率,增加學習樂趣。 一、…

    編程 2025-04-29
  • lsw2u1:全能編程開發工程師的利器

    lsw2u1是一款多功能工具,可以為全能編程開發工程師提供便利的支持。本文將從多個方面對lsw2u1做詳細闡述,並給出對應代碼示例。 一、快速存取代碼段 在日常開發中,我們總會使用…

    編程 2025-04-29
  • 使用Netzob進行網路協議分析

    Netzob是一款開源的網路協議分析工具。它提供了一套完整的協議分析框架,可以支持多種數據格式的解析和可視化,方便用戶對協議數據進行分析和定製。本文將從多個方面對Netzob進行詳…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • Qttus:一站式的物聯網解決方案

    Qttus 是一個全面的物聯網(IoT)解決方案,用於連接感測器、設備和雲。它可以幫助您在現有商業和製造業應用程序中輕鬆地添加 IoT 功能,同時提供可伸縮且安全的數據傳輸和存儲。…

    編程 2025-04-29
  • 微軟發布的網路操作系統

    微軟發布的網路操作系統指的是Windows Server操作系統及其相關產品,它們被廣泛應用於企業級雲計算、資料庫管理、虛擬化、網路安全等領域。下面將從多個方面對微軟發布的網路操作…

    編程 2025-04-28
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • 蔣介石的人際網路

    本文將從多個方面對蔣介石的人際網路進行詳細闡述,包括其對政治局勢的影響、與他人的關係、以及其在歷史上的地位。 一、蔣介石的政治影響 蔣介石是中國現代歷史上最具有政治影響力的人物之一…

    編程 2025-04-28

發表回復

登錄後才能評論