🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 1. 数据请求封装 ### 1.1公用性方法:请求路由多参数处理与需要转成formData的处理 ~~~ export function encodeForm (form = {}) { return Object.keys(form) .map(key => { return [key, form[key]].map(encodeURIComponent).join('='); }) .join('&'); } // 样例输入: form = {name: 'xiaopi',age: '22'} // 样例输出: name=xiaopi&age=22 export function objectToFormData (data = {}) { const formData = new FormData() for (const key of Object.keys(data)) { formData.append(key, data[key]); } return formData; } ~~~ ### 1.2fetch request封装 思路: 分步式处理 ~~~ // 文件request.js function parseJSON(response) { return response.json(); } function checkStatus(response) { if (response.status >= 200 && response.status < 300) { return response; } // 异常处理 const error = new Error(response.statusText); error.response = response; throw error; } /** * Requests a URL, returning a promise. * * @param {string} url The URL we want to request * @param {object} [options] The options we want to pass to "fetch" * @return {object} An object containing either "data" or "err" */ export default function request(url, options = {}) { return fetch(url, options) .then(checkStatus) .then(parseJSON) .then(data => { return data }) .catch(err => ({ err })); } ~~~ ### 1.3所有请求放在同一文件处理 思路: 请求接口时,先在总请求文件dataService.js 中创建方法,方法名建议与接口名一致(这样易查找),然后将传入参数规定好,再在需要请求的地方调用dataService里的方法。 优点: 方便维护,在测试中如果有接口需要更改参数名称但值不变的,或者需要更改请求类型之类的可以直接在dataService中查找更改。 缺点: 每次请求时都需要先创建一个方法,如果测试中某个接口需要的参数添加一个字段,则需要在调用的地方与dataService中都做更改。 ~~~ // 文件dataService.js // 先引request(必须的) import request from '../utils/request'; // 案例(仅做参考): /** * 添加新的人 * @param name 性别 * @param age 年龄 */ export function addPeople({name = '', age = ''}) { return request(`/people/addPeople?name=${name}&age=${age}`); } /** * 获取某个人的信息 * @param id 区分不同人的标识 */ export function getPeople({id= ''}) { return request(`/people/getPeople?id=${id}`, { type: 'POST' }); } ~~~ ~~~ import * as dataService from ../services/dataService // 发送请求在实际中大多放在某个方法中调用,此处简写 const response = dataService.addPeople({name: 'xiaopi',age: 22}) if(response.data){ console.log('you success!') } ~~~