<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
第一步
http.js檔案的內容
//第一步匯入axios import axios from 'axios' import { Toast } from 'vant'; //第二步 我們可以宣告一個新的常數axios 我們可以設定一些基礎 公共的路徑設定 比如說baseURL timeout請求失敗超時報錯 withcookies...之類的東西 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_URL//如果設定了環境變數就可以直接寫/api, withCredentials: true, timeout: 3000//請求超時 })
//第三步 設定請求攔截 //新的常數axios service.攔截器.請求.使用===》 裡頭有兩個引數 一個成功的回撥函數 一個失敗的回撥函數 service.interceptors.request.use(config=>{ //每次傳送請求要進行的公共操作 每次傳送請求一般需要的操作一般都有 開啟loading載入動畫 token寫在請求的頭部 之類的 //loading Toast.loading({ message: '載入中...', forbidClick: true, }); //最後的話一定要給他return出去 不return不執行 return config },err=>{ //請求的時候如果發生錯誤了, 這邊直接給它丟擲錯誤就行 // throw new Error(err)丟擲的是一個紅色的報錯方便我們檢視尋找 throw new Error(err) })
//第四步 設定響應攔截 service.interceptors.response.use(response=>{ //我們每次成功傳送一個請求 它都會有響應的 引數也是兩個 //一般成功之後可以清除或關閉loading動畫 還可以判斷一些狀態碼 //清除loading動畫 Toast.clear() //判斷狀態碼 const res = response.data if (res.status && res.status !== 200) { // 登入超時,重新登入 if (res.status === 401) { Toast.loading({ message: '登入超時,請從新登入', forbidClick: true, }); } return Promise.reject(res || 'error') } else { return res.data } },err=>{ return Promise.reject(err) }) //匯出 匯出這個模組 export default service
第一步先在utils資料夾中新建api.js
api.js檔案的內容
//這邊的話 先匯入封裝好的新的axios import service from './http'; //然後我們可以封裝一些介面函數 比如說 登入的 註冊的 首頁的 分類的 輪播的 //但是要確認引數傳的是get還是post請求 //首頁 export function getHome(data){ return service.get('/home',data) } //方便我們後期的維護 程式碼美觀 方便快捷 //輪播 export function lunbo(data){ return service.get('/home/shejishi',data) } //比如說以後我們要維護封裝好的介面 這樣封裝好後我們就不需要去元件裡一個一個去找,直接來這個檔案修改即可 //元件化開模組化發或者開發 它們都有一個原則 //高聚合 低耦合 //高聚合就是 一個元件的業務一定要聚合在一起 一個元件的業務越集中越好 //低耦合就是 元件和元件之間的耦合度一定要低 意思就是兩個元件之間的牽連越少越好
簡單封裝說明了封裝思路,適合小白但想嘗試封裝的人。你可以在此基礎上進行追加改造.
1.引入庫
程式碼如下(範例):
npm install axios npm install element-ui -S // 或者 yarn add axios yarn add element-ui
2.建立封裝檔案 request.js
程式碼如下(範例):
/** * 全站http設定 */ import axios from 'axios'; import { Message } from 'element-ui'; //預設超時時間 axios.defaults.timeout = 10000; //返回其他狀態碼 axios.defaults.validateStatus = function (status) { return status >= 200 && status <= 500; }; //跨域請求,允許儲存cookie axios.defaults.withCredentials = true; //http request攔截 ,此處用到es6 Promise axios.interceptors.request.use(config => { // 你可以通過config來設定請求頭... const meta = (config.meta || {}); //headers中設定text請求 if (config.text === true) { config.headers["Content-Type"] = "text/plain"; } //headers中設定serialize為true開啟序列化 if (config.method === 'post' && meta.isSerialize === true) { config.data = serialize(config.data); } return config }, error => { return Promise.reject(error) }); //http response 攔截,此處用到es6 Promise axios.interceptors.response.use(res => { //獲取狀態碼 const status = res.data.code || res.status; const message = res.data.msg || res.data.error_description || '未知錯誤'; //如果是401則跳轉到登入頁面 if (status === 401) { //router.push({ path: '/login' })) }; // 如果請求為非200否者預設統一處理 if (status !== 200) { Message({ message: message, type: 'error' }); return Promise.reject(new Error(message)) } return res; }, error => { return Promise.reject(new Error(error)); }); export default axios;
3.使用方式
在vue專案的根目錄下的main.js 正常參照就好啦
import request from './api/request/request.js' Vue.prototype.request = request;
接下來去頁面中呼叫。這裡唯一可能會犯錯的地方
let _self = this; let id = '123'; let name = 'abner'; let url = '/api/blade-performance-mgt/hzy/performance/record/planSubmit'; // 請求地址 // post 請求 _self.request .post(url, { id: id, name: name , }) .then((res) => { // res }); // git 請求 let url = '/api/blade-performance-mgt/hzy/performance/record/list; // 請求地址 _self.request.get(url) .then((res) => { // res });
也發下vue.config.js的設定吧!
這裡只需要看下devServer中的設定就行
module.exports = { //路徑字首 publicPath: "/", lintOnSave: true, productionSourceMap: false, chainWebpack: (config) => { //忽略的打包檔案 config.externals({ 'vue': 'Vue', 'vue-router': 'VueRouter', 'vuex': 'Vuex', 'axios': 'axios', 'element-ui': 'ELEMENT', }); const entry = config.entry('app'); entry.add('babel-polyfill').end(); entry.add('classlist-polyfill').end(); entry.add('@/mock').end(); }, css: { extract: { ignoreOrder: true } }, //開發模式反向代理設定,生產模式請使用Nginx部署並設定反向代理 devServer: { port: 1888, proxy: { '/api': { //本地服務介面地址 // target: 'http://localhost', //遠端演示服務地址,可用於直接啟動專案 target: 'http://10.1.100.248:8000/api', // target: 'http://10.1.6.67:8033', ws: true, pathRewrite: { '^/api': '/' } } } } };
這種為了更好的分離程式碼,需要建立兩個檔案interceptor.js和request.js
1.建立request資料夾,我的專案目錄如下
interceptor.js 程式碼如下
/** * Author:abner ,修改於5月28 * 生成基礎axios物件,並對請求和響應做處理 * 前後端約定介面返回解構規範 * { * code:200, * data:"成功", * msg: "操作成功" * success: true * } */ import axios from 'axios' import { Message } from 'element-ui' import { getToken } from '@/util/auth'; // 獲取token值的方法,如何沒有用token驗證刪掉即可 // 建立一個獨立的axios範例 const service = axios.create({ // 設定baseUr地址,如果通過proxy跨域可直接填寫base地址 baseURL: '/api', // 定義統一的請求頭部 headers: { // 'Authorization': ``, // 此處對應後臺AOP驗證, 'Content-Type': 'application/json' //預設方式提交資料 // 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' //表單方式提交資料 }, // 設定請求超時時間 timeout: 10000, // 如果用的JSONP,可以設定此引數帶上cookie憑證,如果是代理和CORS不用設定 withCredentials: true }); // 請求攔截 service.interceptors.request.use(config => { // 在header中自定義token引數名:tokenHeader,可新增專案token config.headers[tokenHeader] = getToken() return config; }); // 返回攔截 service.interceptors.response.use((response) => { // 獲取介面返回結果 const res = response.data; // code為200,直接把結果返回回去,這樣前端程式碼就不用在獲取一次data. if (res.code === 200) { return res; } else if (res.code === 10000) { // 10000假設是未登入狀態碼 Message.warning(res.msg); // 也可使用router進行跳轉 window.location.href = '/#/login'; return res; } else { // 錯誤顯示可在service中控制,因為某些場景我們不想要展示錯誤 // Message.error(res.message); return res; } }, () => { Message.error('網路請求異常,請稍後重試!'); }); export default service;
request.js中你需要知道的
這裡需要說明的是請求方式那裡的判斷,我們需要知道axios不同請求方式預設傳參的方式是不同的,比如:
1.post請求我們一般都用data:{} 這中方式傳參
2.get請求我們一般都用params:{} 這中方式傳參
又比如
//如果伺服器端將引數作為物件來封裝接受 axios.delete('demo/url', { data: { id: 123, name: 'Henry', }, timeout: 1000, ...//其他相關設定 }) //如果伺服器端將引數作為url引數來接受,則請求的url為:www.demo/url?a=1&b=2形式 axios.delete('demo/url', { params: { id: 123, name: 'Henry', }, timeout: 1000, ...//其他相關設定 })
我們需要對不同的請求,不同的情況進行判斷處理
request.js 程式碼如下
/** * request.js * 通過promise對axios做二次封裝,針對使用者端引數,做靈活設定 * Author:abner ,修改於5月28 */ import { Message, Loading } from 'element-ui'; import instance from './interceptor' /** * 核心函數,可通過它處理一切請求資料,並做橫向擴充套件 * @param {url} 請求地址 * @param {params} 請求引數 * @param {options} 請求設定,針對當前本次請求; * @param loading 是否顯示loading * @param mock 本次是否請求mock而非線上 * @param error 本次是否顯示錯誤 */ function request(url, params, options = { loading: true, mock: false, error: true }, method) { // let loadingInstance = ''; // 請求前loading // if (options.loading) loadingInstance = Loading.service({background:'transparent'}); return new Promise((resolve, reject) => { let data = {} // get請求使用params欄位 if (method == 'get') data = { params } // post請求使用data欄位 if (method == 'post') data = { data: params } // delete請求使用params欄位 if (method == 'delete') data = { params } // 通過mock平臺可對區域性介面進行mock設定 if (options.mock) url = 'http://www.mock.com/mock/xxxx/api'; instance({ url, method, ...data }).then((res) => { // 此處作用很大,可以擴充套件很多功能。對返回的資料進行統一處理 if (res && res.code === 200) { resolve(res.data); } else { // 通過設定可關閉錯誤提示 if (res && options.error) Message.error(res.msg); reject(res); } }).catch((error) => { Message.error(error.message) }).finally(() => { // loadingInstance.close(); }) }) } // 封裝GET請求 function get(url, params, options) { return request(url, params, options, 'get') } // 封裝POST請求 function post(url, params, options) { return request(url, params, options, 'post') } // 封裝DELETE請求 function Delete(url, params, options) { return request(url, params, options, 'delete') } export default { get, post, Delete }
使用步驟
1.在main.js中新增
import request from './api/request/request' Vue.prototype.request = request;
2.在方法中直接使用
methods: { getUnitTabledata() { let _self = this; _self.request .get("/lnjzxh-awards-mgt/lnjzxh/award/serial/unit/list/page", { awardName: _self.searchName, status: _self.statusValue, account: _self.account, createDate: _self.pickerValue, current: _self.page.currentPage - 1, size: _self.page.pageSize, }) .then((res) => { _self.page.total = res.total; _self.tableData = res.records; }); }, }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45