axios封裝(一)基礎配置

來源:互聯網
上載者:User

標籤:發送   image   nod   應對   上傳   charset   use   case   UNC   

axios 是目前流行的Promise網路請求庫,在瀏覽器端他通過 xhr方式建立ajax請求。在node環境下,通過 http 庫建立網路請求。

axios 提供了豐富的配置,這裡講一講我在工作中通常用到的基本配置方法。

因為我在工作中用 vue 進行開發,所以以下代碼預設的環境是 vue-cli

建立一個 axios 執行個體

為什麼要建立一個 axios 執行個體,而不是在 axios 對象上進行配置呢?是因為我們會應對複雜的使用情境,多個執行個體便於管理。

const isDev = process.env.NODE_ENV === ‘development‘;const instance = axios.create({  // baseURL是在proxyTable中會轉寄的配置,通過環境變數的判斷,可以在開發和生產環境使用不同的url進行請求  baseURL: isDev ? ‘/fakeapi‘ : ‘/api‘,  timeout: 5000,  validateStatus(status) {    // 一般來說,http status為200-300之間時,均判定為請求通過,你可以在這裡修改這個配置(不建議修改)    return status === 200  },  headers: {    // 定義 post 請求編碼格式    post: {      ‘Content-Type‘: ‘application/x-www-form-urlencoded;charset=UTF-8‘    }  }});
處理請求參數

雖然對請求設定了編碼格式,但是還是需要進一步設定具體的編碼格式,比如我想進行一些特殊的設定。

qs.stringify 這裡的參數請參考這篇文章 qs.js - 更好的處理url參數

import Qs from ‘qs‘;instance.interceptors.request.use(config => {    // 也可以在這裡給請求添加token之類的欄位    config.data = Qs.stringify(config.data, {arrayFormat: ‘repeat‘, allowDots: true});    return config;}, err => {    return Promise.reject(err);});
處理傳回值
import httpErrorHandler from ‘./httpErrorHandler.js‘;instance.interceptors.response.use(function(data) {    // 這裡可以對返回資料進行處理,比如驗證code是否為1等    return data.data;}, httpErrorHandler)

httpErrorHandler.js 代碼

# httpErrorHandler.jsexport default (error) => {  if (!error.response) {    return Promise.reject({        msg: ‘網路連接逾時‘,        error    });  };  let msg = ‘‘;  const status = error.response.status;  switch (status) {    case 400:        msg = ‘錯誤的請求參數‘;        break;    case 401:        msg = ‘沒有該操作許可權‘;        break;    case 403:        msg = ‘請登入‘;        break;    case 404:        msg = ‘錯誤的請求地址‘;        break;    case 500:    case 501:    case 502:    case 503:    case 504:        msg = ‘伺服器錯誤‘;        break;    default:        msg = ‘未知錯誤‘ + status;  }  return Promise.reject({      msg,      error  });}
封裝 get 方法

jquery.ajax 不同,axios的get方式需要通過 prarms 而不是 data參數傳遞:

/** * 封裝後的axios get方法 * * @param {string} url 請求路徑 * @param {object} option 請求參數 * @param {object} [config] 特殊配置項(選填) * @returns */export function get(url, option, config = {}) {  return instance.get(url, { params: option }, config)}// 調用getget(‘http://baidu.com‘, {    a: 1,    b: 2}).then(...).catch(...)
post 方式

post請求方式則要簡單一些,不需要使用 prarms 參數

/** * 封裝後的axios post方法 * * @param {string} url 請求路徑 * @param {object} option 請求參數 * @param {object} [config] 特殊配置項(選填) * @returns */export function get(url, option, config = {}) {  return instance.get(url, option, config)}// 調用postpost(‘http://baidu.com‘, {    a: 1,    b: 2}).then(...).catch(...)
upload 檔案

上傳檔案需要使用不同的header設定和編碼方式,所以需要建立一個單獨的執行個體

const uploadInstance = axios.create({  baseURL: isDev ? ‘/fakeapi‘ : ‘/api‘,  timeout: 15000,  headers: {    // 傳送檔案需要的編碼格式    ‘Content-Type‘: ‘multipart/form-data‘  }});/** * 封裝後的axios upload方法 * * @param {string} url 請求路徑 * @param {formdata} formdata 請求參數, 必須是formdata對象 * @param {object} [config] 特殊配置項(選填) * @returns */export function upload(url, formdata, config = {}) {  return uploadInstance.post(url, formdata, config)}# 使用上傳let formData = new FormData();formData.append("image", file);formData.append("name", ‘name‘);upload(‘http://baidu.com‘, formData, {    onUploadProgress(progressEvent) {        // 展示上傳進度等    }})

axios封裝(一)基礎配置

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.