Axios學習一

一、基本使用

Axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。Axios就是一個能夠發起HTTP請求的js庫。官網地址
由於Axios是基於ES6的Promise的,所以axios必須在支持ES6 Promise的環境下運行。
1.get請求示例

採用<script>引入axios庫
 <script type="text/javascript" src="../lib/axios.js"></script>
 
axios.get("http://localhost:8888/empno")
        .then(function (response) {
            console.info(response);
        })
        .catch(function (error) {
            console.info(error);
        })
        .finally(function () {
            console.info("不管前面執行的如何,這裏都會執行到!");
        });

運行結果如下:
在這裏插入圖片描述
可以看到 ,響應的結果包含以下幾個部分:

{
   config:{},
   //data就是服務端響應返回的數據
   data:{},
   //服務端所有的響應頭信息
   headers:{},
   request:...
   //來自於服務端的HTTP響應狀態碼
   status:200,
   statusText:""
}

get請求參數也可以寫成這樣

    axios.get("http://localhost:8888/empNo", {
        params: {
            empno: '7369'
        }
    })
        .then(function (response) {
            console.info(response.data);
        })
        .catch(function (error) {
            console.info(error);
        })
        .finally(function () {
            console.info("不管前面執行的如何,這裏都會執行到!");
        });
        //結果爲:
       {empno: 7369, ename: "SMITH", job: "CLERK", mgr: 7902, hiredate: "1980-12-17 00:00:00", …}
       不管前面執行的如何,這裏都會執行到!

2.post請求示例

    axios.post("http://localhost:8888/", {
        empno: '0591',
        ename: 'Tom',
        job: '程序員'
    })
        .then(function (response) {
            console.info(response.data);
        })
        .catch(function (error) {
            console.info(error);
        })
        .finally(function () {
            console.info("不管前面執行的如何,這裏都會執行到!");
        });
    /**
     * AJAX Post請求中常用的兩種傳參數的形式分別是Form Data 和 Request Payload
     * Request Payload 請求頭爲: Content-Type: application/json;charset=UTF-8,並且請求正文是一個 json 格式的字符串
     * Form Data  請求頭部爲: Content-Type: application/x-www-form-urlencoded,並且請求正文是類似 get 請求 url 的請求參數
     * 其他情況如使用原生AJAX的POST請求如果不指定請求頭Request Header,默認請求頭尾:Content-Type:text/plain;charset=UTF-8,參數出現在Request payload塊。
     *
     * 後端採用 Spring MVC框架開發的話
     * 對於 Request Payload 請求, 方法必須加 @RequestBody 註解才能將請求正文解析到對應的 bean 中,且只能通過 request.getReader() 來獲取請求正文內容
     * 對於 Form Data 請求,無需任何註解,Spring MVC會自動使用 MessageConverter(消息轉換器) 將請求參數解析到對應的 bean,且通過 request.getParameter(...) 能獲取請求參數
     * axios的Post請求默認是Request Payload 請求
     */

後端代碼如下:

 /**
     * 保存員工信息
     *
     * @param request
     * @return
     */
    @PostMapping("/")
    public Map<String, Object> saveEmp(HttpServletRequest request, @RequestBody Emp emp) {
        Map<String, Object> result = new HashMap<>(8);
        empService.saveEmp(emp);
        result.put("status", "0");
        result.put("message", "保存成功");
        return result;
    }

執行結果如下:
在這裏插入圖片描述
默認情況下,axios將JavaScript對象序列化爲JSON。如果要以application/x-www-form-urlencoded格式發送數據,可以使用以下幾個方法(直接設置請求頭的Content-Type無效):
方法一:

    axios({
        method: 'post',
        url: 'http://localhost:8888/',
        data: "empno=0593&ename=kaili&job=Teacher"
    }).then(function (response) {
        console.info(response.data);
    })

這樣請求頭 爲:Content-Type: application/x-www-form-urlencoded 如下圖所示:
在這裏插入圖片描述
方法二:在特定瀏覽器中,你可以使用URLSearchParams API


    var searchParam = new URLSearchParams();
    searchParam.append("empno","0595");
    searchParam.append("ename","LILi");
    searchParam.append("job","程序媛");
    
    axios({
        method: 'post',
        url: 'http://localhost:8888/emp',
        data: searchParam
    }).then(function (response) {
        console.info(response.data);
    })

方法三:使用qs庫對數據進行序列化
方法四:在NodeJs環境中 你可以使用querystring模塊
後端代碼如下:

   @PostMapping("/emp")
    public Map<String, Object> saveEmp(HttpServletRequest request) {

        String empno = request.getParameter("empno");
        String ename = request.getParameter("ename");
        String job = request.getParameter("job");


        Emp emp = new Emp();
        emp.setJob(job);
        emp.setEname(ename);
        emp.setEmpno(Integer.valueOf(empno));

        empService.saveEmp(emp);

        Map<String, Object> result = new HashMap<>(8);
        result.put("status", "0");
        result.put("message", "保存成功");
        return result;
    }

二、axios常用API

1.可以通過將相關配置參數傳遞給axios來發出請求
基本調用方式爲: axios(config),例如發送一個Post請求如下:

