Vue网络请求的三种实现方式介绍

目录
  • 1.XMLHttpRequest发送请求
  • 2.fetch发送请求
  • 3.axios请求库(Vue中推荐写法)
    • 模拟发送get和post请求
    • 网络请求时发送用户认证信息
    • 请求拦截器
    • 响应拦截器
    • 用户管理

在进行 Vue 的网络请求之前,我们先写一些假数据:

users.json:

[
  { "id": 1, "name": "张三" },
  { "id": 2, "name": "李四" }
]

1.XMLHttpRequest发送请求

使用 XMLHttpRequest 请求 users.json 中的数据:

<div id="app">
    <ul>
        <li v-for="item in users" :key="item.id">{{item.name}}</li>
    </ul>
</div>
<script>
    const vm = new Vue({
        el: '#app',
        data: {
            users: []
        },
        mounted() {
            const xhr = new XMLHttpRequest()
            // // true 表示发送异步请求
            xhr.open('get', '/mock/users.json', true)
            // // 写法1
            // xhr.onreadystatechange = () => {
            //   // 0 - 4 xhr.readyState状态值
            //   if (xhr.readyState === 4 && xhr.status === 200) {
            //     console.log(JSON.parse(xhr.responseText));
            //     this.users = JSON.parse(xhr.responseText)
            //   }
            // }
            // 写法2
            xhr.onload = ()=>{
                console.log(JSON.parse(xhr.responseText));
                this.users = JSON.parse(xhr.responseText)
            }
            xhr.send(null)
        }
    })
</script>

注意:上面介绍了两种方法,分别是onreadystatechangeonload,我们需要知道这两种方法的区别 。XMLHttpRequest 对象有一个属性 readyState,将其 (xhr.readyState) 打印后发现:进入onreadystatechange请求方式中时,可以打印其状态为2,状态为3,状态为4;进入onload之后,只出现了状态码4。也就是说,只有处于状态码4,请求已完成,响应已就绪的情况下,才会进入onload。只要进入onload请求中,一定是已经到4这个状态了。nreadystatechange()的定义是只要返回的状态码只要变化时就回调一次函数,而onload只有状态码为4时才能回调一次函数。

2.fetch发送请求

使用 fetch 请求 users.json 中的数据:

<div id="app">
    <ul>
        <li v-for="item in users" :key="item.id">{{item.name}}</li>
    </ul>
</div>
<script>
    const vm = new Vue({
        el: '#app',
        data: {
            users: []
        },
        // 兼容写法
        mounted() {
            fetch('/mock/users.json')
                .then(ret => ret.json())
                .then(json => this.users = json)
        }
        // 高版本写法
        // async mounted() {
        //   let ret = await fetch('/mock/users.json')
        //   this.users = await ret.json()
        // }
        // 高版本装逼写法
        // async mounted() {
        //   this.users  = await (await fetch('/mock/users.json')).json
        // }
    })
</script>

3.axios请求库(Vue中推荐写法)

概述:

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和node.js中。能拦截请求和响应,自动转换JSON数据。axios也是vue作者推荐使用的网络请求库。

优势:

  • 使用人群多
  • 对 Ts 支持非常好
  • 跨平台(nodejs、移动端)
  • 基于 promise ,异步变同步,写法简单
  • 添加了拦截器等封装好的函数,使用更加方便

使用方法:

<div id="app">
    <ul>
        <li v-for="item in users" :key="item.id">{{item.name}}</li>
    </ul>
</div>
<script src="./js/axios.js"></script>
<script>
    const vm = new Vue({
        el: '#app',
        data: {
            users: []
        },
        mounted() {
            // 获取数据的简单使用
            axios.get('/mock/users.json').then(ret => {
                console.log(ret.data);
                this.users=ret.data;
            })

        }
    })
</script>

模拟发送get和post请求

创建自己的服务器,模拟发送 get 和 post 请求

步骤1:

使用npm init -y初始化 node.js 配置文件

步骤2:

使用npm i -S express,安装 express

步骤3:

新建app.js,并且修改package.json文件如下

