axios的基本用法

一.axios

1.什么是axios

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端。简单的理解就是ajax的封装

它本身具有以下特征:

     a.从浏览器中创建 XMLHttpRequest
     b.从 node.js 发出 http 请求
     c.支持 Promise API
     e.拦截请求和响应
     f.转换请求和响应数据
    g.取消请求
    h.自动转换JSON数据

    i.客户端支持防止 CSRF/XSRF

2.安装

 nodeJs + webpack+vue+ element ui 环境安装

二.axios  API

(1).向 axios 传递相关配置来创建请求

 
  1. 1.axios(config)

  2. // 发送 POST 请求

  3. axios({

  4. method: 'post',

  5. url: '/user/12345',

  6. data: {

  7. firstName: 'Fred',

  8. lastName: 'Flintstone'

  9. }

  10. });

  11.  
  12. 2.axios(url[, config])

  13. // 发送 GET 请求(默认的方法)

  14. axios('/user/12345');

(2).axios提供了一下几种请求方式

 
  1. 1.axios.get(url[, config]) 执行 GET 请求

  2. eg:

  3.  
  4. // 向具有指定ID的用户发出请求

  5. axios.get('/user?ID=12345')

  6. .then(function (response) {

  7. console.log(response);

  8. })

  9. .catch(function (error) {

  10. console.log(error);

  11. });

  12.  
  13. // 也可以通过 params 对象传递参数

  14. axios.get('/user', {

  15. params: {

  16. ID: 12345

  17. }

  18. })

  19. .then(function (response) {

  20. console.log(response);

  21. })

  22. .catch(function (error) {

  23. console.log(error);

  24. });

  25.  
  26. 2.axios.post(url[, data[, config]]) 执行 POST 请求

  27. eg:

  28. axios.post('/user', {

  29. firstName: 'Fred',

  30. lastName: 'Flintstone'

  31. })

  32. .then(function (response) {

  33. console.log(response);

  34. })

  35. .catch(function (error) {

  36. console.log(error);

  37. });

  38. 3.axios.request(config)

  39.  
  40. 4.axios.head(url[, config])

  41.  
  42. 5.axios.delete(url[, config])

  43.  
  44. 6.axios.put(url[, data[, config]])

  45.  
  46. 7.axios.patch(url[, data[, config]])

  47.  
  48. 8.axios.all(iterable)执行多个并发请求

  49.  
  50. eg:

  51. function getUserAccount() {

  52. return axios.get('/user/12345');

  53. }

  54.  
  55. function getUserPermissions() {

  56. return axios.get('/user/12345/permissions');

  57. }

  58.  
  59. axios.all([getUserAccount(), getUserPermissions()])

  60. .then(axios.spread(function (acct, perms) {

  61. // 两个请求现在都执行完成

  62. }));

  63. 9.axios.spread(callback)

  64.  
  65.  
  66. 注意:处理并发请求的助手函数axios.all(iterable) axios.spread(callback)

(3).请求配置

