日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Axios vs. fetch():哪個最適合 HTTP 請求?

來源: 責編: 時間:2024-03-19 17:37:04 195觀看
導讀因為Axios的易于使用,所以有些開發人員比起內置的API,更喜歡Axios。但許多人高估了這個庫。fetch() API不但完全能夠重現Axios的關鍵功能,而且還有隨時可用于所有現代瀏覽器中的獨特優勢。在本文中,我將按照基本語法、向

因為Axios的易于使用,所以有些開發人員比起內置的API,更喜歡Axios。wW528資訊網——每日最新資訊28at.com

但許多人高估了這個庫。wW528資訊網——每日最新資訊28at.com

fetch() API不但完全能夠重現Axios的關鍵功能,而且還有隨時可用于所有現代瀏覽器中的獨特優勢。wW528資訊網——每日最新資訊28at.com

在本文中,我將按照基本語法、向后兼容性、響應超時、自動JSON數據轉換、HTTP攔截器、下載進度、同時請求這些方面來比較fetch()和Axios,看看它們如何執行任務。wW528資訊網——每日最新資訊28at.com

希望在本文結束時,大家對這兩個API有了更深入的了解。wW528資訊網——每日最新資訊28at.com

基本語法

在我們深入研究Axios更高級地功能之前,先與fetch()進行基本語法的比較。wW528資訊網——每日最新資訊28at.com

下面是Axios如何將帶有自定義請求頭的[POST]請求發送到指定URL的代碼:wW528資訊網——每日最新資訊28at.com

// axiosconst url = 'https://jsonplaceholder.typicode.com/posts'const data = {  a: 10,  b: 20,};axios  .post(url, data, {    headers: {      Accept: "application/json",      "Content-Type": "application/json;charset=UTF-8",    },  })  .then(({data}) => {    console.log(data);});

與fetch()版本進行比較:wW528資訊網——每日最新資訊28at.com

// fetch()const url = "https://jsonplaceholder.typicode.com/todos";const options = {  method: "POST",  headers: {    Accept: "application/json",    "Content-Type": "application/json;charset=UTF-8",  },  body: JSON.stringify({    a: 10,    b: 20,  }),};fetch(url, options)  .then((response) => response.json())  .then((data) => {    console.log(data);  });

注意:wW528資訊網——每日最新資訊28at.com

  • 為發送數據,fetch()使用body屬性將數據發送到服務端,而Axios使用data屬性
  • fetch()中的數據使用JSON.stringify方法轉換為字符串
  • Axios自動轉換從服務器返回的數據,但使用fetch()時,你必須調用response.json方法將數據解析為JavaScript對象。
  • 使用Axios,服務器提供的數據響應可以在數據對象中訪問,而對于fetch()方法,最終數據可以命名為任何變量

向后兼容性

Axios的主要賣點之一是其廣泛的瀏覽器支持。wW528資訊網——每日最新資訊28at.com

即使是像IE11這樣的舊瀏覽器也可以毫無問題地運行Axios。這是因為它背后使用了XMLHttpRequest。wW528資訊網——每日最新資訊28at.com

而fetch()僅支持Chrome 42+,Firefox 39+,Edge 14+和Safari 10.3+。wW528資訊網——每日最新資訊28at.com

如果你使用Axios的唯一原因是向后兼容性,那么實際上并不需要HTTP庫。而且,你可以將fetch()與polyfill一起使用,在不支持fetch()的web瀏覽器上實現類似的功能。wW528資訊網——每日最新資訊28at.com

要使用fetch() polyfill,可以通過npm命令進行安裝,如下所示:wW528資訊網——每日最新資訊28at.com

npm install whatwg-fetch --save

然后,提出如下請求:wW528資訊網——每日最新資訊28at.com

import 'whatwg-fetch'window.fetch(...)

謹記,在有些舊瀏覽器中,可能還需要promise polyfill。wW528資訊網——每日最新資訊28at.com

響應超時

在Axios中設置超時的簡單性,是一些開發人員比fetch()更喜歡Axios的原因之一。wW528資訊網——每日最新資訊28at.com

在Axios中,你可以使用配置對象的timeout屬性來設置請求中止之前的毫秒數。wW528資訊網——每日最新資訊28at.com

例如:wW528資訊網——每日最新資訊28at.com

