前面的vuex提到了异步请求,在vue里异步请求怎么请求呢,很显然jq.ajax是不用了,不是不能用,而是没必要,jq是操作dom的工具,强行用浪费功能,还会加大打包后的体积,而且是没有promise的,所以有大佬封装了新的ajax,名字叫axios,也是vue的作者尤雨溪推荐使用的,这个axios是可以直接在nodejs端使用的

自行百度安装,axios是没有封装成可以让vue.use()的这种使用模式的,也没必要,但最好二次封装下

二次封装

先去创建一个util的工具文件夹,在里面再新建一个叫request.js文件,直接上代码

// 引入axios
import axios from 'axios'
import store from 'store' const service = axios.create({
// url = base url + request url
// 这是请求的前缀的三元运算符,是需要配合proxy使用的
// process.env.NODE_ENV 是nodejs的全局变量,需要懂点nodejs才知道
// 意思是如果是开发【development】环境
// 前缀就是当前本地地址 "localhost:端口" + "/proxy" + "url值"
// 如果不是开发环境,意思就是线上环境,即打包后上线的环境,你让用户请求 "localhost:3000" 肯定是请求不到的
// 所以打包出来的就是 "http://xxx.com" + "url值"
baseURL: process.env.NODE_ENV === 'development' ? '/proxy' : 'http://xxx.com', //process.env.VUE_APP_BASE_API
// 最长等待时间
timeout: 5000 // request timeout
}) // 请求前的操作,config参数是请求前的一切数据,可以打印查看
service.interceptors.request.use(
config => {
// 在这里可以做权限的判断
if(0){
// 不同意请求 return 一个Promise.reject
return Promise.reject("当前账号无该请求权限")
}
// 从vuex里取token值,如果这么写上面需要去引入vuex
if (store.getters.token) {
// 可以自动添加请求头token,就不需要自己手动一次次去写了
// 什么是token,面试题篇里有
config.headers['X-Token'] = getToken()
}
// 如果同意请求,需要return config
return config
},
error => {
// 错误处理
console.log(error) // for debug
return Promise.reject(error)
}
) // 请求后的操作,response是axios二次封装的返回值
service.interceptors.response.use(
response => {
// 在返回值可以看到请求的地址
const url = response.config.url;
// 这是真正的返回数据
const res = response.data;
// 可以做一些统一的返回值处理
if (res.code === 2000) {
// 成功就返回res
return res
} else {
return Promise.reject(new Error(res.msg || 'Error'))
}
},
error => {
// 无返回的错误处理
return Promise.reject(error)
}
)
// 这就是整个插件了
export default service

如何使用

写好接口

建议是统一一个文件夹叫req或者叫api,然后根据模块放置请求

// 引入封装好的插件
import request from '@/utils/request' export function getInfo(opt) {
return request({
// 这个在开发环境会变成 "http:localhost:端口" + "/proxy" + "/user/info"
// 正式环境就是 "http:baidu.com" + "/user/info"
url: '/user/info',
method: 'get',
// get用params
params: opt
})
} export function post(opt) {
return request({
url: '/post',
method: 'post',
// post用data
data: opt
})
}

在vue文件里调用

在vuex使用查看上一篇,跟在vue文件里写法一样的

// 引入
import { getInfo,post} from 'api/user'; export default {
data(){
return { ... }
},
mounted(){
getInfo({id:123123}).then(res=>{
console.log(res)
})
},
} // 因为是promise请求还可以用
Promise.all([getInfo(),post()])
// 或者async
async mounted(){
var res = await getInfo({id:123123})
},

上传文件

export function upload(formdata) {
return request({
url: '/uploadFile',
method: 'post',
data: formdata,
headers: { 'Content-Type': 'multipart/form-data' },
})
}

注意,axios的post请求是会自动转成了json字符串【跟文件上传无关】,如果后端说他不要json格式,一定要key-value的form表单格式,就不能用上面的封装了,得安装qs插件,还要修改headers

qs插件

import qs from 'qs';

export function upload(formdata) {
return request({
url: '/form',
method: 'post',
data: qs.stringify(data),
headers: {'content-type': 'application/x-www-form-urlencoded'},
})
}

就上面这么写,是发不出去请求的

我们上面出现过的这两句话

1. 这个在开发环境会变成 "http:localhost:端口" + "/proxy" + "/user/info"
2. 正式环境就是 "http:baidu.com" + "/user/info"

在jq-ajax请求的那一篇的最后面就写过,请求需要满足的条件

  1. 需要存在这个请求地址,第一个请求地址一看就没有,脚手架里怎么会有这个接口呢
  2. 需要浏览器不跨域

如何满足上面的两个条件,查看下一篇

补充fetch

fetch并不是一个插件,是跟xhr一样的,原生的,请求方式,目前兼容不好,普及不多,这里做个记录

