Axios基础知识总结

本文目录

  • 1.axios是什么?
  • 2.简单使用
  • 3.请求方法的别名
  • 4.处理并发+请求
  • 5.创建实例
  • 6.拦截器
  • 7.作为vue的全局引用插件使用
  • 8.通过Axios拿取指定数量的数据

1.axios是什么?

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它有以下特征:

  • 从浏览器中创建 XMLHttpRequest
  • 从 node.js 发出 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防止 CSRF/XSRF

在vue全家桶中,推荐使用,说白了就是用它来发送请求,和后端交互

2.简单使用

1.安装axios
npm install axios --save
2.使用axios发送get请求
在组件内部导入axios,这里以Demo1.vue为例,在Demo1.vue中引入:
import axios from 'axios'
在created中发送请求

created () {
  axios.get('https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/list')
      .then((response) => console.log(response))
}

上面代码中打印出来的内容是一个对象,里面的内容结构为:

{
  // `data` 由服务器提供的响应
  data: {},
  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,
  // `statusText` 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',
  // `headers` 服务器响应的头
  headers: {},
  // `config` 是为请求提供的配置信息
  config: {}
}

上面例子中使用get方式请求数据,其中get方式是默认的,因此,你也可以写成这样

axios('https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/list')
    .then((response) => console.log(response))

3.使用axios发送post请求
接下来,你可以尝试着去发送一下post方法了,使用方法和jquery中ajax方法类似

axios({
      method: 'post',
      url: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/add'
    })
      .then((response) => console.log(response))

4.错误处理
你需要在catch里面处理错误,例如:

 axios({
      method: 'post',
      url: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/add/1'
    })
      .then((response) => console.log(response))
      .catch((err) => console.log(err))

5.传递参数方式
get请求方式传参数,配置params选项就可以了

  axios({
    method: 'get',
    url: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/list',
    params: {
      title: 'xxx',
      count: 30
    }
  })
    .then((response) => console.log(response))

注意:params里面的内容作为查询字符串和url一起发送
post请求方式传参数,配置data选项

  axios({
    method: 'post',
    url: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/add',
    data: {
      title: 'html最佳入门',
      count: 80
    }
  })
    .then((response) => console.log(response))
    .catch((err) => console.log(err))

注意:data的内容作为请求体发送

3.请求方法的别名

为方便起见,为所有支持的请求方法提供了别名

  • axios.get(url[, config])
  • axios.request(config)
  • axios.delete(url[, config])
  • axios.head(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])
  • axios.patch(url[, data[, config]])

举个例子,原来使用对应的别名发送,可以写成这样

  axios.get('https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/list', {
    params: {
      id: 10
    }
  })
    .then((response) => console.log(response))

其他请求方式使用方法和上面例子类似

4.处理并发+请求

有时候,你想一次执行多个请求,可以使用all方法

function http1 () {
  return axios.get('https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/list')
}
function http2 () {
  return axios.post('https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/update')
}
axios.all([http1(), http2()]).then((response) => {
  // 这里response返回一个数组,里面装了两个请求的返回结果
  console.log(response)
})

上面代码中返回结果被放入到了一个数组中,如果想分别把结果拿出来,可以使用axios.spread方法

axios.all([http1(), http2()]).then(axios.spread((res1, res2) => {
  // res1 对应http1的请求结果 res2对应http2的请求结果
  console.log(res1, res2)
}))

5.创建实例

可以创建一个自定义实例应用于多个请求接口

const HTTP = axios.create({
  baseURL: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo'
})

通过这个实例发起请求可以简写掉实例中定义的baseURL

created () {
  HTTP.get('/course/list').then((response) => console.log(response))
}

实例中的相关配置:

  • url 是用于请求的服务器 URL
  • method 是创建请求时使用的方法,默认是 get
  • baseURL 将自动加在 url 前面,除非 url 是一个绝对 URL,可以通过设置一个 baseURL 便于为 axios 实例的方法传递相对 URL
  • transformRequest 允许在向服务器发送前,修改请求数据,只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法,后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  transformRequest: [function (data) {
    // 对 data 进行任意转换处理
    return data;
  }],
  • transformResponse 在传递给 then/catch 前,允许修改响应数据
  • headers 是即将被发送的自定义请求头
  • params 是即将与请求一起发送的 URL 参数
  • data 是作为请求主体被发送的数据
  • timeout 指定请求超时的毫秒数(0 表示无超时时间),如果请求花费了超过 timeout 的时间,请求将被中断
  • withCredentials 表示跨域请求时是否需要使用凭证,默认是false
  • auth 表示应该使用 HTTP 基础验证,并提供凭据,这将设置一个 Authorization 头,覆写掉现有的任意使用 headers 设置的自定义 Authorization