准备工作完成后,我们就可以书写服务端代码了:

app.js:

const express = require('express')
const app = express()
app.listen(9000, () => {
    console.log('http://localhost:9000')
})
// 中间件
// 解决跨域 npm i -S cors 下载并写入配置文件
app.use(require('cors')())
// post提供,内容为json格式
app.use(express.json())
app.get('/api/users', (req, res) => {
    // 解决跨域问题
    // res.setHeader('Access-Control-Allow-Origin', '*')
    res.send({
        code: 0,
        msg: 'ok',
        data: {
            users: [
                { id: 1, name: '张三' },
                { id: 2, name: '李四' }
            ],
            // 获取用户认证信息
            token: req.headers?.token
        }
    })
})
app.post('/api/users', (req, res) => {
    res.send({
        code: 0,
        msg: 'ok',
        // 把传过来的参数再返回出去
        data: req.body
    })
})
// patch/put
// patch 增量更新
// put 全量更新
app.put('/api/users/:id', (req, res) => {
    res.send({
        code: 0,
        msg: 'ok',
        data: req.body
    })
})
app.delete('/api/users/:id', (req, res) => {
    // 返回 204 意味着不会返回任何数据
    // res.status(204).send({
    res.status(200).send({
        code: 0,
        msg: 'ok',
        data: {
            id: req.params.id
        }
    })
})

前端获取数据:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>vue学习使用</title>
        <!-- 第1步: 引入vue库文件 -->
        <script src="./js/vue.js"></script>
    </head>
    <body>
        <!-- 第2步:挂载点 -->
        <div id="app">
            <ul>
                <li v-for="item in users" :key="item.id">{{item.name}}</li>
            </ul>
        </div>
        <!-- 第3步:实例化vue -->
        <script src="./js/axios.js"></script>
        <script>
            // axios全局配置  这里的地址会自动补全到 get 或 post 要请求的地址中
            // 可以写在配置文件中,方便修改
            axios.defaults.baseURL = 'http://localhost:9000';
            // 全局设置网络请求超时时间,10s中还没请求到数据,就停止请求
            axios.defaults.timeout = 10000
            const vm = new Vue({
                el: '#app',
                data: {
                    users: []
                },
                mounted() {
                    // 发送 get 请求
                    // axios.get('/api/users').then(ret => {
                    //     console.log(ret.data);
                    //     // 只会监听当前 then 方法中是否有异常
                    // }, () => console.log('有异常'))
                    // 发送 post 请求
                    // axios.post('/api/users', {
                    //     name: '李四'
                    // }).then(ret => {
                    //     console.log(ret.data);
                    // })
                    // 发送 put 请求
                    // axios.put('/api/users', {
                    //     name: '李四 -- put'
                    // }).then(ret => {
                    //     console.log(ret.data);
                    // })
                    // 发送 delete 请求
                    axios.delete('/api/users/100').then(ret => {
                        console.log(ret.data);
                    })
                }
            })
        </script>
    </body>
</html>

注意:

超时请求不到数据就报出异常,这种捕获异常的方式,会监听前面所有的 then 方法

axios.get('/api/users').then(ret => {
	console.log(ret.data);
}).catch(() => console.log('有异常'))

下面这种写法,只会监听当前 then 方法中是否有异常:

axios.get('/api/users').then(ret => {
	console.log(ret.data);
},() => console.log('有异常'))

网络请求时发送用户认证信息

有时候我们通过网络请求一个服务器的时候,需要携带一个用户认证信息,例如用户只有在登录状态下才能获取服务端的信息,否则不能获取数据,即所谓的接口认证。

那么这个登录的状态,即用户的认证信息,这是怎样传给服务器的呢?

我们会将用户的认证信息包含在前端的请求头当中,发送给服务端。

以 get 请求为例,服务端代码如下:

