axios 源碼分析(上) 使用方法

来源:https://www.cnblogs.com/greatdesert/archive/2019/09/29/11607103.html
-Advertisement-
Play Games

axios是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,它可以在瀏覽器和node環境下運行,在github上已經有六七萬個星了,axios使用很方便,很多人在使用他,vue官方也推薦使用axios了,技術這東西還是隨主流吧,大家都用肯定有它的特長所在。 axios現在最 ...


axios是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,它可以在瀏覽器和node環境下運行,在github上已經有六七萬個星了,axios使用很方便,很多人在使用他,vue官方也推薦使用axios了,技術這東西還是隨主流吧,大家都用肯定有它的特長所在。

axios現在最新的版本的是v0.19.0,實現代碼也很好理解。我們本節先說一下它的使用方法,然後來分析一下它的實現源碼

我們可以使用兩種方式來創建一個axios實例:

  ·一種是直接調用axios(config) 

  ·另一種是調用axios.create(config)來自定義配置新建一個axios實例。

、config可以是一個url地址(此時表示發送get請求),也可以是一個對象,對象可以含有如下屬性:

  url                  ;請求的地址
  method                ;請求的類型                    ;可以是get、post、head、options、delete、put、patch之一
  data                  ;發送的數據                    ;作為請求主體被髮送的數據,只適用於PUT、POST、PATCH之一
  baseURL                 ;將自動加在url前面        
  params                ;即將與請求一起發送的url參數      
  paramsSerializer      ;負責params序列化的函數         ;一般可以忽略,axios內部可以自動序列化的
  timeout                ;超時時間(0表示無超時時間)
  responseType          ;伺服器響應的數據類型            ;可以是arraybuffer、blob、document、json、text、stream之一
  onUploadProgress    ;上傳處理進度事件
  onDownloadProgress    ;下載處理進度事件

、axios的配置有兩種預設配置方式:
    全局的axios預設值     通過修改axios.default上的屬性來設置                 ;例如:axios.defaults.baseURL = 'https://api.example.com';
    自定義實例預設值      可以傳入一個配置對象,用該對象新建一個axios實例      ;例如:var myaxios = axios.create({baseURL:'/ajax'})

、舉個慄子,有個需求是這樣的:有一個輸入框,對應兩個按鈕,點擊一個按鈕則請求資料庫使按鈕里的值+10,點擊另外一個按鈕則使按鈕里的值減5。

writer by:大沙漠 QQ:22969969

首先我們定義兩個php介面文件,分別為add.php和sub.php,add.php如下:

 sub.php如下:

  他們的路勁分別為http://j.com/ajax/add.php和http://j.com/ajax/sub.php,這是前後端分離典型的一個介面目錄,註意add.php的請求方式是get請求,而post.php是post請求,然後我們寫前端文件,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <input type="text" id="i">
    <button id="b1">遞增10</button>
    <button id="b2">遞增10(自定義配置)</button>
    <button id="b3">遞減5</button>
    <script>
        axios.defaults.baseURL = '/ajax/';
        b1.onclick =function(){                                     //全局的axios預設值方法                
            axios('/add.php?no='+i.value).then(res=>{
                if(res.data.code==0){
                    i.value = res.data.data.no
                }
            })
        }
        b2.onclick=function(){                                         //自定義的實例預設化
            var myaxios = axios.create({baseURL:'/ajax'})                //自定義配置,和按鈕1的實現效果是一樣的
            myaxios({
                url:'/add.php',
                params:{no:i.value}
            }).then(res=>{
                if(res.data.code==0){
                    i.value = res.data.data.no
                }
            })
        }
        b3.onclick=function(){                                         //對於post請求來說
            axios({
                method:'post',
                url:'/sub.php',
                data:"no="+i.value
            }).then(res=>{
                if(res.data.code==0){
                    i.value = res.data.data.no
                }
            })
        }
    </script>
</body>
</html>

頁面效果如下:

  當我們點擊遞增10時,頁面變為瞭如下:

點擊第二個按鈕後輸入框也是等於10,點擊遞減5按鈕後,輸入框如下:

、為了方便起見,所有支持的方法都提供了別名,如下:

    axios.get(url,config)              ;get請求的便捷方法 
    axios.delete(url,config)          ;delete請求的便捷方法
    axios.head(url,config)              ;head請求的便捷方法
    axios.post(url,data,config)          ;post請求的便捷方法
    axios.put(url,data,config)            ;put請求的便捷方法
    axios.patch(url,data,config)        ;patch請求的便捷方法

