JavaScript >> Javascript 文檔 >  >> JavaScript

使用 Axios 在 JavaScript 中創建異步 HTTP 請求

簡介

Axios 是一個基於 Promised 的 JavaScript 庫,用於發送 HTTP 請求。您可以將其視為 JavaScript 原生 fetch() 的替代品 功能。

我們將使用 Promises、async/await 等功能 ,以及本教程中的其他現代 JavaScript 設計模式。如果您想加快速度或刷新記憶,請先閱讀以下文章,然後再繼續:

  • 本文使用 ES2015 中引入的箭頭符號來定義函數。您可以在 JavaScript 中的箭頭函數文章中閱讀更多相關信息。
  • Axios 是一個基於 Promised 的庫。如果您需要了解有關 Promises 的更多信息,可以閱讀我們的 Promises in Node.js 指南。
  • 為了改善我們對 Promises 的體驗,我們將使用 Node.js async/await 句法。您可以閱讀我們的 ES7 中的 Node.js Async Await 文章來掌握此功能!

在本教程中,我們將製作 GET , POST , PUT , 和 DELETE 使用 Axios 對 REST API 的請求。讓我們進一步了解這個庫。

什麼是 Axios?

Axios 是一個現代的、基於 Promise 的 HTTP 客戶端庫。這意味著 Axios 用於發送 HTTP 請求並處理其響應,所有這些都使用 JavaScript 的 Promise。 Axios 在瀏覽器中同時支持 Node.js 和 JavaScript。

Axios 也是免費和開源的。您可以訪問其 GitHub 存儲庫以查看其代碼和文檔。

它通過保護用戶免受跨站點請求偽造(CSRF)等攻擊來內置一些網絡安全性。

由於其特性和易用性,它已成為 JavaScript 開發人員在進行 HTTP 調用時使用的流行選擇。讓我們從設置 Axios 開始吧。

設置 Axios

我們先新建一個文件夾,用默認設置初始化 NPM:

$ mkdir axios-tutorial
$ cd axios-tutorial
$ npm init -y

接下來,我們就可以使用 NPM 來安裝庫了:

$ npm i --save axios

注意 :如果您在項目中使用 TypeScript(例如使用 Angular 應用程序),Axios 庫與它的類型定義捆綁在一起。您不必採取額外的步驟來安裝類型!

如果你在瀏覽器上,你也可以使用 CDN 來導入腳本。

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

本教程使用 Node.js 和 CommonJS 來加載我們的庫。 CommonJS 是一個加載模塊的標準,特別是它指定了 require() 關鍵字這樣做。無論平台如何,示例都應該可以正常工作,無需任何更改。

現在我們已經在我們的開發環境中設置了 Axios,讓我們直接開始發出 HTTP 請求。

使用 Axios 編寫異步請求

在 Node.js 中,網絡請求等輸入和輸出活動是異步完成的。由於 Axios 使用 Promises 發出網絡請求,因此在使用此庫時不能選擇回調。我們使用 Promises 或 async/await 與 Axios 交互 關鍵字是使用 Promises 的另一種語法。

導入 Axios

如果您使用的是 CommonJS,Node.js 中有兩種方法可以導入庫。

您可以像這樣在代碼中導入模塊:

const axios = require('axios')

但是,許多 IDE 和代碼編輯器在像這樣導入時可以提供更好的自動完成功能:

const axios = require('axios').default;

這在使用 CommonJS 導入模塊時有效。我們建議您使用第二種方法作為自動補全,並且在您的 IDE 中查看代碼文檔可以使開發過程更輕鬆。

導入庫後,我們就可以開始發出 HTTP 請求了。

發送 GET 請求

讓我們使用 Axios 發送我們的第一個請求!這將是一個 GET 請求,通常用於檢索數據。

我們將向外部 API 發出 HTTP 請求,該 API 向我們發送博客文章列表。收到數據後,我們會將其內容記錄到控制台。如果我們遇到錯誤,我們也會記錄下來。

讓我們看看如何使用默認的 Promise 語法來製作一個。在一個名為 getRequestPromise.js 的新文件中 ,添加如下代碼:

const axios = require('axios').default;

axios.get('https://jsonplaceholder.typicode.com/posts')
    .then(resp => {
        console.log(resp.data);
    })
    .catch(err => {
        // Handle Error Here
        console.error(err);
    });

製作 GET 請求時,我們將資源的 URL 作為參數傳遞到 axios.get() 方法。

如果您使用 node getRequestPromise.js 運行此代碼 ,您將看到以下輸出:

[ { userId: 1,
    id: 1,
    title:
     'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
    body:
     'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum
 est autem sunt rem eveniet architecto' },
  { userId: 1,
    id: 2,
    title: 'qui est esse',
    body:
     'est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro ve
l nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla' },
...

現在讓我們看看如何使用 async/await 重寫相同的代碼 關鍵詞。在一個新文件 getRequestAsyncAwait.js ,添加如下代碼:

const axios = require('axios');

const sendGetRequest = async () => {
    try {
        const resp = await axios.get('https://jsonplaceholder.typicode.com/posts');
        console.log(resp.data);
    } catch (err) {
        // Handle Error Here
        console.error(err);
    }
};

sendGetRequest();

使用 async/await 語法,我們需要包裝 axios.get() async 中的函數調用 功能。我們用 try...catch 封裝方法調用 塊,以便我們可以捕獲任何錯誤,類似於 catch() 我們在 Promise 版本中使用的方法。接收 HTTP 數據的變量必須使用 await 關鍵字以確保在繼續之前接收到異步數據。從現在開始,我們將只使用 async/await 我們示例中的語法。

運行此代碼將在控制台打印與原始 Promise 示例相同的輸出。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

HTTP 請求的 Axios 響應(resp 示例中的對象)將包含有關 HTTP 響應的以下信息:

  1. data - 服務器提供的響應正文。如果服務器的響應是 JSON,Axios 會自動將數據解析成 JavaScript 對象。
  2. status - 響應中的 HTTP 狀態代碼,例如200 , 400 , 404 .
  3. statusText - 來自服務器響應的 HTTP 狀態消息,例如OK , Bad Request , Not Found .
  4. headers - 響應附帶的 HTTP 標頭。
  5. config - 為請求提供給 Axios API 的配置。
  6. request - 生成響應的本機請求。在 Node.js 中,這將是一個 ClientRequest 目的。在瀏覽器中,這將是一個 XMLHTTPRequest 對象。

現在我們已經了解瞭如何製作 GET 用axios請求,我們看看如何製作一個POST 請求。

發送 POST 請求

我們發送 POST 在 REST API 中創建新資源的請求。在這種情況下,我們將製作一個 POST 向 Axios 請求為用戶撰寫新的博文。

創建一個名為 postRequest.js 的新文件 並輸入以下代碼:

const axios = require('axios').default;

const newPost = {
    userId: 1,
    title: 'A new post',
    body: 'This is the body of the new post'
};

const sendPostRequest = async () => {
    try {
        const resp = await axios.post('https://jsonplaceholder.typicode.com/posts', newPost);
        console.log(resp.data);
    } catch (err) {
        // Handle Error Here
        console.error(err);
    }
};

sendPostRequest();

發送 POST 使用 axios.post() 您必須首先提供 URL,然後在第二個參數中提供請求數據。在這種情況下,我們發送 newPost 中的數據 變量,它將作為 JSON 發送到我們的 API。

使用 node postRequest.js 運行它 產生以下成功結果:

{ userId: 1,
  title: 'A new post',
  body: 'This is the body of the new post',
  id: 101 }

讓我們繼續看看我們如何發送 PUT 請求。

發送 PUT 請求

PUT 請求用於替換端點處的數據。您可以使用 axios.put() 發送 PUT 的方法 以類似於我們發送 POST 的方式請求 請求。

要查看它的實際效果,讓我們創建一個 PUT 請求更新第一篇博文的屬性。創建一個名為 putRequest.js 的新文件 代碼如下:

const axios = require('axios').default;

const updatedPost = {
    id: 1,
    userId: 1,
    title: 'A new title',
    body: 'Update this post'
};

const sendPutRequest = async () => {
    try {
        const resp = await axios.put('https://jsonplaceholder.typicode.com/posts/1', updatedPost);
        console.log(resp.data);
    } catch (err) {
        // Handle Error Here
        console.error(err);
    }
};

sendPutRequest();

就像 POST ,我們提供 URL 和我們要上傳的數據。使用 node putRequest.js 運行它 給我們:

{ id: 1, userId: 1, title: 'A new title', body: 'Update this post' }

現在我們已經介紹了兩種上傳數據的方法,讓我們看看如何刪除數據。

發送刪除請求

您可以發送 HTTP DELETE 使用 axios.delete() 請求 從 RESTful API 中刪除數據的方法。

讓我們通過發送 DELETE 來刪除博客文章 向 Axios 請求。在一個名為 deleteRequest.js 的新文件中 ,輸入以下內容:

const axios = require('axios').default;

const sendDeleteRequest = async () => {
    try {
        const resp = await axios.delete('https://jsonplaceholder.typicode.com/posts/1')
        console.log(resp.data);
    } catch (err) {
        // Handle Error Here
        console.error(err);
    }
};

sendDeleteRequest();

axios.delete() 函數只需要我們要移除的資源的 URL。用 node putRequest.js 執行這個程序 在終端中顯示:

{}

這意味著沒有返回任何數據,這在刪除資源時很好。但是,由於 Axios 沒有拋出任何錯誤,我們可以肯定它被正確處理了。

讓我們看看另一種使用配置發送 Axios 請求的方式,

配置請求

作為指定發出請求的函數的替代方法,我們可以提供一個 JavaScript 對象來配置 Axios 如何發送請求。例如,如果我想發送 PUT 不使用 axios.put() 的請求 ,我們可以像這樣配置Axios:

const axios = require('axios').default;

const sendRequest = async () => {
    try {
        const resp = await axios({
            method: 'PUT',
            url: 'https://jsonplaceholder.typicode.com/posts/1',
            data: {
                id: 1,
                userId: 1,
                title: 'A new title',
                body: 'Update this post'
            }
        });

        console.log(resp.data);
    } catch (err) {
        // Handle Error Here
        console.error(err);
    }
}

sendRequest();

在這種情況下,我們使用 axios 直接作為函數。我們向它傳遞一個 JavaScript 函數,其中包含 method 中使用的 HTTP 方法 , url 中的 API 端點 以及 data 中請求中的任何數據 屬性。

最終結果是一樣的,所以如果它更吸引你,你可以使用這種方式提出請求。

現在我們有了發送請求的句柄,讓我們通過設置自定義標頭來修改它們。

設置自定義標題

對於某些 API,原始請求需要在要處理的標頭中包含其他數據。一個常見的示例是設置對 HTTP 請求進行身份驗證的標頭。

如果我們使用 JWT 進行身份驗證和授權,我們必須將其添加到我們的請求中,這樣它就不會被 API 服務器拒絕。

讓我們看看如何將自定義標頭添加到 axios.get() 方法調用:

const axios = require('axios').default;

const sendGetRequest = async () => {
    try {
        const resp = await axios.get('https://jsonplaceholder.typicode.com/posts', {
            headers: {
                'authorization': 'Bearer YOUR_JWT_TOKEN_HERE'
            }
        });

        console.log(resp.data);
    } catch (err) {
        // Handle Error Here
        console.error(err);
    }
};

sendGetRequest();

正如您在此代碼示例中看到的,我們可以使用 headers 傳遞配置 屬性為請求設置自定義標頭。 headers property 是一個帶有字符串鍵和值的 JavaScript 對象。

您可以將此屬性添加到其他 Axios 方法中,例如 axios.post() , axios.put() , axios.delete() . headers 屬性應之後輸入 data axios.post() 中的對象 和 axios.put() .

接下來,讓我們看看如何使用 Axios API 配置設置自定義 header:

const axios = require('axios').default;

axios({
    method: 'GET',
    url: 'https://jsonplaceholder.typicode.com/posts',
    headers: {
        'authorization': 'Bearer YOUR_JWT_TOKEN_HERE'
    }
}).then(resp => {
    console.log(resp.data);
}).catch(err => {
    // Handle Error Here
    console.error(err);
});

在這種情況下,標頭只是 JavaScript 對象的另一個屬性!

結論

在本文中,您學習瞭如何在 Node.js 和瀏覽器 JavaScript 中使用 Axios 創建異步 HTTP 請求。您使用 Axios 方法發出請求 - axios.get() , axios.post() , axios.put()axios.delete() .您還使用 Axios API 通過配置帶有請求詳細信息的 JavaScript 對象來發送 HTTP 請求。最後,您在請求中添加了自定義標頭。

我們希望現在您對如何在您的下一個應用程序中使用 Axios 有一個很好的了解!你接下來要建造什麼?

本文的源代碼在 GitHub 上。


Tutorial JavaScript 教程
  1. 創建對象的五種方法...

  2. 構建 JAMstack 電子商務網站

  3. 可訪問性最佳實踐、設備測試和 SEO

  4. 如果元素出現超過 n 次,則刪除該元素的出現

  5. 2021 年最好的免費 Node 和 Express 課程

  6. 15 個有用的 Javascript 庫

  7. 如何從頭開始配置 Webpack 和 Vue

  1. 是否可以在函數內調用本地存儲並在 Windows.onload 中使用它? [關閉]

  2. RTM:ERROR 錯誤代碼 102:sendMessage 失敗,參數為:{“messageType”:“TEXT”}

  3. 使用 AWS SQS 在 Node.js 中進行消息隊列

  4. 我需要有關 Next.js api 的幫助

  5. JavaScript 字符串作為數字 | parseint,數字函數

  6. 卡片懸停動畫 - WotW

  7. 在 15 分鐘內在 Express 中構建簡單的身份驗證

  1. 揭秘 OAuth 2.0 - 教程和入門

  2. Redux 初學者視角講解(簡體)

  3. BootstrapVue 入門

  4. 歸併排序[算法]介紹