axios({  method: 'post',  url: '/login',  timeout: 4000,    // 4 seconds timeout  data: {    firstName: 'David',    lastName: 'Pollock'  }}).then(response => {/* handle the response */}).catch(error => console.error('timeout exceeded'))

Fetch()通過AbortController接口提供類似的功能。wW528資訊網——每日最新資訊28at.com

不過,它的代碼不如Axios版本簡單:wW528資訊網——每日最新資訊28at.com

const controller = new AbortController();const options = {  method: 'POST',  signal: controller.signal,  body: JSON.stringify({    firstName: 'David',    lastName: 'Pollock'  })};  const promise = fetch('/login', options);const timeoutId = setTimeout(() => controller.abort(), 4000);promise  .then(response => {/* handle the response */})  .catch(error => console.error('timeout exceeded'));

代碼使用AbortController.abort()構造函數創建AbortController對象,它允許我們稍后中止請求。wW528資訊網——每日最新資訊28at.com

Signal是AbortController的只讀屬性,提供了一種與請求通信或中止請求的方法。wW528資訊網——每日最新資訊28at.com

如果服務器在4秒內沒有響應,則調用controller.abort(),終止操作。wW528資訊網——每日最新資訊28at.com

自動JSON數據轉換

如前所述,Axios在發送請求時會自動字符串化數據(當然你也可以覆蓋默認行為并定義不同的轉換機制)。wW528資訊網——每日最新資訊28at.com

但是,當使用fetch()時,你必須手動執行此操作。wW528資訊網——每日最新資訊28at.com

比較:wW528資訊網——每日最新資訊28at.com

// axiosaxios.get('https://api.github.com/orgs/axios')  .then(response => {    console.log(response.data);  }, error => {    console.log(error);  });
// fetch()fetch('https://api.github.com/orgs/axios')  .then(response => response.json())    // one extra step  .then(data => {    console.log(data)   })  .catch(error => console.error(error));

自動轉換數據是一個不錯的功能,但同樣,這不是你不能用fetch()做的事情。wW528資訊網——每日最新資訊28at.com

HTTP攔截器

Axios的主要功能之一是它能夠攔截HTTP請求。wW528資訊網——每日最新資訊28at.com

當你需要檢查或更改從應用程序到服務器的HTTP請求時,使用HTTP攔截器非常方便,從服務器到應用程序亦是如此(例如,日志記錄、身份驗證或重試失敗的HTTP請求)。wW528資訊網——每日最新資訊28at.com

使用攔截器就不必為每個HTTP請求編寫單獨的代碼。wW528資訊網——每日最新資訊28at.com

在你想要為處理請求和響應設置全局策略時,HTTP攔截器非常有用。wW528資訊網——每日最新資訊28at.com

以下是在Axios中聲明請求攔截器的方法:wW528資訊網——每日最新資訊28at.com

axios.interceptors.request.use(config => {  // log a message before any HTTP request is sent  console.log('Request was sent');  return config;});// sent a GET requestaxios.get('https://api.github.com/users/sideshowbarker')  .then(response => {    console.log(response.data);  });

上面的代碼中,axios.interceptors.request.use()方法用于定義發送HTTP請求之前要運行的代碼。而axios.interceptors.response.use()用于攔截來自服務器的響應。wW528資訊網——每日最新資訊28at.com

假設存在網絡錯誤,那么通過響應偵聽器,可以重試相同的請求。wW528資訊網——每日最新資訊28at.com

默認情況下,fetch()不提供攔截請求的方法,但它的解決方法也并不復雜。wW528資訊網——每日最新資訊28at.com

那就是覆蓋全局fetch()方法并定義自己的攔截器,如下所示:wW528資訊網——每日最新資訊28at.com

fetch = (originalFetch => {  return (...arguments) => {    const result = originalFetch.apply(this, arguments);      return result.then(console.log('Request was sent'));  };})(fetch);fetch('https://api.github.com/orgs/axios')  .then(response => response.json())  .then(data => {    console.log(data)   });

下載進度

進度條在加載時非常有用,尤其是對于互聯網速度較慢的用戶。wW528資訊網——每日最新資訊28at.com

以前,JavaScript程序員使用XMLHttpRequest.onprogress回調處理程序來實現進度指示器。wW528資訊網——每日最新資訊28at.com

Fetch API沒有onprogress處理程序。事實上,它通過響應對象的body屬性來提供ReadableStream的實例。wW528資訊網——每日最新資訊28at.com

以下示例表明如何使用ReadableStream在圖像下載期間為用戶提供即時反饋:wW528資訊網——每日最新資訊28at.com

index.html<!-- Wherever you html is -->  <div id="progress" src="">progress</div>  <img id="img">script.js'use strict'const element = document.getElementById('progress');fetch('https://fetch-progress.anthum.com/30kbps/images/sunrise-baseline.jpg')  .then(response => {    if (!response.ok) {      throw Error(response.status+' '+response.statusText)    }    // ensure ReadableStream is supported    if (!response.body) {      throw Error('ReadableStream not yet supported in this browser.')    }    // store the size of the entity-body, in bytes    const contentLength = response.headers.get('content-length');    // ensure contentLength is available    if (!contentLength) {      throw Error('Content-Length response header unavailable');    }    // parse the integer into a base-10 number    const total = parseInt(contentLength, 10);    let loaded = 0;    return new Response(      // create and return a readable stream      new ReadableStream({        start(controller) {          const reader = response.body.getReader();          read();          function read() {            reader.read().then(({done, value}) => {              if (done) {                controller.close();                return;               }              loaded += value.byteLength;              progress({loaded, total})              controller.enqueue(value);              read();            }).catch(error => {              console.error(error);              controller.error(error)                              })          }        }      })    );  })  .then(response =>     // construct a blob from the data    response.blob()  )  .then(data => {    // insert the downloaded image into the page    document.getElementById('img').src = URL.createObjectURL(data);  })  .catch(error => {    console.error(error);  })function progress({loaded, total}) {  element.innerHTML = Math.round(loaded/total*100)+'%';}

在Axios中實現進度指示器更簡單,尤其是在使用Axios進度條模塊時。wW528資訊網——每日最新資訊28at.com

首先,包含以下樣式和腳本:wW528資訊網——每日最新資訊28at.com

// the head of your HTML    <link rel="stylesheet" type="text/css"         />// the body of your HTML     <img id="img" />    <button onclick="downloadFile()">Get Resource</button>    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>    <script src="https://cdn.rawgit.com/rikmms/progress-bar-4-axios/0a3acf92/dist/index.js"></script>// add the following to customize the style<style>    #nprogress .bar {        background: red !important;    }    #nprogress .peg {        box-shadow: 0 0 10px red, 0 0 5px red !important;    }    #nprogress .spinner-icon {        border-top-color: red !important;        border-left-color: red !important;    }</style>

然后像這樣實現進度條:wW528資訊網——每日最新資訊28at.com

<script type="text/javascript">        loadProgressBar();        function downloadFile() {          getRequest(            "https://fetch-progress.anthum.com/30kbps/images/sunrise-baseline.jpg"          );        }        function getRequest(url) {          axios            .get(url, { responseType: "blob" })            .then(function (response) {              const reader = new window.FileReader();              reader.readAsDataURL(response.data);              reader.onload = () => {                document.getElementById("img").setAttribute("src", reader.result);              };            })            .catch(function (error) {              console.log(error);            });        }      </script>

代碼使用FileReaderAPI異步讀取下載的圖像。wW528資訊網——每日最新資訊28at.com

readAsDataURL方法以Base64編碼字符串的形式返回圖像的數據,然后將其插入到img標記的src屬性中以顯示圖像。wW528資訊網——每日最新資訊28at.com

并發請求

為了同時發出多個請求,Axios提供axios.all()方法。wW528資訊網——每日最新資訊28at.com

只需將請求數組傳遞給此方法,然后使用axios.spread()將響應數組的屬性分配給單獨的變量:wW528資訊網——每日最新資訊28at.com

axios.all([  axios.get('https://api.github.com/users/iliakan'),   axios.get('https://api.github.com/users/taylorotwell')]).then(axios.spread((obj1, obj2) => {  // Both requests are now complete  console.log(obj1.data.login + ' has ' + obj1.data.public_repos + ' public repos on GitHub');  console.log(obj2.data.login + ' has ' + obj2.data.public_repos + ' public repos on GitHub');}));

也可以使用內置的Promise.all()方法獲得相同的結果。wW528資訊網——每日最新資訊28at.com

將所有fetch請求作為數組傳遞給Promise.all()。接著使用async函數處理響應,如下所示:wW528資訊網——每日最新資訊28at.com

Promise.all([  fetch('https://api.github.com/users/iliakan'),  fetch('https://api.github.com/users/taylorotwell')]).then(async([res1, res2]) => {  const a = await res1.json();  const b = await res2.json();  console.log(a.login + ' has ' + a.public_repos + ' public repos on GitHub');  console.log(b.login + ' has ' + b.public_repos + ' public repos on GitHub');}).catch(error => {  console.log(error);});

結論

Axios在緊湊的軟件包中提供了一個易于使用的API,可滿足大多數HTTP通信需求。wW528資訊網——每日最新資訊28at.com

而web瀏覽器提供的fetch()方法則能完全重現Axios庫的主要功能。wW528資訊網——每日最新資訊28at.com

所以,是否加載客戶端HTTP API取決于你是否習慣使用內置API。wW528資訊網——每日最新資訊28at.com

編程快樂!wW528資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-77835-0.htmlAxios vs. fetch():哪個最適合 HTTP 請求?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Go語言實現自動HTTPS的快速、靈活的Web服務器

下一篇: 印度“硅谷”班加羅爾面臨缺水危機,科技企業另覓他處

標簽:
  • 熱門焦點
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式??梢詾閾碛兄付▽傩缘?HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
Top 主站蜘蛛池模板: 松原市| 敖汉旗| 内丘县| 石渠县| 开原市| 钟山县| 清远市| 新蔡县| 汾西县| 明水县| 岢岚县| 钟山县| 新宁县| 台北县| 九龙坡区| 竹山县| 河池市| 华阴市| 绍兴市| 盐亭县| 天津市| 石嘴山市| 饶河县| 天台县| 宜宾县| 通城县| 寿宁县| 荥阳市| 济南市| 灵璧县| 罗源县| 玉门市| 万全县| 天峻县| 洛隆县| 阳信县| 兴仁县| 台山市| 蛟河市| 洛宁县| 兰西县|