、因此實例的前端代碼可以腳本可以修改一下,如下:

    <script>
        axios.defaults.baseURL = '/ajax/';
        b1.onclick =function(){                                     //全局的axios預設值方法        
            axios.get('/add.php?no='+i.value).then(res=>{
                if(res.data.code==0){
                    i.value = res.data.data.no
                }
            })
        }
        b2.onclick=function(){                                         //自定義的實例預設化
            var myaxios = axios.create({baseURL:'/ajax'})                
            myaxios.get('/add.php?no='+i.value).then(res=>{
                if(res.data.code==0){
                    i.value = res.data.data.no
                }
            })
        }
        b3.onclick=function(){                                         //對於post請求來說
            axios.post('/sub.php',{method:'post',data:"no="+i.value}).then(res=>{
                if(res.data.code==0){
                    i.value = res.data.data.no
                }
            })
        }
    </script>

渲染結果是一樣的,挺簡單的吧。

axios請求後返回的是一個promise對象,如果成功了返回的response對象含有六個屬性,如下:

  data          ;由伺服器提供的響應數據
  status          ;來自伺服器響應的 HTTP 狀態碼   
  statusText      ;來自伺服器響應的 HTTP 狀態信息  
  headers         ;伺服器響應的頭,是個對象        ;包含content-type、date、connection、conetent-length、server等響應頭
  config             ;本次ajax請求的配置信息,是個對象
  request          ;本次請求對應的XMLHttpRequest對象

例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <input type="text" id="i">
    <button id="b">測試1</button>
    <script>
        b.onclick=function(){         
            axios('/ajax/add.php/no='+i.value).then(res=>{
                console.log(res.data)
                console.log(res.status)
                console.log(res.statusText)
                console.log(res.headers)
                console.log(res.config)
                console.log(res.request    )
            })
        }
    </script>
</body>
</html>

渲染如下:

我們點擊按鈕後輸出如下:

把promise()對象的信息給列印出來了,一般我們會在響應攔截器里對這些返回值一層判斷,響應器再後面介紹。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作用域 作用域表示一個代碼區域,也表示一個運行環境 JS中,有兩種作用域: 全局作用域 直接在腳本中書寫的代碼 在全局作用域中聲明的變數,會被提升到腳本塊的頂部,並且會成為全局對象的屬性。 函數作用域 函數中的代碼 在函數作用域中聲明的變數,會被提升到函數的頂部,並且不會成為全局對象的屬性. 因此, ...
  • 版本管理 概念:版本管理是軟體配置管理的基礎,它管理並保護開發者的軟體資源。 好處:可以保留我們的歷史版本,在代碼開發到一半的時候,不至於無故丟失,還可以查看BUG的來龍去脈。 版本管理種類:集中式的版本管理和分散式的版本管理。實現的控制軟體分別有SVN和Git。 瞭解了版本管理的概念那就進入主題, ...
  • ES6 新增加了兩個重要的 JavaScript 關鍵字 :let 和 const 先說一下 const :它用於聲明一個只讀的常量,一旦聲明,常量的值就不能改變。 由於const聲明的是一個只讀變數,不可被改變,所以聲明變數是就必須賦值,否自也會報錯。 要註意的是用const聲明的常量如果是一個 ...
  • 1、選擇第一級子節點 通過> 或者children方法實現 $('#XtraTabPage8>.datagrid-ftable') $('#XtraTabPage8').children('.datagrid-ftable') 2、選擇所有的子節點,即後代節點 通過空格實現 $('#XtraTabP ...
  • 1、form表單常用屬性練習 得到的效果是: ...
  • Cookie Cookie 是一種非常基礎的客戶端存儲方式,得到廣泛的支持 創建多個 cookie 的方法 當創建多個 cookie 時只能像這樣一個一個地創建,無法一次性創建多個 同一名字的 cookie 只能存在一個,因此再創建一個同名 cookie 相當於修改原有的 cookie 此時名為 的 ...
  • js的抖動 在 js 中 改變視窗大小 & 上下滾動滾動條 & 反覆向輸入框中輸入內容 ... , 如果綁定了相應的事件 , 這些事件的觸發頻率非常高, 嚴重影響用戶體驗和伺服器的性能 , 這種問題 在js中 就叫 js 的抖動 . 解決方法 : 防抖 & 節流 js的防抖 就是在 觸發事件 中設置 ...
  • 1、圖片和多媒體 (1) 圖片:img元素 src 屬性:圖片路徑; alt 屬性:圖片無法顯示時使用的替代文字; title:滑鼠懸停時顯示的文字 ; (2) 視頻:video元素 src 屬性:視頻路徑 ; controls 屬性:【布爾屬性】指定後,會顯示播放控制項; autoplay :【布爾 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...