赞
踩
请求方式具体是由后端定义的,请求的接口都是请求到后端,再由后端对数据进行操作
<script> import axios from 'axios' export default { name: 'axios2-2', created () { /*带有params参数(可以不带params参数)后在访问时对应的请求路径就是 http://localhost:8080/static/data.json?id=12 */ axios.get('../static/data.json',{ params:{ id:12 } }).then((res) => { console.log(res) }) axios({ method: 'get', url: '../static/data.json', params:{ id:12 } }).then((res) => { console.log(res) }) } } </script>
let data = {
id: 12
} //data代表要提交的数据
axios.post('/post', data).then(res => {
console.log(res)
})
axios({
method: 'post',
url: '/post',
data: data
}).then(res => {
console.log(res)
})
let formData = new FormData()
for (let key in data) {
formData.append(key, data[key])
}
axios.post('/post', formData).then(res => {
console.log(res)
})
axios.put('/put',data).then(res=>{
console.log(res)
})
axios.patch('/patch',data).then(res=>{
console.log(res)
})
axios.delete('/delete',{ params:{ id:12 } }).then(res=>{ console.log(res) }) //将params改为data,就不是在url中进行传输的了 axios.delete('/delete', { data: { id: 12 } }).then(res => { console.log(res) }) //另一种写法 axios({ method: 'delete', url: '/delete', params: {}, data: {} }).then(res => { console.log(res) })
并发请求:同时进行多个请求,并统一处理返回值
两个方法:
axios.all([
axios.get('../static/data.json'),
axios.get('../static/city.json')
]).then(
//spread中参数的个数取决于all方法中有几个参数
axios.spread((dataRes, cityRes) => {
//这儿可以对返回的数据进行一系列处理,这儿只是简单的输出
console.log(dataRes,cityRes)
})
)
后端接口地址有多个,并且超时时长不一样。axios实例可以在实例中配置参数,用实例去请求,更加方便。
<script> import axios from 'axios' export default { name: 'axios3-1', components: { }, created () { // eslint-disable-next-line no-unused-vars // create的参数是axios的配置信息 let instance = axios.create({ baseURL: 'http://localhost:8080', timeout: 1000 // 设置超时时长(1s),如果后端长时间没有返回数据,接口就会报超时。状态码:401 }) instance.get('../static/data.json').then(res => { console.log(res) }) } } </script>
即axios.create()方法里的参数,也可以是axios.get()的config
let instance = axios.create({
baseURL: 'http://localhost:8080',
})
instance.get('../static/data.json').then(res => {
console.log(res)
})
let instance = axios.create({
baseURL: 'http://localhost:8080',
url:'../static/data.json' //请求路径
})
instance.get('../static/data.json').then(res => {
console.log(res)
})
let instance = axios.create({
baseURL: 'http://localhost:8080',
headers:{
token:'' //用token识别当前登陆人的身份信息,将token传给后端
}
})
instance.get('../static/data.json').then(res => {
console.log(res)
})
优先级:请求配置>实例配置>全局配置
axios.defaults.timeout=1000
axios.defaults.baseURL='http://localhost:8080'
let instance = axios.create()
//创建完实例后进行修改
instance.defaults.timeout=3000
instance.get('/data.json',{
timeout=5000
})
在请求或响应被处理前拦截它们,即在发起请求之前做处理以及后端响应之后做一些处理
export default {
name: 'axios3-3',
components: {
},
created () {
axios.interceptors.request.use(
config => {
// 在发送请求前做些什么
return config
},err=>{
//在请求错误的时候做些什么
return Promise.reject(err)
})
}
}
axios.interceptors.response.use(
res => {
// 请求成功对响应数据做处理
return res
},
// axios.get().then(res=>{}),响应的数据会到这儿,可以对数据进行操作
err=>{
//响应错误做些什么
return Promise.reject(err)
})
let interceptors = axios.interceptors.request.use
(config => {
config.headers = {
auth: true
}
return config
})
axios.interceptors.request.eject(interceptors)
let instance = axios.create({})
instance.interceptors.request.use(config => {
$('modal').show()
return config
})
instance.interceptors.response.use(res => {
$('modal').hidden()
return res
})
在请求错误时进行的处理
无论是请求错误还是响应错误,最后都会进入axios.get()的catch进行错误处理。在实际开发过程中,一般要添加统一的错误处理
import axios from 'axios' export default { name: 'axios3-4', components: { }, created () { axios.interceptors.request.use( config => { return config }, err => { //请求错误处理 一般http状态码以4开头,常见:401超时 404not found $('modal').show() setTimeout(()=>{ $('modal').hide() },2000) //先展示错误,过2s将其隐藏 return Promise.reject(err) }) axios.interceptors.response.use( res => { return res }, err => { //响应错误处理 一般http状态码以5开头,常见:500系统错误 502系统重启 $('modal').show() setTimeout(()=>{ $('modal').hide() },2000) //先展示错误,过2s将其隐藏 return Promise.reject(err) }) axios.get('../static/data.json').then(res => { console.log(res) }).catch(err=>{ //进一步进行错误处理的操作可以写在这儿 console.log(err) }) } }
取消正在进行的http请求(稍做了解,在实际项目中不多用)
let source = axios.CancelToken.source()
axios.get('../static/data.json', {
cancelToken: source.token
}).then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
//取消请求
source.cancel('cancel http')
<template> <div class="home"> <!--从vant引入联系人列表--> <van-contact-list id="van-contact-list_add" :list="list" default-tag-text="默认" @add="onAdd" @edit="onEdit" /> // showEdit编辑弹窗的显示 <van-popup v-model="showEdit" position="bottom" id="van-popup"> <van-contact-edit :contact-info="editingContact" // 正在编辑的联系人数据 :is-edit="isEdit" //是否在编辑,记录状态 @save="onSave" @delete="onDelete" /> </van-popup> </div> </template> <script> //引入vant组件和axios import {ContactList, Toast,ContactEdit, Popup} from 'vant' import axios from 'axios' export default { name: 'contactList', components: { //注册要用到的vant组件,只有注册后才能显示在网页上 //Toast组件不需要注册,只有在template中用到的组件才要注册 [ContactList.name]: ContactList, [ContactEdit.name]: ContactEdit [Popup.name]: Popup }, data () { return { list: [], // 联系人列表 instance: null, // axios实例 showEdit: false, // 编辑弹窗的显示 editingContact: {}, // 正在编辑的联系人数据 isEdit: false } }, methods: { // 添加联系人 onAdd () { this.showEdit = true this.isEdit = false }, // 编辑联系人 onEdit (info) { this.showEdit = true this.isEdit = true this.editingContact = info //将内容添加到正在编辑的联系人的数据中 }, // 保存联系人 onSave () { if (this.isEdit) { // 编辑保存 // 接口文档里的/contact/edit有三个参数:id,name,tel // 这三个参数不需要单独获取,已经存在了info中 // 编辑用put this.instance.put('/contact/edit', info).then( res => { if (res.data.code === 200) { Toast('编辑成功') this.showEdit = false // 关闭弹窗 this.getList() } }).catch(() => { Toast('编辑失败') }) } else { // 新建保存,将结果存到接口文档里的/contact/new/json中,用post向后端发送数据 this.instance.post('/contact/new/json', info).then(res => { //检查返回的状态,200代表成功 if (res.data.code === 200) { Toast('新建成功') this.showEdit = false // 关闭弹窗 //新建后需要进行更新联系人列表,即重新获取联系人列表 this.getList() } }).catch(() => { Toast('新建失败') }) } }, // 删除联系人 onDelete (info) { this.instance.delete('/contact',{ //将id拼接在url上,查询接口文档,删除的参数只有id,且要将id拼接在url上 params:{ id:info.id } }).then( res=>{ if (res.data.code === 200) { Toast('删除成功') this.showEdit = false // 删除成功后关闭弹窗 this.getList() } }).catch(() => { Toast('删除失败') }) }, //获取联系人列表 getList(){ //从后端获取数据,get参数对应的是接口文档里的url中的一个 this.instance.get('/contactList').then(res => { //res是后端返回的数据,可以先使用consle.log(res)在浏览器中查看返回数据的格式 //再去取用数据 this.list = res.data.data // eslint-disable-next-line handle-callback-err }).catch(err => { //使用vant的Toast轻提示组件输出错误信息 Toast('请求失败,请稍后重试') }) } }, created () { //创建axios实例 this.instance = axios.create({ //baseURL对应接口文档里的后端接口地址 baseURL: 'http://localhost:9000/api', timeout: 1000 }) //从后端获取联系人列表 this.getList() } } </script> <style scoped> .van-contact-list_add{ z-index: 0; } <!--将弹窗铺满--> .van-popup{ height: 100%; } </style>
代码见axios实例中的service文件夹
创建url统一的管理文件时,需要按照模块进行划分。eg:联系人列表、订单列表等不同的业务模块要封装到不同的js文件中
Eg:
const CONTACT_API = { // 获取联系人列表 getContactList: { method: 'get', url: '/contactList' }, // 新建联系人 form-data newContactForm: { method: 'post', url: '/contact/new/form' }, // 新建联系人 appilcation/json newContactJson: { method: 'post', url: '/contact/new/json' }, // 编辑联系人 editContact: { method: 'put', url: '/contact/edit' }, // 删除联系人 delContact: { method: 'delete', url: '/contact' } } // 将创建的api对象导入出去,方便引用 export default CONTACT_API
// 对axios进行封装 import axios from 'axios' import service from './contactApi' // 将service循环遍历输出不同的请求方法 let instance = axios.create({ baseURL: 'http://localhost:9000/api', timeout: 1000 }) // 包裹请求方法的容器 const Http = {} for (let key in service) { // api中存放有url和method let api = service[key] // async function()的作用是避免进入回调地狱 Http[key] = async function ( params, // 请求参数get:url,put,post,patch(data),delete:url isFormData = false, // 标识是否是form-data请求 config = {} // 配置参数 ) { let res = null try { // res对应于 // axios.get().then(res=>{ // // }).catch(err=>{ // // })中的res res = await axios.get('url') } catch (err) { // 捕捉错误 // 对应于 // axios.get().then(res=>{ // }).catch(err=>{ // // })中的catch部分err res = err } } }
// 对axios进行封装 import axios from 'axios' import service from './contactApi' // 将service循环遍历输出不同的请求方法 let instance = axios.create({ baseURL: 'http://localhost:9000/api', timeout: 1000 }) // 包裹请求方法的容器 const Http = {} // 请求格式/参数的统一 for (let key in service) { // api中存放有url和method let api = service[key] // async function()的作用是避免进入回调地狱 Http[key] = async function ( params, // 请求参数get:url,put,post,patch(data),delete:url isFormData = false, // 标识是否是form-data请求 config = {} // 配置参数 ) { let newParams = {} // content-type是否是form-data的判断 // 如果是form-data格式,要new一个FormData的对象 if (params && isFormData) { newParams = new FormData() for (let i in params) { newParams.append(i, params[i]) } } // 如果是application/json格式 else { // 直接赋值即可 newParams = params } // 不同请求的判断 let response = {} // 请求的返回值 if (api.method === 'put' || api.method === 'post' || api.method === 'patch') { // 这三种方法请求相同 try { response = await instance //newParams就相当于data,只不过换了个格式 await instance[api.method](api.url, newParams, config) } catch (err) { response = err } } else if (api.method === 'delete' || api.method === 'get') { // delete 和 get没有第二个参数 config.params = newParams try { response = await instance await instance[api.method](api.url, config) } catch (err) { response = err } } return response } }
// 拦截器的添加 // 请求拦截器 instance.interceptors.request.use(config => { // 发起请求前做些什么 // Toast.loading会在页面中出现等待的图标 Toast.loading({ mask: false, duration: 0, // 一直存在 forbidClick: true, // 禁止点击 message: '加载中……' }) return config }, () => { // 请求错误 Toast.clear() Toast('请求错误') }) // 响应拦截器 instance.interceptors.response.use(res => { // 请求成功 Toast.clear() return res.data }, () => { // 请求错误 Toast.clear() Toast('请求错误') }) export default Http
import Http from "../service/http"
//把http挂在到vue实例上
Vue.prototype.$Http=Http
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。