const express = require('express')
const app = express()
app.listen(9000, () => {
    console.log('http://localhost:9000')
})
// 中间件
// 解决跨域
app.use(require('cors')())
// post提供,内容为json格式
app.use(express.json())
app.get('/api/users', (req, res) => {
    // 解决跨域问题
    // res.setHeader('Access-Control-Allow-Origin', '*')
    res.send({
        code: 0,
        msg: 'ok',
        data: {
            users: [
                { id: 1, name: '张三' },
                { id: 2, name: '李四' }
            ],
            // 获取用户认证信息
            token: req.headers?.token
        }
    })
})

前端代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>vue学习使用</title>
    <!-- 第1步: 引入vue库文件 -->
    <script src="./js/vue.js"></script>
</head>
<body>
    <!-- 第2步:挂载点 -->
    <div id="app">
        <ul>
            <li v-for="item in users" :key="item.id">{{item.name}}</li>
        </ul>
    </div>
    <!-- 第3步:实例化vue -->
    <script src="./js/axios.js"></script>
    <script>
        // axios全局配置  这里的地址会自动补全到 get 或 post 要请求的地址中
        // 可以写在配置文件中,方便修改
        axios.defaults.baseURL = 'http://localhost:9000';
        // 全局设置网络请求超时时间,10s中还没请求到数据,就停止请求
        axios.defaults.timeout = 10000
        const vm = new Vue({
            el: '#app',
            data: {
                users: []
            },
            mounted() {
                // 发送 get 请求
                axios.get('/api/users', {
                    // 认证信息放在请求头发送
                    headers: {
                        token: 'abc'
                    }
                }).then(ret => {
                    console.log(ret.data);
                    // 只会监听当前 then 方法中是否有异常
                }, () => console.log('有异常'))
            }
        })
    </script>
</body>
</html>

注意:我们还可以使用全局配置来发送用户认证信息:axios.defaults.headers.token = 'aaaaa',(请求头中的 token 因该删掉,否则会覆盖全局配置)但是这样的配置会给所有的请求方法都添加上用户认证信息,不能区别对待,也就是不能进行业务处理,不够灵活,所以我们需要用到拦截器。

请求拦截器

延续上面的案例,如果我们的需求是,如果是 get 方法发送,则在请求头中添加用户认证信息,其他方法不添加,则前端页面需要这样写:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>vue学习使用</title>
        <!-- 第1步: 引入vue库文件 -->
        <script src="./js/vue.js"></script>
    </head>
    <body>
        <!-- 第2步:挂载点 -->
        <div id="app">
            <ul>
                <li v-for="item in users" :key="item.id">{{item.name}}</li>
            </ul>
        </div>
        <!-- 第3步:实例化vue -->
        <script src="./js/axios.js"></script>
        <script>
            // axios全局配置  这里的地址会自动补全到 get 或 post 要请求的地址中
            // 可以写在配置文件中,方便修改
            axios.defaults.baseURL = 'http://localhost:9000';
            // 全局设置网络请求超时时间,10s中还没请求到数据,就停止请求
            axios.defaults.timeout = 10000
            // 请求拦截器
            axios.interceptors.request.use(config => {
                if (config.method === 'get') {
                    config.headers.token = 'abc'
                }
                // 请求拦截器中的回调函数中的config对象一定要return出去
                return config
            })
            const vm = new Vue({
                el: '#app',
                data: {
                    users: []
                },
                mounted() {
                    // 发送 get 请求
                    axios.get('/api/users', {
                        // 认证信息放在请求头发送
                        headers: {
                            token: 'abc'
                        }
                    }).then(ret => {
                        console.log(ret.data);
                        // 只会监听当前 then 方法中是否有异常
                    }, () => console.log('有异常'))
                }
            })
        </script>
    </body>
</html>

注意:请求拦截器中的回调函数中的config对象一定要return出去。

响应拦截器

作用:

对响应的数据做处理或判断