这些是创建请求时可以用的配置选项。只有 url 是必需的。如果没有指定 method,请求将默认使用 get 方法。

 
  1. //config

  2.  
  3. {

  4. // `url` 是用于请求的服务器 URL

  5. url: '/user',

  6.  
  7. // `method` 是创建请求时使用的方法

  8. method: 'get', // 默认是 get

  9.  
  10. // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。

  11. // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL

  12. baseURL: 'https://some-domain.com/api/',

  13.  
  14. // `transformRequest` 允许在向服务器发送前,修改请求数据

  15. // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法

  16. // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream

  17. transformRequest: [function (data) {

  18. // 对 data 进行任意转换处理

  19.  
  20. return data;

  21. }],

  22.  
  23. // `transformResponse` 在传递给 then/catch 前,允许修改响应数据

  24. transformResponse: [function (data) {

  25. // 对 data 进行任意转换处理

  26.  
  27. return data;

  28. }],

  29.  
  30. // `headers` 是即将被发送的自定义请求头

  31. headers: {'X-Requested-With': 'XMLHttpRequest'},

  32.  
  33. // `params` 是即将与请求一起发送的 URL 参数

  34. // 必须是一个无格式对象(plain object)或 URLSearchParams 对象

  35. params: {

  36. ID: 12345

  37. },

  38.  
  39. // `paramsSerializer` 是一个负责 `params` 序列化的函数

  40. // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)

  41. paramsSerializer: function(params) {

  42. return Qs.stringify(params, {arrayFormat: 'brackets'})

  43. },

  44.  
  45. // `data` 是作为请求主体被发送的数据

  46. // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'

  47. // 在没有设置 `transformRequest` 时,必须是以下类型之一:

  48. // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams

  49. // - 浏览器专属:FormData, File, Blob

  50. // - Node 专属: Stream

  51. data: {

  52. firstName: 'Fred'

  53. },

  54.  
  55. // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)

  56. // 如果请求话费了超过 `timeout` 的时间,请求将被中断

  57. timeout: 1000,

  58.  
  59. // `withCredentials` 表示跨域请求时是否需要使用凭证

  60. withCredentials: false, // 默认的

  61.  
  62. // `adapter` 允许自定义处理请求,以使测试更轻松

  63. // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).

  64. adapter: function (config) {

  65. /* ... */

  66. },

  67.  
  68. // `auth` 表示应该使用 HTTP 基础验证,并提供凭据

  69. // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头

  70. auth: {

  71. username: 'janedoe',

  72. password: 's00pers3cret'

  73. },

  74.  
  75. // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'

  76. responseType: 'json', // 默认的

  77.  
  78. // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称

  79. xsrfCookieName: 'XSRF-TOKEN', // default

  80.  
  81. // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称

  82. xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的

  83.  
  84. // `onUploadProgress` 允许为上传处理进度事件

  85. onUploadProgress: function (progressEvent) {

  86. // 对原生进度事件的处理

  87. },

  88.  
  89. // `onDownloadProgress` 允许为下载处理进度事件

  90. onDownloadProgress: function (progressEvent) {

  91. // 对原生进度事件的处理

  92. },

  93.  
  94. // `maxContentLength` 定义允许的响应内容的最大尺寸

  95. maxContentLength: 2000,

  96.  
  97. // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte

  98. validateStatus: function (status) {

  99. return status >= 200 && status < 300; // 默认的

  100. },

  101.  
  102. // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目

  103. // 如果设置为0,将不会 follow 任何重定向

  104. maxRedirects: 5, // 默认的

  105.  
  106. // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:

  107. // `keepAlive` 默认没有启用

  108. httpAgent: new http.Agent({ keepAlive: true }),

  109. httpsAgent: new https.Agent({ keepAlive: true }),

  110.  
  111. // 'proxy' 定义代理服务器的主机名称和端口

  112. // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据

  113. // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。

  114. proxy: {

  115. host: '127.0.0.1',

  116. port: 9000,

  117. auth: : {

  118. username: 'mikeymike',

  119. password: 'rapunz3l'

  120. }

  121. },

  122.  
  123. // `cancelToken` 指定用于取消请求的 cancel token

  124. // (查看后面的 Cancellation 这节了解更多)

  125. cancelToken: new CancelToken(function (cancel) {

  126. })

  127. }

(4).响应结构

某个请求的响应包含以下信息

 
  1. {

  2. // `data` 由服务器提供的响应

  3. data: {},

  4.  
  5. // `status` 来自服务器响应的 HTTP 状态码

  6. status: 200,

  7.  
  8. // `statusText` 来自服务器响应的 HTTP 状态信息

  9. statusText: 'OK',

  10.  
  11. // `headers` 服务器响应的头

  12. headers: {},

  13.  
  14. // `config` 是为请求提供的配置信息

  15. config: {}

  16. }

 
  1. 使用 then 时,你将接收下面这样的响应:

  2.  
  3. axios.get('/user/12345')

  4. .then(function(response) {

  5. console.log(response.data);

  6. console.log(response.status);

  7. console.log(response.statusText);

  8. console.log(response.headers);

  9. console.log(response.config);

  10. });

(5).配置的默认值/defaults

