Getting Started with Axios

version:0.18

Axios 是一個以 Promise based,用於瀏覽器及 node.js 的 HTTP Client.

現今前端技術中,Axios 算是比較完整可以方便開發者使用 AJAX 的套件,Vue 的作者也建議可以使用此套件(參考來源)。

Installation

Using npm

npm install axios

Using CDN

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

Usage

引用範例

// 可以使用 TypeScript definitions
import axios from 'axios';
// 或者直接 require
const axios = require('axios');

基本使用

// GET
axios.get('https://api.github.com/users/johnson4932?id=123')
.then(function (response) {
  // Success
  console.log(response.status);
  console.log(response.data);
})
.catch(function (error) {
  // Error
  console.log(error);

  // Error 的詳細資訊
  console.log(error.response);  
})
.then(function () {
  console.log('always executed');
});

// 代入參數( get 代入參數時需要加上 params 的 key)
axios.get('https://api.github.com/users/johnson4932', {
    params: {id: 123}
})
.then(function (response) {
  // Success
  console.log(response.status);
  console.log(response.data);
})
.catch(function (error) {
  // Error
  console.log(error);
})
.then(function () {
  console.log('always executed');
});

// 使用 POST(post 可以直接傳入參數,不需再過 params)
axios.post('https://api.github.com/users/johnson4932', {
  id: 123
})
.then(function (response) {
  // Success
});

Axios API
除了直接使用 Axios request method 之外,可以透過 Axios API 以 config 的方式建立 request。

範例

axios({
  method: 'get',
  url: 'https://api.github.com/users/johnson4932',
  data: {
    id: 123
  }
})
.then(function (response) {
  console.log(response.status);
  console.log(response.data);
})
.catch(function (error) {
  console.log(error);
})
.then(function () {
  console.log('always executed');
});

Request method aliases
除了範例提到的方法,可以參考以下相對應的 method aliases 做使用。

axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])

處理多個非同步請求

除了基本的取資料應用之外,比較進階的用法是要一次打多個 API 拿資料,而且是需要等這些資料都齊全以後才能繼續處理。

操作方式很簡單,透過 axios.all() 放入所有 request,再透過 axios.spread() 取得各 request 拿回來的資料。

範例

axios.all([
  axios.get('https://api.github.com/users/johnson4932'),
  axios.get('https://api.github.com/users/mag5323')
])
.then(axios.spread(function (johnson4932, mag5323) {
  console.log(johnson4932.data);
  console.log(mag5323.data);
}));

Instance

以往操作 AJAX 最麻煩的地方,就是在大量戳類似的 API 時,在每個 request 都要重新定義一些重複的設定。

在 Axios 中可以透過先建立一個擁有基本設定的 Request Instance,之後只要再根據 URL 不同再做調整就好。

範例

const instance = axios.create({
  baseURL: 'https://api.github.com/users/',
  timeout: 1000
});

instance.get('johnson4932')
.then(function (response) {
  console.log(response.data);
});

Upload file

如果想要直接透過 Axios 上傳檔案,記得更改 Content-Type 為 multipart/form-data

範例

let formData = new FormData();
// 透過 FormData Obj 代入 <input type="file"> 的檔案資料
formData.append('file', document.getElementById('file').files[0]);

axios.post('/api/file/import', formData, {
  headers: {
    'Content-Type': 'multipart/form-data'
  }
});

Download file

除了上傳檔案之外,也可以透過 Axios 實作下載檔案的功能。

Axios 透過 AJAX 下載的功能,是模擬點擊下載連結時的操作。

範例

axios.post('/download-url', {}, {
  // 將 responseType 設成 blob
  responseType: 'blob',
})
.then((res) => {
  // 建立一個 ObjectURL
  let url = window.URL.createObjectURL(new Blob([res.data]));
  // 建立一個 <a> 的 element instance,並指定 ObjectURL
  let link = document.createElement('a');
  link.href = url;

  // 從 Header 取得檔案名稱
  let headerLine = res.headers['content-disposition'];
  let startFileNameIndex = headerLine.indexOf('"') + 1
  let endFileNameIndex = headerLine.lastIndexOf('"');
  let filename = headerLine.substring(startFileNameIndex, endFileNameIndex);

  // 設定檔名
  link.setAttribute('download', filename);

  // 將連結加到 body 中並點擊
  document.body.appendChild(link);
  link.click();

  // 刪除 element instance
  link.remove();
});