应用:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>vue学习使用</title>
        <!-- 第1步: 引入vue库文件 -->
        <script src="./js/vue.js"></script>
    </head>
    <body>
        <!-- 第2步:挂载点 -->
        <div id="app">
            <ul>
                <li v-for="item in users" :key="item.id">{{item.name}}</li>
            </ul>
        </div>
        <!-- 第3步:实例化vue -->
        <script src="./js/axios.js"></script>
        <script>
            // axios全局配置  这里的地址会自动补全到 get 或 post 要请求的地址中
            // 可以写在配置文件中,方便修改
            axios.defaults.baseURL = 'http://localhost:9000';
            // 全局设置网络请求超时时间,10s中还没请求到数据,就停止请求
            axios.defaults.timeout = 10000
            axios.defaults.headers.token = 'aaaaa'
            // 响应拦截器
            axios.interceptors.response.use(res => {
                // 这里是未被处理过的响应数据
                console.log(res);
                // 解套,减少数据的调用层级,直接返回 res.data
                if (res.data.code == 0) return res.data
                // 这里是做了全局的网络错误处理
                alert('有错')
            }, err => Promise.reject(err))
            const vm = new Vue({
                el: '#app',
                data: {
                    users: []
                },
                mounted() {
                    // 发送 get 请求
                    axios.get('/api/users').then(ret => {
                        // 这里返回的时解套后的数据(已经被响应拦截器处理过了)
                        console.log(ret);
                        // 只会监听当前 then 方法中是否有异常
                    }, () => console.log('有异常'))
                }
            })
        </script>
    </body>
</html>

用户管理

服务端:

// 服务端代码:具备增删改查、数据源
const express = require('express')
const app = express()
app.listen(9000, () => {
    console.log('http://localhost:9000')
})
// 解决跨域
app.use(require('cors')())
// post提供,内容为json格式
app.use(express.json())
// 声明一个变量,只要服务不重启,我就永久存储(放入内存了)
let users = [
    { id: 1, name: '张三', age: 10 },
    { id: 2, name: '李四', age: 20 }
]
// 响应get请求
app.get('/api/users', (req, res) => {
    res.send({
        code: 0,
        msg: 'ok',
        // 如果请求成功就返回对应的users
        data: users
    })
})
// 增添数据
app.post('/api/users', (req, res) => {
    // 接受post提交过来的数据,用当前时间作为主键id
    const user = { ...req.body, id: Date.now() }
    // 添加数据
    users.push(user)
    res.send({
        code: 0,
        msg: 'ok',
        // 如果请求成功就返回对应的users
        data: users
    })
})
// 修改数据
app.put('/api/users/:id', (req, res) => {
    // 接受修改的id号
    let id = req.params.id
    // 接受put提交过来的数据
    users = users.map(item => (item.id == id ? { ...item, ...req.body } : item));
    res.send({
        code: 0,
        msg: 'ok',
        data: users
    })
})
// 删除数据
app.delete('/api/users/:id', (req, res) => {
    // 接受修改的id号
    let id = req.params.id
    users = users.filter(item => item.id != id)
    res.send({
        code: 0,
        msg: 'ok',
        data: users
    })
})

客户端:

http.js(axios发送请求):

// 解套处理(响应拦截器),直接返回所需数据,降低层级
axios.interceptors.response.use(
    res => res.data,
    err => Promise.reject(err)
)
// 请求拦截器
axios.interceptors.request.use(
    config => {
        config.baseURL = 'http://localhost:9000'
        // 请求超时拦截
        config.timeout = 10000
        return config
    },
    err => Promise.reject(err)
)
// 封装 axios 中的方法
const get = url => axios.get(url)
const post = (url, data = {}) => axios.post(url, data)
const put = (url, data = {}) => axios.put(url, data)
const del = url => axios.delete(url)

