摘要:整合,最終得到的對(duì)象如下注意模塊名和沒有了,所以需要注意命名的唯一,以免覆蓋。如下,,由于我司后臺(tái)提供的接口大都是和,所以只考慮了這兩種請(qǐng)求方式在中創(chuàng)建一個(gè),并在中引用發(fā)送請(qǐng)求
1.發(fā)送請(qǐng)求模塊目錄 2.@/api/url中存放的是每個(gè)模塊的URL
// 商品模塊 product.js const product = { sku: { list: "/product/product/speclist", options: "/product/product/options" } } export default product // 公用請(qǐng)求模塊 common.js const common = { region: { provinces: "/region/region/list", cities: "/region/region/list" }, upload: { image: "/product/product/upload" } } export default common
發(fā)送請(qǐng)求的時(shí)候只需要指定key(sku/list),如:this.$ajax("sku/list", param);假定axios設(shè)置的baseURL是http://prod.storm.com/api/,那么最終的請(qǐng)求地址:http://prod.storm.com/api/product/product/speclist
3.requireURLs.js使用webpack提供的require.context將src/api/url下后綴為js的所有文件引入,并整理出一個(gè)對(duì)象。
let urls = {} const req = require.context("./url", false, /.js$/) const requireAll = requireContext => requireContext.keys().map(i => { let url = requireContext(i) Object.assign(urls, url.default) }) requireAll(req) export default urls
整合common.js & product.js,最終得到的對(duì)象如下:
urls = { sku: { list: "/product/product/speclist", options: "/product/product/options" }, region: { provinces: "/region/region/list", cities: "/region/region/list" }, upload: { image: "/product/product/upload" } } // 注意:模塊名product和common沒有了,所以需要注意命名的唯一,以免覆蓋。4.ajax.js
import axios from "axios" import qs from "qs" import jsd from "js-file-download" import store from "@/store" import urlObj from "./requireURLs" import { Message, MessageBox } from "element-ui" import { getToken } from "@/utils/auth" const service = axios.create({ baseURL: `${process.env.BASE_API}/api/`, // 不同環(huán)境(dev/prod/test)使用不同的baseURL timeout: 5000 }) service.interceptors.request.use( config => { // 上傳文件時(shí),config.data的數(shù)據(jù)類型是FormData, // qs.stringify(FormData)的結(jié)果是空字符串,導(dǎo)致接口報(bào)**參數(shù)為空**的錯(cuò)誤 if (config.method === "post" && config.data.constructor !== FormData) { config.data = qs.stringify(config.data) } if (store.getters.token) { config.headers.common["Auth-Token"] = getToken() // Auth-Token 登錄過期后,重新登錄不傳token if (!config.headers.common["Auth-Token"]) { delete config.headers.common["Auth-Token"] } } return config }, error => { Promise.reject(error) } ) service.interceptors.response.use( response => { const res = response.data // 后臺(tái)會(huì)把{ code, data, msg }返回到response.data中 if (response.headers["content-type"].indexOf("application/vnd.ms-excel") !== -1) { // 通過請(qǐng)求接口下載Excel,由于后臺(tái)返回的數(shù)據(jù)中(res)沒有code(我也不知道為什么,反正后臺(tái)就說沒有),所以我只好通過響應(yīng)頭的content-type判斷了 // 下載接口返回的response header如下(后臺(tái)把文件名放在Content-Disposition中(filename)) // Content-Disposition: attachment; filename=20190323211209.csv // Content-Type: application/vnd.ms-excel;charset=GBK let fileName = response.headers["content-disposition"].split("=")[1] jsd(res, fileName) return } if (res.code === 0) { // 和后臺(tái)約定code:0代表請(qǐng)求成功 return res } else { if (res.code === 18500) { // 和后臺(tái)約定code:18500代表token未過期,但是被更新了 handleLogin("您已被登出,請(qǐng)重新登錄") } else if (res.code === 18501) { // 和后臺(tái)約定code:18500代表token過期 handleLogin("登錄已失效,請(qǐng)重新登錄") } else { // 統(tǒng)一處理接口的報(bào)錯(cuò)信息,如果需要具體到頁(yè)面去處理,可以和后臺(tái)另外約定一個(gè)code Message({ message: res.msg, type: "error", duration: 3 * 1000 }) } return Promise.reject(res) } }, error => { let data = error.response.data Message({ message: data.msg, type: "error", duration: 3 * 1000 }) return Promise.reject(data) } ) const handleLogin = title => { MessageBox.confirm(title, "提示", { confirmButtonText: "重新登錄", showCancelButton: false, showClose: false, type: "warning" }).then(() => { store.dispatch("FedLogout").then(() => { location.reload() }) }) } const ajax = (path, data = {}, options = {}) => { // 如果path以http開頭指定了一個(gè)url,直接用;否則就去遍歷步驟3中的urls對(duì)象。如下: // this.$ajax("http://test.storm.com"),url = "http://test.storm.com" // this.$ajax("sku/list"),url = "/product/product/speclist" let url = path.indexOf("http") === -1 ? path.split("/").reduce((o, k) => { return o[k] }, urlObj) : path let method = options.method || "post" let params = { url, method } // 由于我司后臺(tái)提供的接口大都是post和get,所以只考慮了這兩種請(qǐng)求方式 if (options.method === "get") { Object.assign(params, { params: data }, options) } else { // post Object.assign(params, { data }, options) } return service(params) } export default ajax5.在src/plugins中創(chuàng)建一個(gè)ajaxPlugin.js,并在src/main.js中引用
// ajaxPlugin.js import ajax from "@/api/ajax" let ajaxPlugin = {} ajaxPlugin.install = Vue => { Vue.prototype.$ajax = ajax } export default ajaxPlugin // main.js import ajaxPlugin from "@/plugins/ajaxPlugin" Vue.use(ajaxPlugin)6.發(fā)送請(qǐng)求:
this.$ajax("sku/list").then(res => {})
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/102883.html
摘要:今天松哥就帶大家來(lái)看看的使用。此時(shí)啟動(dòng)前端項(xiàng)目,就可以順利發(fā)送網(wǎng)絡(luò)請(qǐng)求了。松哥將自己封裝的網(wǎng)絡(luò)請(qǐng)求庫(kù)已經(jīng)放在上,歡迎大家參考。前端網(wǎng)絡(luò)訪問,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,網(wǎng)絡(luò)訪問較多的采用 vue-resources,Vue2.0 之后,官方不再建議使用 vue-resources ,這個(gè)項(xiàng)目本身也停止維護(hù),目前建議使用的方案是 axios。今天松哥就帶大...
摘要:在使用開發(fā)時(shí),官方推薦使用來(lái)請(qǐng)求接口官方地址但是并不像一樣擁有,即不能直接來(lái)使用,所以需要我們自己根據(jù)來(lái)寫一個(gè)具有方法的庫(kù)。 在使用vue開發(fā)時(shí),官方推薦使用axios來(lái)請(qǐng)求接口 // axios官方地址 https://github.com/axios/axios 但是axios并不像 vue-resource 一樣擁有install,即不能直接 Vue.use(axios) ...
Axios 是一個(gè)基于 promise 的 HTTP 庫(kù),可以用在瀏覽器和 node.js 中。在vue項(xiàng)目之中使用axios是一個(gè)非常明智的選擇,因?yàn)関ue官方已經(jīng)宣稱不再維護(hù)vue-resource,并且推薦使用axios. 1 為什么選擇axios? 使用axios可以統(tǒng)一做請(qǐng)求-響應(yīng)攔截,例如響應(yīng)時(shí)我們將響應(yīng)信息攔截起來(lái),判斷狀態(tài)碼,從而彈出報(bào)錯(cuò)信息 設(shè)定請(qǐng)求超時(shí),例如3000ms未響應(yīng)...
摘要:大家好,我是,潛水于掘金和思否的一名前端小小生,今天看了幾篇文章關(guān)于中怎么去封裝,視乎好多版本都是基于去做的。 **大家好,我是minijie,潛水于掘金和思否的一名前端小小生,今天看了幾篇文章關(guān)于vue中怎么去封裝axios,視乎好多版本都是基于promise去做的。這讓我很疑惑,axios不就是基于promise的一個(gè)請(qǐng)求庫(kù)嗎?為啥還要多一層promise呢?下面是根據(jù)我自己的想法...
摘要:從到使用開發(fā)實(shí)戰(zhàn)四封裝有很多同學(xué)看了本系列的前幾篇之后建議我暫時(shí)先不用,于是小肆之后將把換成繼續(xù)下面的文章。前置閱讀用從到做一個(gè)完整功能手機(jī)站一從到開發(fā)實(shí)戰(zhàn)手機(jī)站二提交規(guī)范配置從到使用開發(fā)實(shí)戰(zhàn)三知識(shí)儲(chǔ)備 從0到1使用VUE-CLI3開發(fā)實(shí)戰(zhàn)(四): Axios封裝 有很多同學(xué)看了本系列的前幾篇之后建議我暫時(shí)先不用TS,于是小肆之后將把TS換成JS繼續(xù)下面的文章。今天給大家?guī)?lái)項(xiàng)目中非常...
摘要:新建文件,設(shè)置請(qǐng)求攔截和處理的邏輯取消請(qǐng)求設(shè)置默認(rèn)請(qǐng)求頭,如果不需要可以取消這一步請(qǐng)求超時(shí)的時(shí)間限制開始設(shè)置請(qǐng)求發(fā)起的攔截處理代表發(fā)起請(qǐng)求的參數(shù)的實(shí)體得到參數(shù)中的字段,用于決定下次發(fā)起請(qǐng)求,取消對(duì)應(yīng)的相同字段的請(qǐng)求如果沒有就默認(rèn)添加一個(gè) 1. 新建 axiosTool.js 文件,設(shè)置請(qǐng)求攔截和處理的邏輯 import Vue from vue import axios from ax...
閱讀 3162·2021-10-27 14:16
閱讀 2960·2021-09-24 10:33
閱讀 2373·2021-09-23 11:21
閱讀 3285·2021-09-22 15:14
閱讀 888·2019-08-30 15:55
閱讀 1750·2019-08-30 15:53
閱讀 1855·2019-08-29 11:14
閱讀 2245·2019-08-28 18:11