你可以指定将被用在各个请求的配置默认值

 
  1. 1.全局的 axios 默认值

  2. axios.defaults.baseURL = 'https://api.example.com';

  3. axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

  4. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

  5.  
  6. 2.自定义实例默认值

  7. // 创建实例时设置配置的默认值

  8. var instance = axios.create({

  9. baseURL: 'https://api.example.com'

  10. });

  11.  
  12. // 在实例已创建后修改默认值

  13. instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

  14.  
  15. 3.配置的优先顺序

  16. 配置会以一个优先顺序进行合并。这个顺序是:在 lib/defaults.js 找到的库的默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。后者将优先于前者。

  17. 这里是一个例子:

  18.  
  19. // 使用由库提供的配置的默认值来创建实例

  20. // 此时超时配置的默认值是 `0`

  21. var instance = axios.create();

  22.  
  23. // 覆写库的超时默认值

  24. // 现在,在超时前,所有请求都会等待 2.5 秒

  25. instance.defaults.timeout = 2500;

  26.  
  27. // 为已知需要花费很长时间的请求覆写超时设置

  28. instance.get('/longRequest', {

  29. timeout: 5000

  30. });

(6).拦截器

在请求或响应被 then 或 catch 处理前拦截它们。

 
  1. // 添加请求拦截器

  2. axios.interceptors.request.use(function (config) {

  3. // 在发送请求之前做些什么

  4. return config;

  5. }, function (error) {

  6. // 对请求错误做些什么

  7. return Promise.reject(error);

  8. });

  9.  
  10. // 添加响应拦截器

  11. axios.interceptors.response.use(function (response) {

  12. // 对响应数据做点什么

  13. return response;

  14. }, function (error) {

  15. // 对响应错误做点什么

  16. return Promise.reject(error);

  17. });

 
  1. 1.如果你想在稍后移除拦截器,可以这样:

  2. var myInterceptor = axios.interceptors.request.use(function () {/*...*/});

  3. axios.interceptors.request.eject(myInterceptor);

  4. 2.可以为自定义 axios 实例添加拦截器

  5. var instance = axios.create();

  6. instance.interceptors.request.use(function () {/*...*/});

(7).错误处理

 
  1. axios.get('/user/12345')

  2. .catch(function (error) {

  3. if (error.response) {

  4. // 请求已发出,但服务器响应的状态码不在 2xx 范围内

  5. console.log(error.response.data);

  6. console.log(error.response.status);

  7. console.log(error.response.headers);

  8. } else {

  9. // Something happened in setting up the request that triggered an Error

  10. console.log('Error', error.message);

  11. }

  12. console.log(error.config);

  13. });

 
  1. 可以使用 validateStatus 配置选项定义一个自定义 HTTP 状态码的错误范围。

  2. axios.get('/user/12345', {

  3. validateStatus: function (status) {

  4. return status < 500; // 状态码在大于或等于500时才会 reject

  5. }

  6. })

请查看官网

三.注意细节

1. 引用 axios 时

Vue.prototype.axios = axios  Vue.prototype.$axios = axios    Vue.prototype.$http = axios  其实是都一个东西,只是vue的原型链上加个变量(且变量不同),值是axios对象 。

只是 一个是jquery封装过的异步调用方法    一个是vue推荐的第三方异步封装方法  他们都是调用的axios对象

只是调用的时候 axios.post({..})   this.$axios.post({...})     this.$http.post({....})

四.案例

1.本地data.json(f放在src同级)

 
  1. {

  2. "seller": {

  3. "name": "粥品香坊(回龙观)",

  4. "description": "蜂鸟专送",

  5. "deliveryTime": 38,

  6. "score": 4.2,

  7. "serviceScore": 4.1,

  8. "foodScore": 4.3,

  9. "rankRate": 69.2,

  10. "minPrice": 20,

  11. "deliveryPrice": 4,

  12. "ratingCount": 24,

  13. "sellCount": 90,

  14. "bulletin": "粥品香坊其烹饪粥料的秘方源于中国千年古法,在融和现代制作工艺,由世界烹饪大师屈浩先生领衔研发。坚守纯天然、0添加的良心品质深得消费者青睐,发展至今成为粥类的引领品牌。是2008年奥运会和2013年园博会指定餐饮服务商。",

  15. "supports": [{

  16. "type": 0,

  17. "description": "在线支付满28减5"

  18. }, {

  19. "type": 1,

  20. "description": "VC无限橙果汁全场8折"

  21. }, {

  22. "type": 2,

  23. "description": "单人精彩套餐"

  24. }, {

  25. "type": 3,

  26. "description": "该商家支持发票,请下单写好发票抬头"

  27. }, {

  28. "type": 4,

  29. "description": "已加入“外卖保”计划,食品安全保障"

  30. }],

  31. "avatar": "http://static.galileo.xiaojukeji.com/static/tms/seller_avatar_256px.jpg",

  32. "pics": ["http://fuss10.elemecdn.com/8/71/c5cf5715740998d5040dda6e66abfjpeg.jpeg?imageView2/1/w/180/h/180", "http://fuss10.elemecdn.com/b/6c/75bd250e5ba69868f3b1178afbda3jpeg.jpeg?imageView2/1/w/180/h/180", "http://fuss10.elemecdn.com/f/96/3d608c5811bc2d902fc9ab9a5baa7jpeg.jpeg?imageView2/1/w/180/h/180", "http://fuss10.elemecdn.com/6/ad/779f8620ff49f701cd4c58f6448b6jpeg.jpeg?imageView2/1/w/180/h/180"],

  33. "infos": ["该商家支持发票,请下单写好发票抬头", "品类:其他菜系,包子粥店", "北京市昌平区回龙观西大街龙观置业大厦底商B座102单元1340", "营业时间:10:00-20:30"]

  34. }

  35. }