index.html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>vue学习使用</title>
    </head>
    <body>
        <div id="app">
            <button @click="add">添加用户</button>
            <hr>
            <ul>
                <!-- 条件渲染 -->
                <!-- template标签 影子标签,可以占位,可以读取指令,但不会被解析成html,可以使有效的标签中没有不想要的指令 -->
                <template v-if="users.length===0">
                    <li>数据加载中...</li>
                </template>
                <template v-else>
                    <li v-for="item in users" :key="item.id">
                        <span>{{item.name}}</span>
                        <span>
                            <button @click="edit(item.id)">修改</button>
                        </span>
                        <span>
                            <button @click="del(item.id)">删除</button>
                        </span>
                    </li>
                </template>
            </ul>
        </div>
        <script src="./js/vue.js"></script>
        <script src="./js/axios.js"></script>
        <script src="./utils/http.js"></script>
        <script>
            const vm = new Vue({
                el: '#app',
                data: {
                    // 定义数据源
                    users: []
                },
                async mounted() {
                    // this.users = await (await get('/api/users')).data
                    let users = await get('/api/users')
                    this.users = users.data
                },
                methods: {
                    async add() {
                        let users = await post(`/api/users`, { name: Date.now() + '' })
                        this.users = users.data
                    },
                    async edit(id) {
                        let users = await put(`/api/users/${id}`, { name: Date.now() + '' })
                        this.users = users.data
                    },
                    async del(id) {
                        let users = await del(`/api/users/${id}`)
                        this.users = users.data
                    }
                }
            })
        </script>
    </body>
</html>