axios({
        method: 'post',
        url: 'http://localhost:8888/',
        data: {
            empno: '0592',
            ename: 'Cat',
            job: '測試人員'
        }
    }).then(function (response) {
        console.info(response.data);
    })
        .catch(function (error) {
            console.info(error);
        })
        .finally(function () {
            console.info("不管前面執行的如何,這裏都會執行到!");
        });

默認發送Get請求,如下:

    axios("http://localhost:8888/empno");

2.爲了方便起見,axios爲所有受支持的HTTP請求方法提供了別名。

  1. axios.request(config)
  2. axios.get(url[, config])
  3. axios.delete(url[, config])
  4. axios.head(url[, config])
  5. axios.options(url[, config])
  6. axios.post(url[, data[, config]])
  7. axios.put(url[, data[, config]])
  8. axios.patch(url[, data[, config]])

三、請求配置屬性

這些是用於發出請求的可用配置選項。只需要url。如果沒有指定方法,請求將默認爲GET

{
 url:'xxx',
 //指定 在發出請求時使用的請求方法
  method: 'get', // 默認get請求
  //可以方便地爲axios的實例設置' baseURL '來傳遞相對url
  baseURL: 'https://some-domain.com/api/',
  //“transformRequest”允許在請求數據發送到服務器之前對其進行更改
  //這隻適用於“PUT”、“POST”、“PATCH”和“DELETE”請求方法
  //數組中的最後一個函數必須返回一個字符串或Buffer的實例ArrayBuffer,FormData或流
  //您也可以修改headers對象。
  transformRequest: [function (data, headers) {
    // Do whatever you want to transform the data

    return data;
  }],
  //“transformResponse”允許更改之前的響應數據
  //它將被傳遞給then/catch綁定的函數
 transformResponse: [function (data) {
    // Do whatever you want to transform the data

    return data;
  }],
  // “headers”是要發送的自定義請求頭
   headers: {'X-Requested-With': 'XMLHttpRequest'},
   //“params”是與請求一起發送的URL參數
   //必須是普通對象或者是URLSearchParams對象
    params: {
    ID: 12345
  },
   paramsSerializer: function (params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },

//“data”是作爲請求體發送的數據
//只適用於“PUT”、“POST”和“PATCH”請求方法
//當沒有設置“transformRequest”時,必須是以下類型之一:
//- string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
//瀏覽器中僅爲:FormData, File, Blob對象
//NodeJs環境中僅爲:Stream, Buffer對象
 data: {
    firstName: 'Fred'
  },
  //“timeout”指定請求超時之前的毫秒數。
  //如果請求花費的時間超過“tiemout”值,請求將被中止。
  timeout: 1000, //默認值爲' 0 '(沒有超時)
  //指示是否跨站點訪問控制請求
  //應該使用憑證
  withCredentials: false, // default,
  adapter: function (config) {
    /* ... */
  },
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },
  //'表示服務器將響應的數據類型
  //可選值爲:'arraybuffer', 'document', 'json', 'text', 'stream'
   responseType: 'json', // default
   //指示用於解碼響應的編碼
 responseEncoding: 'utf8', // default
 xsrfCookieName: 'XSRF-TOKEN', // default
  xsrfHeaderName: 'X-XSRF-TOKEN', // default
  //允許處理上傳的進度事件
 onUploadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },
  //允許處理下載的進度事件
  onDownloadProgress: function (progressEvent) {
    // Do whatever you want with the native progress event
  },
  //定義允許的http響應內容的最大大小(以字節爲單位)
 maxContentLength: 2000,
  validateStatus: function (status) {
    return status >= 200 && status < 300; // default
  },
//定義在node.js中要遵循的最大重定向數。
 maxRedirects: 5, // default
 socketPath: null, // default
//“httpAgent”和“httpsAgent”定義了一個執行http時使用的自定義代理
//和https請求,分別在node.js中。這允許像這樣添加選項
//默認情況下未啓用的“keepAlive”。
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),
  
//“proxy”定義代理服務器的主機名和端口。
//您還可以使用傳統的“http_proxy”和“https_proxy”環境變量。
 proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },
//指定可用於取消請求的取消令牌
cancelToken: new CancelToken(function (cancel) {
  })
}

四、配置全局默認值

您可以指定將應用於每個請求的配置缺省值。

axios.defaults.baseURI = "";
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.timeout=3000;

五:攔截器

您可以在處理請求或響應之前攔截它們。
(1)添加一個請求攔截器

    axios.interceptors.request.use(function (config) {
        //在發送請求之前做些什麼
        //TODO
        return config;
    }, function (error) {
        //處理請求錯誤
        return Promise.reject(error);
        //alert("請求超時")
    });

(2)添加一個響應攔截器

    axios.interceptors.response.use(function(response){
       //處理響應數據
        return response;
    },function(error){
        //處理響應錯誤
        return Promise.reject(error);
    });

(3)如果以後需要刪除攔截器,可以這樣做。

const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

六、處理錯誤

axios.get('/user/12345')
  .catch(function (error) {
    if (error.response) {
      // 發出請求後,服務器用狀態代碼進行響應
      //錯誤的狀態代碼不在2xx的範圍內
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // 已提出請求,但未收到答覆
      // `error.request` 是瀏覽器中XMLHttpRequest的一個實例,也是
      // NodeJS中的http.ClientRequest 
      console.log(error.request);
    } else {
      // 在設置引發錯誤的請求時發生了一些事情
      console.log('Error', error.message);
    }
    console.log(error.config);
  });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章