# axios ###### tags: `AJAX` ## 1. axios的理解與使用 ### 什麼是axios * 前端最流行的ajax請求庫 * react/vue官方都推薦使用axios發ajax請求 * 文件:https://github.com/axios/axios ### axios特點 1. 基於xhr + promise的異步ajax請求庫 2. 瀏覽器端/node端都可以使用 3. 支援請求/響應攔截器 4. 支援請求取消 5. 請求/回應數據轉換 6. 批量發送多個請求 ### axios基本使用 ```htmlembedded= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div class="container"> <h2 class="page-header">基本使用</h2> <button class="btn btn-primary"> 发送GET请求 </button> <button class="btn btn-warning" > 发送POST请求 </button> <button class="btn btn-success"> 发送 PUT 请求 </button> <button class="btn btn-danger"> 发送 DELETE 请求 </button> </div> <script> //獲取按鈕 const btns = document.querySelectorAll('button') //第一個 btns[0].onclick = function(){ //發送AJAX請求 axios({ //請求類型 method: 'GET', url: 'http://localhost:3000/posts/2' }).then(response => { console.log(response) }) } //添加一篇新的文章 btns[1].onclick = function(){ //發送AJAX請求 axios({ //請求類型 method: 'POST', //URL url: 'http://localhost:3000/posts', //請求體 data: { title: '今天好熱', author: '馬凱' } }).then(response => { console.log(response) }) } //更新數據 btns[2].onclick = function(){ //發送AJAX請求 axios({ //請求類型 method: 'PUT', //URL url: 'http://localhost:3000/posts/3', //請求體 data: { title: '今天好熱', author: '李四' } }).then(response => { console.log(response) }) } //刪除數據 btns[3].onclick = function(){ //發送AJAX請求 axios({ //請求類型 method: 'delete', //URL url: 'http://localhost:3000/posts/3', }).then(response => { console.log(response) }) } </script> </body> </html> ``` ### axios其他使用 ```htmlembedded= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div class="container"> <h2 class="page-header">基本使用</h2> <button class="btn btn-primary"> 发送GET请求 </button> <button class="btn btn-warning" > 发送POST请求 </button> <button class="btn btn-success"> 发送 PUT 请求 </button> <button class="btn btn-danger"> 发送 DELETE 请求 </button> </div> <script> //獲取按鈕 const btns = document.querySelectorAll('button') //發送GET請求 btns[0].onclick = function(){ //axios() axios.request({ method: 'GET', url: 'http://localhost:3000/comments' }).then(response => { console.log(response) }) } //發送POST請求 btns[1].onclick = function(){ //axios() axios.post('http://localhost:3000/comments', { "body": "fewfwefwe", "postId": 2 }).then(response => { console.log(response); }) } </script> </body> </html> ``` ### axios設定預設配置 ```html= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div class="container"> <h2 class="page-header">基本使用</h2> <button class="btn btn-primary"> 发送GET请求 </button> <button class="btn btn-warning" > 发送POST请求 </button> <button class="btn btn-success"> 发送 PUT 请求 </button> <button class="btn btn-danger"> 发送 DELETE 请求 </button> </div> <script> //獲取按鈕 const btns = document.querySelectorAll('button') //預設設定 axios.defaults.method = 'GET' axios.defaults.baseURL = 'http://localhost:3000' axios.defaults.params = {id:100} btns[0].onclick = function(){ axios({ url: '/posts' }).then(response => { console.log(response) }) } </script> </body> </html> ``` ### axious建立實體物件發送請求 ```htmlembedded <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <div class="container"> <h2 class="page-header">基本使用</h2> <button class="btn btn-primary"> 发送GET请求 </button> <button class="btn btn-warning" > 发送POST请求 </button> <button class="btn btn-success"> 发送 PUT 请求 </button> <button class="btn btn-danger"> 发送 DELETE 请求 </button> </div> <script> //獲取按鈕 const btns = document.querySelectorAll('button') //創建實體物件 const word = axios.create({ baseURL: 'https://api.apiopen.top', timeout: 2000 }) //這裡word與axios物件的功能幾乎是一樣的 word({ url: '/getJoke', }).then(response => { console.log(response) }) word.get('/getJoke').then(response => { console.log(response.data) }) </script> </body> </html> ``` ### axious攔截器 ```htmlembedded= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> </head> <body> <script> // Promise // 設定請求攔截器 axios.interceptors.request.use(function (config) { console.log('請求攔截器 成功 -1') return config; }, function (error) { console.log('請求攔截器 失敗 -1') return Promise.reject(error); }); axios.interceptors.request.use(function (config) { console.log('請求攔截器 成功 -2') return config; }, function (error) { console.log('請求攔截器 失敗 -2') return Promise.reject(error); }); // 設定回應攔截器 axios.interceptors.response.use(function (response) { console.log('回應攔截器 成功 -1') return response; }, function (error) { console.log('回應攔截器 失敗 -1') return Promise.reject(error); }); axios.interceptors.response.use(function (response) { console.log('回應攔截器 成功 -2') return response; }, function (error) { console.log('回應攔截器 失敗 -2') return Promise.reject(error); }); //發送請求 axios({ method: 'GET', url: 'http://localhost:3000/posts' }).then(response => { console.log("自訂義回調處理成功的結果") }).catch(reason => { console.log('自訂義回調失敗') }) </script> </body> </html> ``` ### axios取消請求 ```htmlembedded= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>document</title> <link crossorigin='anonymous' href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script> </head> <body> <div class="container"> <h2 class="page-header">axios取消請求</h2> <button class="btn btn-primary"> 發送請求 </button> <button class="btn btn-warning" > 取消請求 </button> </div> <script> //獲取按鈕 const btns = document.querySelectorAll('button') //2.聲明一個全域變數 let cancel = null; //發送請求 btns[0].onclick = function(){ //檢測上一次的請求是否已經完成 if(cancel !== null){ //取消上一次的請求 cancel() } axios({ method: 'GET', url: 'http://localhost:3000/posts', //1.添加配置物件的屬性 cancelToken: new axios.CancelToken(function(c){ //3.將c的值賦值給cancel cancel = c; }) }).then(response =>{ console.log(response) //將cancel值初始化 cancel = null }) } //綁定第二個事件取消請求 btns[1].onclick = function(){ cancel(); } </script> </body> </html> ```