到此这篇关于Vue网络请求的三种实现方式介绍的文章就介绍到这了,更多相关Vue网络请求内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue网络请求方案原生网络请求和js网络请求库

    一. 原生网络请求 1. XMLHttpRequest(w3c标准)    // 没有promise时的产物 当时的万物皆回调,太麻烦 2. Fetch    // html5提供的对象,基于promise 因为promise的存在,为了简化网络请求. 使用 Fetch - Web API 接口参考 | MDN Fetch是新的ajax解决方案 Fetch会返回Promise对象.fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象. 参数: 1.第一个参数

  • Spring Boot + Vue 前后端分离开发之前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个项目本身也停止维护,目前建议使用的方案是 axios.今天松哥就带大家来看看 axios 的使用. axios 引入 axios 使用步骤很简单,首先在前端项目中,引入 axios: npm install axios -S 装好之后,按理说可以直接使用了,但是,一般在生产环境中,我们都需要对网络请

  • 浅谈Vue网络请求之interceptors实际应用

    项目背景 最近在项目开发中,遇到下面这样一个问题: 在进行铭感操作之前,每个请求需要携带token,但是token 有有效期,token 失效后需要换取新的token并继续请求. 需求分析 每个请求都需要携带 token ,所以我们可以使用 axios request 拦截器,在这里,我们给每个请求都加 token,这样就可以节省每个请求再一次次的复制粘贴代码. token 失效问题,当我们token 失效,我们服务端会返回一个特定的错误表示,比如 token invalid,但是我们不能在每个

  • 在小程序/mpvue中使用flyio发起网络请求的方法

    Fly.js 一个基于Promise的.强大的.支持多种JavaScript运行时的http请求库. 有了它,您可以使用一份http请求代码在浏览器.微信小程序.Weex.Node.React Native.快应用中都能正常运行.同时可以方便配合主流前端框架 ,最大可能的实现 Write Once Run Everywhere. Flyio Github: https://github.com/wendux/fly 问题 随着 Weex .mpvue 的发布,他们都是支持Vue.js语法.目前v

  • Vue3如何使用axios发起网络请求

    目录 Vue3使用axios发起网络请求 1.何为Axios? 2.如何安装Axios 3.如何封装网络请求和全局实例化axios 4. api.js是什么? 5.http.js是什么? 6.request.js是什么? 7.如何在Vue文件中请求封装好的API呢? Vue3.0请求接口的例子 Vue3使用axios发起网络请求 即使是小型项目也会涉及到请求后端API,除非你的网站展示的是一些不需要维护的静态数据,第三篇文章我们来给Vue项目搞上axios. 1.何为Axios? 请看官方对Ax

  • Vue网络请求的三种实现方式介绍

    目录 1.XMLHttpRequest发送请求 2.fetch发送请求 3.axios请求库(Vue中推荐写法) 模拟发送get和post请求 网络请求时发送用户认证信息 请求拦截器 响应拦截器 用户管理 在进行 Vue 的网络请求之前,我们先写一些假数据: users.json: [ { "id": 1, "name": "张三" }, { "id": 2, "name": "李四"

  • JS实现网络请求的三种方式梳理

    目录 背景 前言 XMLHttpRequest Promise async/await 结语 背景 为了应对越来越多的测试需求,减少重复性的工作,有道智能硬件测试组基于 electron 开发了一系列测试提效工具. 随着工具的快速开发迭代,代码中出现了越来越多的嵌套的回调函数,工具崩溃的几率也越来越大.为了解决这些问题, 我们用 async/await 对这些回调函数进行了重构, 使得代码量下降,代码的可读性和可理解性都有了大幅度提高. 本文介绍了 基于 XMLHttpRequest.Promi

  • vue路由传参三种基本方式详解

    这篇文章主要介绍了vue路由传参三种基本方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据. 父组件中: <li v-for="article in articles" @click="getDescribe(article.id)"> methods: 方案一: getDescribe(id) { // 直接调用$r

  • 安卓GET与POST网络请求的三种方式

    我们的应用常常要联网取得网络上的数据,然后进行解析,必须要先取到数据之后才能进行下一步的业务. 故网络请求是常用的操作,下面我介绍常用的三种方式, 第一是比较原始的方法,使用HttpURLConnection, 第二是Volley框架, 第三是xutils3框架. 1.HttpURLConnection方法 这是基于网络通信HTTP协议的网络请求,其它两种框架也是基于HTTP协议的.HTTP协议是一款基于短连接的协议,每次交互完毕后连接断开,而HTTP请求又分为GET和POST两种方式,GET请

  • 前端vue中文件下载的三种方式汇总

    目录 前端vue中文件下载的三种方式 附:vue实现图片或文件下载功能实例 总结 前端vue中文件下载的三种方式 第一种方式是前端创建超链接,通过a标签的链接向后端服务发get请求,接收后端的文件流,非常简单: <a :href='"/user/downloadExcel"' >下载模板</a> 另一种情况是创建div标签,动态创建a标签: <div name="downloadfile" onclick="downloadE

  • vue使用 vue-socket.io三种方式及踩坑实例解析

    目录 前言 安装 使用方式一 (官方用法)[全局挂载,不验证] 使用方式二 (组件挂载使用)[可验证] 使用方式三 (全局挂载使用)[可验证] 使用方式推荐 nodejs服务端本地demo代码 总结 前言 vue项目实时通信实现常用方式: 一.原生HTML5 WebSocket实现,vue中使用websocket 二.插件socket.io官网 ,Socket.io是一个WebSocket库,包括了客户端js和服务器端的nodejs,会自动根据浏览器从WebSocket.AJAX长轮询.Ifra

  • 详解java实现HTTP请求的三种方式

    目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,HttpClient3.1 是 org.apache.commons.httpclient下操作远程 url的工具包,虽然已不再更新,但实现工作中使用httpClient3.1的代码还是很多,HttpClient4.5是org.apache.http.client下操作远程 url的工具包,最新的:另一

  • 详细解读分布式锁原理及三种实现方式

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项."所以,很多系统在设计之初就要对这三者做出取舍.在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证"最终一致性",只要这个最终

  • Android 文件下载三种基本方式

    一.自己封装URLConnection 连接请求类 public void downloadFile1() { try{ //下载路径,如果路径无效了,可换成你的下载路径 String url = "http://c.qijingonline.com/test.mkv"; String path = Environment.getExternalStorageDirectory().getAbsolutePath(); final long startTime = System.cur

  • iconfont的三种使用方式详解

    在我们项目中经常要使用到iconfont,在此我们使用阿里巴巴矢量库提供的icon图标,此图标库足够为我们提供大量的图标,我们首先需要的事在阿里巴巴矢量图标库新建一个自己的账号,并且新建一个项目,这个项目包含了你所有要用到的图标.我们需要选中需要的图标放到自己的项目中,并下载下来放到自己项目下的iconfont文件夹之下.(需要更新图标时,下载包也需要重新下载更新) 方式一:使用symbol方式(本质是用svg标签构成的) 第一步:为了代码更好的复用,我们封装一个svg-icon组件,代码如下:

随机推荐