auth: {
  username: 'janedoe',
  password: 's00pers3cret'
},
  • responseType 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream',默认是json
  • onUploadProgress 允许为上传处理进度事件
onUploadProgress: function (progressEvent) {
  // 对原生进度事件的处理
},
  • onDownloadProgress 允许为下载处理进度事件
  • 'proxy' 定义代理服务器的主机名称和端口,auth 表示 HTTP 基础验证应当用于连接代理,并提供凭据,这将会设置一个 Proxy-Authorization 头,覆写掉已有的通过使用 header 设置的自定义 Proxy-Authorization 头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: : {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

我们挑两个选项举例:
1.timeout,设置超时时间,如果请求超过了设置的这个时间,请求会被中断

const HTTP = axios.create({
  baseURL: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo',
  timeout: 10
})

请求超过10毫秒就会被中断
2.headers,用来设置请求头

const HTTP = axios.create({
  baseURL: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo',
  timeout: 1000,
  headers: {'name': 'xiaoqiang'}
})

6.拦截器

拦截器的作用是可以让我们在请求或者响应在then或者catch处理之前做些事情

<script type="text/javascript">
import axios from 'axios'
const HTTP = axios.create({
  baseURL: 'https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo',
  timeout: 1000,
  headers: {'name': 'xiaoqiang'}
})
// 添加请求拦截器
HTTP.interceptors.request.use((config) => {
  // 在请求发送前需要做的事情
  console.log('加载一张菊花图')
  return config
}, (err) => {
  // 请求错误了可以做些别的事情
  return Promise.reject(err)
})
HTTP.interceptors.responese.use((response) => {
  // 在响应发送前需要做的事情
  console.log('关掉一张菊花图')
  return response
}, (err) => {
  // 请求错误了可以做些别的事情
  return Promise.reject(err)
})
export default {
  created () {
    HTTP.get('/course/list').then((response) => console.log(response))
  }
}
</script>
<style scoped>
</style>

7.作为vue的全局引用插件使用

在vue中,我们不需要在每个组件中都去引入axios,这样使用起来比较麻烦,我们可以结合插件vue-axios,让操作更简化
1.安装插件
npm install vue-axios --save
2.在入口文件main.js中引入模块,并挂载插件

import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)

3.在组件中就可以直接直接通过this.axios去发请求

this.axios.get('https://easy-mock.com/mock/5c23887d3671d47be5ea8d66/axiosdemo/course/list').then((response) => {
      console.log(response)
})

8.通过Axios拿取指定数量的数据

有时候我们并不会使用到从后端拿到的全部条数的数据,所以我们对数据进行一些前端处理
1.获取的数据是完整的,但是复制给本地的时候只取前六条

async getPlayListData() {
    const { data } = await axios.get("/api/personalized");
    if (data.code === 200) {
        this.playListData = data.result.slice(0, 6);
    }
}

2.获取数据的时候就限制数量,这种方法需要和后端约定好接口才可以

async getArtistsData() {
    const { data } = await axios.get("/api/top/artists?limit=10");
    if (data.code === 200) {
         this.artistsData = data.artists;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,895评论 1 4
  • # 目录 axios基础知识和使用办法 构造适用于自己系统的axios 在vue中使用vue-axios 请求失败...
    果汁凉茶丶阅读 2,662评论 0 6
  • 响应式布局的理解 响应式开发目的是一套代码可以在多种终端运行,适应不同屏幕的大小,其原理是运用媒体查询,在不同屏幕...
    懒猫_6500阅读 781评论 0 0
  • 在Vue1.0的时候有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 ...
    蕉下客_661a阅读 4,052评论 0 2
  • vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios。 vue-resour...
    _双眸阅读 15,095评论 0 13