2.修改webpack-dev-conf.js

最新的vue没有dev-server.js文件,如何进行后台数据模拟?

 
  1. //第一步

  2. const express = require('express')

  3. const app = express()//请求server

  4. var appData = require('../data.json')//加载本地数据文件

  5. var seller = appData.seller //获取对应的本地数据

  6. var goods = appData.goods

  7. var ratings = appData.ratings

  8. var apiRoutes = express.Router()

  9. app.use('/api', apiRoutes)//通过路由请求数据

  10.  
  11. //第二步

  12. before(app) {

  13. app.get('/api/seller', (req, res) => {

  14. res.json({

  15. // 这里是你的json内容

  16. errno: 0,

  17. data: seller

  18. })

  19. }),

  20. app.post('/api/seller', (req, res) => {

  21. res.json({

  22. // 这里是你的json内容

  23. errno: 0,

  24. data: seller

  25. })

  26. })

  27. }

3.axios.vue

 
  1. <template>

  2. <div>

  3. <h1>axios基础介绍</h1>

  4. <button @click="get">get请求</button>

  5. <button @click="post">post请求</button>

  6. <button @click="http">aixos</button>

  7. <p>{{msg}}</p>

  8. </div>

  9. </template>

  10.  
  11. <script>

  12. import axios from 'axios'

  13. export default {

  14. data () {

  15. return {

  16. msg:'',

  17. }

  18. },

  19. created(){

  20. //全局拦截器

  21. axios.interceptors.request.use(function (config) {

  22. // 在发送请求之前做些什么

  23. console.log('config')

  24. console.log(config)

  25. return config;

  26. }, function (error) {

  27. // 对请求错误做些什么

  28. return Promise.reject(error);

  29. });

  30. },

  31. methods: {

  32. get(){

  33. //1.简单的获取

  34. // axios.get("/api/seller").then(res =>{

  35. // this.msg = res;

  36. // })

  37. //2.传参数

  38. axios.get("/api/seller",{

  39. //传参数

  40. params:{userid:"999"},

  41. //请求头部

  42. headers:{

  43. token:"jack"

  44. }

  45. }).then(res =>{

  46. this.msg = res;

  47. }).catch(function(error){

  48. //获取错误

  49. console.log("error:"+error)

  50. })

  51. },

  52. post(){

  53. axios.post("/api/seller",{

  54. //传参数

  55. userid:"888"

  56. },{

  57. headers:{//请求头部

  58. token:"tom"

  59. }

  60. }).then(res =>{

  61. this.msg = res;

  62. }).catch(function(error){

  63. //获取错误

  64. console.log("error:"+error)

  65. })

  66. },

  67. http(){

  68. //注意:get 传参是params post传参是data

  69. axios({

  70. url:"/api/seller",

  71. methods:"get",

  72. params:{

  73. userid:"101"

  74. },

  75. headers:{

  76. token:"http-test"

  77. }

  78. }).then(res =>{

  79. this.msg = res;

  80. })

  81. }

  82.  
  83. }

  84. }

  85. </script>

  86.  
  87. <style lang="scss">

  88. </style>

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值