摘要:前言兵馬未動(dòng)糧草先行同理項(xiàng)目開發(fā)過(guò)程中經(jīng)常會(huì)出現(xiàn)接口未出前端頁(yè)面已搭建完畢的情況此時(shí)為了提高前端的開發(fā)效率解放生產(chǎn)力我們可以按照預(yù)定的接口文檔做一些接口模擬的工作等等后端小伙伴開發(fā)完接口后我們只需要替換一個(gè)接口基地址即可初始準(zhǔn)備這里已項(xiàng)目為
前言
兵馬未動(dòng),糧草先行; 同理,項(xiàng)目開發(fā)過(guò)程中經(jīng)常會(huì)出現(xiàn)接口未出, 前端頁(yè)面已搭建完畢的情況;此時(shí)為了提高前端的開發(fā)效率,解放生產(chǎn)力,我們 FE 可以按照預(yù)定的接口文檔做一些接口模擬的工作,等等后端小伙伴開發(fā)完接口后我們只需要替換一個(gè)接口基地址即可...
初始準(zhǔn)備這里已 vue 項(xiàng)目為例, 所需模塊:mockjs, express; 直接 npm 進(jìn)行安裝即可
1.Mock.js // 用來(lái)快速構(gòu)造隨機(jī)數(shù)據(jù) http://mockjs.com/examples.html 2.express // 用來(lái)快速搭建本地服務(wù) http://expressjs.jser.us/項(xiàng)目中使用
一般會(huì)在 vue 項(xiàng)目中建一個(gè) mock 文件夾, 里面放上對(duì)應(yīng)處理文件:
接口分發(fā)模塊主要是分發(fā)前端過(guò)來(lái)的請(qǐng)求 URL 以及啟動(dòng)本地服務(wù)
let Mock = require("mockjs"); let express = require("express"); let app = express(); let bodyParser = require("body-parser"); // 解析post請(qǐng)求 // mock 數(shù)據(jù)相關(guān) api let homeAPI = require("./home"); let specialAPI = require("./special"); let appAPI = require("./app"); app.use(bodyParser.json()); // 設(shè)置跨域 app.all("*", function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "PUT, GET, POST, DELETE, OPTIONS"); // 此處根據(jù)前端請(qǐng)求攜帶的請(qǐng)求頭進(jìn)行配置 res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type"); next(); }); // 1.首頁(yè)接口: post app.post("/android/home", (req, res) => { // 模擬超時(shí) // setTimeout(() => { // res.json(Mock.mock(homeAPI.getHome(req))); // }, 12000); res.json(Mock.mock(homeAPI.getHome(req))); console.log("請(qǐng)求首頁(yè)數(shù)據(jù)成功..."); }) // 2.專題接口: post app.post("/android/special/list", (req, res) => { res.json(Mock.mock(specialAPI.getSpecialList(req))) console.log("請(qǐng)求專題列表數(shù)據(jù)成功..."); }) app.post("/android/special/detail", (req, res) => { res.json(Mock.mock(specialAPI.getSpecialDetail(req))) console.log("請(qǐng)求專題詳情數(shù)據(jù)成功..."); }) // 3.APP 應(yīng)用接口: post app.post("/android/special/app", (req, res) => { res.json(Mock.mock(appAPI.getAppList(req))) console.log("請(qǐng)求app列表數(shù)據(jù)成功..."); }) app.listen("3000", () => { console.log("mock服務(wù)器啟動(dòng)ing中... port: 3000") })接口數(shù)據(jù)模塊
以上面的 specialApi 為例, 這是用來(lái)處理 xxx/special/list接口的模塊
let Mock = require("mockjs"); let Random = Mock.Random; // 專題模塊 // 1.專題列表 let specialList = []; let total = 100; // 準(zhǔn)備 100 條專題列表數(shù)據(jù) for (let index = 0; index < total; index++) { specialList.push( Mock.mock({ id: "@increment", title: "@ctitle", desc: "啟動(dòng)本地服務(wù)"+Random.cparagraph()+"
", icon: "photo/special/1380/special_1380.jpg", view_count: "@natural(60, 1000)", comment_count: "@natural(60, 100)", save_money: "@float(10, 50, 2, 2)", app_count: "@natural(10, 100)", detail_icon: "https://images.tutuapp.com/photo/special/000/001/" + "@natural(100, 200)" + "/414x155.jpg", }) ); } module.exports = { // 列表數(shù)據(jù)返回 getSpecialList: config => { // 參數(shù)解析 console.log(config.body); let { page = 1, size, lang, order_by } = config.body; let tempList = []; let pageList; // 排序類型 tempList = order_by === "view" ? specialList.reverse() : specialList; // 分頁(yè)處理 pageList = tempList.filter((item, index) => index < page * size && index >= (page-1)*size); // 返回處理結(jié)果, 這里沒(méi)做異常狀態(tài)碼處理 return { status: { code: 0, message: "請(qǐng)求成功", time: "2019-07-03 16:45:12", }, data: pageList, }; }, // 列表詳情數(shù)據(jù)返回 getSpecialDetail: config => { let { id, page = 1, size, lang } = config.body; return { status: { code: 0, message: "請(qǐng)求成功", time: "2019-07-03 16:45:12", }, data: { detail: specialList[Math.ceil(1 + Math.random() * 98)], total: Math.ceil(Math.random() * 100), }, }; }, };
這里我們需要在package.json 文件script 字段下新建一行命令去開啟服務(wù)器
"mock": "node src/mock/index.js" 在終端下執(zhí)行 npm run mock 即可開啟服務(wù), 接下來(lái)我們就可以放心去請(qǐng)求數(shù)據(jù)了axios 通用配置 1.創(chuàng)建 axios 實(shí)例
// 1.引入所需依賴: axios,Vue,store,router,工具函數(shù) toast 等等... import axios from "axios"; import Vue from "vue"; // 創(chuàng)建 axios 實(shí)例 const Axios = axios.create({ // 添加初始化配置 baseURL: process.env.BASE_API, // 基地址 timeout: 10000, // 超時(shí) // withCredentials: true, // send cookies when cross-domain requests }); // const TOKEN = window.sessionStorage.getItem("token"); // when set token // 請(qǐng)求攔截器 Axios.interceptors.request.use( config => { // TODO: 添加請(qǐng)求頭處理邏輯,如添加 token; 還可以設(shè)置開啟請(qǐng)求 loading 動(dòng)畫 // config.headers["X-Token"] = TOKEN return config; }, error => { console.log("request error:", error); // for debug return Promise.reject(error); } ); /** * 兩種方式做統(tǒng)一處理 * 1.通過(guò) http狀態(tài)碼status: response.status 和 error.response.status處理 * 2.通過(guò) response.data中自定義的狀態(tài)碼code: response.data.code 處理(異常處理直接在第一個(gè)回調(diào)重處理) */ // 響應(yīng)攔截器 Axios.interceptors.response.use( response => { const res = response.data; // 1.通過(guò)自定義 code 做統(tǒng)一處理 // 2.也可以通過(guò) response.status === 200 處理; 這里采用 1 if (res.status.code === 0) { return res.data; // 成功 } else { // for example: 異常的 code 進(jìn)行自定義處理 if (res.status.code === 50008 || res.status.code === 50012) { // 做一些提示的 toast 處理或者跳轉(zhuǎn) alert("有錯(cuò)誤!!!"); } return Promise.reject(new Error(res.status.message || "Error")); } }, error => { // 響應(yīng)錯(cuò)誤處理: 如超時(shí),斷網(wǎng),權(quán)限等... console.log("response error:", error); // for debug 本地開發(fā)下沒(méi)有狀態(tài)碼顯示 console.log(error.response); // for debug // const res = error.response; // if (res) { // // 請(qǐng)求已發(fā)出,但是不在2xx的范圍 // errorHandle(response.status, response.data.message); // return Promise.reject(res); // } else { // // 處理斷網(wǎng)或超時(shí)... // // 網(wǎng)絡(luò)狀態(tài)可以在app.vue中控制著一個(gè)全局的斷網(wǎng)提示組件的顯示隱藏 // if (!window.navigator.onLine) { // console.log("斷網(wǎng)了...."); // } else { // return Promise.reject(error); // } // } } ); /** * 請(qǐng)求失敗后的錯(cuò)誤統(tǒng)一處理 * @param {Number} status 請(qǐng)求失敗的狀態(tài)碼 */ const errorHandle = (status, tips) => { // 狀態(tài)碼判斷 switch (status) { // // 401: 未登錄狀態(tài),跳轉(zhuǎn)登錄頁(yè) // case 401: // toLogin(); // break; // // 403 token過(guò)期 // // 清除token并跳轉(zhuǎn)登錄頁(yè) // case 403: // tip("登錄過(guò)期,請(qǐng)重新登錄"); // localStorage.removeItem("token"); // store.commit("loginSuccess", null); // setTimeout(() => { // toLogin(); // }, 1000); // break; // 404請(qǐng)求不存在 case 404: console.log("請(qǐng)求的資源不存在"); break; default: console.log(tips); } }; // 實(shí)現(xiàn)插件, 暴露install方法, 可以給 vue 實(shí)例使用 // 通過(guò) this.$http.post 或者 get 去請(qǐng)求 export const http = { install(Vue) { Vue.prototype.$http = Axios; } } // 導(dǎo)出 Axios實(shí)例 export default Axios2.使用
1.通過(guò)插件使用, 在 mian.js 導(dǎo)入 import { http } from "./api/http"; Vue.use(http); 在組件實(shí)例中通過(guò) this.$http.post | get去請(qǐng)求 2.將請(qǐng)求方法抽離, 引入上面導(dǎo)出的 Axios 實(shí)例 import request from "./http"; // 首頁(yè)請(qǐng)求 export function getHomeData(data) { return request({ url: "/home", method: "post", data }) }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106371.html
摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過(guò)攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...
摘要:其實(shí)就是我們開始掛載上去的我們?cè)谶@里出去,我們就可以在回調(diào)里面只處理我們的業(yè)務(wù)邏輯,而其他如斷網(wǎng)超時(shí)服務(wù)器出錯(cuò)等均通過(guò)攔截器進(jìn)行統(tǒng)一處理。 showImg(https://segmentfault.com/img/remote/1460000015472616?w=845&h=622); 開始之前 隨著業(yè)務(wù)的不斷累積,目前我們 ToC 端主要項(xiàng)目,除去 node_modules, bu...
你們是否想過(guò)如何優(yōu)化訪問(wèn)路徑里的/#/,看起來(lái)有簡(jiǎn)單又美觀,現(xiàn)在我們一起看看實(shí)現(xiàn)。現(xiàn)在就為大家展示解決方法。 正常解決步驟 1. 設(shè)置路由mode 先說(shuō)下router的默認(rèn)mode為hash模式,有關(guān)于hash模式介紹如下: hash并不能作為傳遞,也無(wú)法將URL發(fā)送到服務(wù)器中,因此,無(wú)法到服務(wù)器中進(jìn)行處理。而且它對(duì)于SEO優(yōu)化也有不好的影響。我們可以換換想法,用可以使用 HTML5 ...
摘要:今天這篇文章,我們會(huì)介紹幾種常見的方法和其中存在的問(wèn)題,并提出如何基于請(qǐng)求攔截,快速解決跨域和代理問(wèn)題的方案。因?yàn)闆](méi)有修改該請(qǐng)求,只是延遲發(fā)送,這樣就保持了原請(qǐng)求與業(yè)務(wù)服務(wù)器之間的所有鑒權(quán)等相關(guān)信息,由此解決了跨域訪問(wèn)無(wú)法攜帶的問(wèn)題。 近幾年,隨著 Web 開發(fā)逐漸成熟,前后端分離的架構(gòu)設(shè)計(jì)越來(lái)越被眾多開發(fā)者認(rèn)可,使得前端和后端可以專注各自的職能,降低溝通成本,提高開發(fā)效率。 在前后端...
當(dāng)你遇見前端頁(yè)面開發(fā)完成,可后端接口還沒(méi)好,I這樣就直接無(wú)法聯(lián)調(diào),這時(shí)候我們用到mock數(shù)據(jù)。 先說(shuō)說(shuō)curd接口模擬 注:這邊可以和后端先約定好接口路徑以及入?yún)⒎祬⒌淖侄危苊舛涡薷摹 ?.我們先看看下面代碼,在安裝,新建js文件,在文件中導(dǎo)入mock.js,模擬列表數(shù)據(jù) yarnaddmockjs constMock=require("mockjs") ...
閱讀 904·2021-09-29 09:35
閱讀 1253·2021-09-28 09:36
閱讀 1522·2021-09-24 10:38
閱讀 1066·2021-09-10 11:18
閱讀 631·2019-08-30 15:54
閱讀 2496·2019-08-30 13:22
閱讀 1964·2019-08-30 11:14
閱讀 697·2019-08-29 12:35