fetch('https://www.baidu.com/search/error.html', {
method: 'POST',
credentials: 'xxx' // 强制加入凭据头
headers: new Headers({
'Content-Type': 'application/x-www-form-urlencoded' // 指定提交方式为表单提交
'Accept': 'application/json' // 通过头指定,获取的数据类型是JSON
}),
body: new URLSearchParams([["foo", 1],["bar", 2]]).toString()
})
.then((res)=>{
return res.text()
})
.then((res)=>{
console.log(res)
})

axios和fetch的更多相关文章

  1. react中使用Ajax请求(axios,Fetch)

    React本身只关注于界面, 并不包含发送ajax请求的代码,前端应用需要通过ajax请求与后台进行交互(json数据),可以使用集成第三方ajax库(或自己封装) 常用的ajax请求库 jQuery ...

  2. 异步请求xhr、ajax、axios与fetch的区别比较

    目录 1. XMLHttpRequest对象 2. jQuery ajax 3. axios 4. fetch 参考 why: 为什么会出现不同的方法呢? what: 这些都是异步请求数据的方法.在不 ...

  3. axios ajax fetch 区别以及优缺点

    将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...

  4. ajax、axios、fetch区别及优缺点

    将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...

  5. ajax、axios、fetch之间的详细区别以及优缺点

    1.jQuery ajax $.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () ...

  6. axios ajax fetch 区别

    请求方式千千万,axios是一种对ajax的封装,fetch是一种浏览器原生实现的请求方式,跟ajax对等

  7. vue下axios和fetch跨域请求

    1.在config的index.js下面进行常用跨域配置代码:proxyTable: { '/apis': { //使用"/api"来代替"http://xxxx.cn& ...

  8. axios和fetch区别对比

    axios axios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' ...

  9. 前端向后端获取数据的三种方法:ajax、axios、fetch

    1.jQuery中的ajax get方法: $.ajax({ url:"v4/api/film/now-playing?t=1539401039415&page=1&coun ...

  10. ajax、axios、fetch 对比

    前言 今天在看到一个比较好的插件,写一个示例时,由于需要请求在线数据,官方给的是用 $.get(),就为了一个示例使用 JQuery 没必要. 又找了找,发现有用 fecth 的,挺方便,这里就做一个 ...

随机推荐

  1. SpringBoot与Jpa入门

    一.JPA简介 目前JPA主要实现由hibernate和openJPA等. Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少 ...

  2. Tachyon---基于内存的分布式存储系统

    Tachyon是一个以内存为核心的开源分布式存储系统,也是目前发展最迅速的开源大数据项目之一.Tachyon为不同的大数据计算框架(如Apache Spark,Hadoop MapReduce, Ap ...

  3. elk安装2.0版本,自己总结,比较细致 es单机的安装

    用root用户会报错,版本6之前还是可以用root用户启动的,针对es的保护,数据的一些问题,6之后就不允许了. 启动成功 下面验证一下  可以直接用浏览器访问,接受http访问 配置,因为没有暴露端 ...

  4. 3 HTML标题&元素&图像&属性&字体增强&链接&头部标签与元素

    HTML标题(heading) 通过<h1>~~~<h6>定义,每个元素代表文档中不同级别的内容. h1表示主标题,the main heading , h2,3分别表示二级. ...

  5. 三、linux基础-常用命令man_cd_|_find_ln_>_history

    3通用命令3.1 man命令man pwd      来查看该命令的全部帮助手册备注:命令最终是在内核中执行的,但是内核并无法直接识别,所以先通过shell执行,然后再交给内核执行3.2 cd 命令c ...

  6. linux 基本命令学习总结

    1. linux的目录结构  (linux核心:一切皆文件) 目录结构解释 (主要的有 /etc  /home  /mnt  /opt  /usr   /tmp) 相对路径和绝对路径的区别 绝对路径  ...

  7. Session 'app': Error Installing APKs app 在手机或虚拟机上调试报错

    解决方案: build --clean project

  8. 「AHOI2008」紧急集合/聚会

    题目描述 这次也是很长的题面啊\(qwq\) 题目大意如下: 给定一棵\(N\)个节点的树以及\(M\)次询问,每次询问给出\(x,\ y,\ z\)三个节点,程序需要在树上找一个点\(p\) 使得\ ...

  9. 测试人员如何使用Git

    测试人员如何使用Git? 首先Git的安装,这里不多做阐述,直接去Git官方网站下载后并傻瓜式安装即可. 如何判定已安装好Git呢?  ------------- 随便打开一个目录,鼠标右键点击可看到 ...

  10. Golang 如何交叉编译

    Golang 支持交叉编译,即在一个平台上生成另一个平台的可执行程序.方法如下: Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOOS=linux G ...