当前位置:   article > 正文

Vue中axios使用详解_$.ajax 使用axios 写

$.ajax 使用axios 写

一:axios定义

axios是什么axios它是基于promise的http库,可运行在浏览器端和node.js中,然后作者尤雨溪也是果断放弃了对其官方库vue-resource的维护,直接推荐axios库

axios的作用:axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能。

具备以下特征:

     a.从浏览器中创建 XMLHttpRequest
     b.从 node.js 发出 http 请求
     c.支持 Promise API
     e.拦截请求和响应
     f.转换请求和响应数据
     g.取消请求
     h.自动转换JSON数据
     i.客户端支持防止 CSRF/XSRF
Promise是什么:Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promise。

是一个对象用来传递异步操作的信息,它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的api,可供进一步的处理。

promise的作用:Promise的出现主要是解决地狱回调的问题,比如你需要结果需要请求很多个接口,这些接口的参数需要另外那个的接口返回的数据作为依赖,这样就需要我们一层嵌套一层,但是有了Promise 我们就无需嵌套。

promise的本质是什么:分离异步数据获取和业务

1、 安装axios:npm install axios

2、 在App.vue中引入axios:import axios from 'axios'

Vue.use(axios) // 注意 这样的用法是错误的,axios不支持Vue.use()的声明方式

但如果将 axios 改写为 Vue 的原型属性,就能解决这个问题

Vue.prototype.$ajax = axios

在 main.js 中添加了这两行代码之后,就能直接在组件的 methods 中使用 $ajax 命令;

如果不加 Vue.prototype.$ajax = axios这句的话,则直接使用axios.get()

使用get请求数据

  1. // 向具有指定ID的用户发出请求
  2. axios.get('/user?ID=12345')
  3. .then(function (response) {
  4. console.log(response);
  5. })
  6. .catch(function (error) {
  7. console.log(error);
  8. });
  9. // 也可以通过 params 对象传递参数
  10. axios.get('/user', {
  11. params: {
  12. ID: 12345
  13. }
  14. })
  15. .then(function (response) {
  16. console.log(response);
  17. })
  18. .catch(function (error) {
  19. console.log(error);
  20. });

 这是axios的回调函数,.then为请求成功的回调函数,而.catch为请求失败的回调函数。

这两个回调函数都有各自独立的作用域,如果直接在里面访问 this,无法访问到 Vue 实例,怎么办?

只要添加一个 .bind(this) 就能解决这个问题

  1. then(function(res){
  2. console.log(this.data)
  3. }.bind(this))

执行 POST 请求

  1. axios.post('/user', {
  2. firstName: 'Fred',
  3. lastName: 'Flintstone'
  4. })
  5. .then(function (response) {
  6. console.log(response);
  7. })
  8. .catch(function (error) {
  9. console.log(error);
  10. });

执行多个并发请求

  1. function getUserAccount() {
  2. return axios.get('/user/12345');
  3. }
  4. function getUserPermissions() {
  5. return axios.get('/user/12345/permissions');
  6. }
  7. axios.all([getUserAccount(), getUserPermissions()])
  8. .then(axios.spread(function (acct, perms) {
  9. //两个请求现已完成
  10. }));

执行delete删除数据

  1. axios.delete(`/user/${id}`)
  2. .then(res=>(this.todos=this.todos.filter(todo=>todo.id!==id)))
  3. .catch(err=>console.log(err));

二、vue cli脚手架前端调后端数据接口时候的本地代理跨域。 

如我在本地localhost访问接口http://40.00.100.100:3002/是要跨域的,相当于浏览器设置了一到门槛,会报错XMLHTTPRequest can not load http://40.00.100.100:3002/. Response to preflight request doesn’t pass access control…. 在webpack配置一下proxyTable就OK了,如下
config/index.js

  1. dev: {
  2. 加入以下
  3. proxyTable: {
  4. '/api': {
  5. target: 'http://40.00.100.100:3002/',//设置你调用的接口域名和端口号 别忘了加http
  6. changeOrigin: true,
  7. pathRewrite: {
  8. '^/api': '/'//这里理解成用‘/api’代替target里面的地址,后面组件中我们掉接口时直接用api代替 比如我要调用'http://40.00.100.100:3002/user/add',直接写‘/api/user/add’即可
  9. }
  10. }
  11. },

 

试一下,跨域成功了,但是注意了,这只是开发环境(dev)中解决了跨域问题,生产环境中真正部署到服务器上如果是非同源还是存在跨域问题,如我们部署的服务器端口是3001,需要前后端联调,第一步前端我们可以分生产production和开发development两种环境分别测试,在config/dev.env.js和prod.env.js里也就是开发/生产环境下分别配置一下请求的地址API_HOST,开发环境中我们用上面配置的代理地址api,生产环境下用正常的接口地址,所以这样配置

  1. module.exports = merge(prodEnv, {
  2. NODE_ENV: '"development"',//开发环境
  3. API_HOST:"/api/"
  4. })
  5. module.exports = {
  6. NODE_ENV: '"production"',//生产环境
  7. API_HOST:'"http://40.00.100.100:3002/"'
  8. }

当然不管是开发还是生产环境都可以直接请求http://40.00.100.100:3002/。配置好之后测试时程序会自动判断当前是开发还是生产环境,然后自动匹配API_HOST,我们在任何组件里都能用process.env.API_HOST来使用地址如

instance.post(process.env.API_HOST+'user/login', this.form)

 

然后第二步后端服务器配置一下cros跨域即可,就是access-control-allow-origin:*允许所有访问的意思。

综上:开发的环境下我们前端可以自己配置个proxy代理就能跨域了,真正的生产环境下还需要后端的配合的。某大神说:此方法ie9及以下不好使,如果需要兼容,最好的办法是后端在服务器端口加个代理,效果类似开发时webpack的代理。

三、拦截器

在请求或响应被 then 或 catch 处理前拦截它们(拦截器可以做什么:在请求或者响应时拦截下来进行处理)

拦截器分为请求拦截器和响应拦截器

请求拦截器(interceptors.requst)是指可以拦截每次或指定HTTP请求,并可修改配置项。

响应拦截器(interceptors.response)可以在每次HTTP请求后拦截住每次或指定HTTP请求,并可修改返回结果项。

拦截器的工作流程:

  1. /添加请求拦截器
  2. axios.interceptors.request.usefunction(config){
  3. //在发送请求之前做某事
  4. return config;
  5. },functionerror){
  6. //请求错误时做些事
  7. return Promise.reject(error);
  8. });
  9. //添加响应拦截器
  10. axios.interceptors.response.usefunction(response){
  11. //对响应数据做些事
  12. return response;
  13. },functionerror){
  14. //请求错误时做些事
  15. return Promise.reject(error);
  16. });

删除拦截器

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

将拦截器添加到axios的自定义实例

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

四、消除

您可以使用取消令牌取消请求。axios cancel token API基于可取消的promise提议,目前处于阶段1。

您可以使用CancelToken.source工厂创建一个取消令牌,如下所示:

  1. var CancelToken = axios.CancelToken;
  2. var source = CancelToken.source();
  3. axios.get('/user/12345', {
  4. cancelToken: source.token
  5. }).catch(function(thrown) {
  6. if (axios.isCancel(thrown)) {
  7. console.log('Request canceled', thrown.message);
  8. } else {
  9. // 处理错误
  10. }
  11. });
  12. //取消请求(消息参数是可选的)
  13. source.cancel'操作被用户取消。');

您还可以通过将执行器函数传递给CancelToken构造函数来创建取消令牌:

  1. var CancelToken = axios.CancelToken;
  2. var cancel;
  3. axios.get'/ user / 12345',{
  4. cancelToken:new CancelToken(function executor(c){
  5. //一个执行器函数接收一个取消函数作为参数
  6. cancel = c;
  7. })
  8. });
  9. // 取消请求
  10. clear();

五、处理错误

  1. axios.get'/ user / 12345'
  2. .catch(functionerror){
  3. iferror.response){
  4. //请求已发出,但服务器使用状态代码进行响应
  5. //落在2xx的范围之外
  6. console.log(error.response.data);
  7. console.log(error.response.status);
  8. console.log(error.response.headers);
  9. } else {
  10. //在设置触发错误的请求时发生了错误
  11. console.log('Error'error.message);
  12. }}
  13. console.log(error.config);
  14. });

您可以使用validateStatus配置选项定义自定义HTTP状态码错误范围。

  1. axios.get'/ user / 12345',{
  2. validateStatus:functionstatus){
  3. return status < 500; //仅当状态代码大于或等于500时拒绝
  4. }}
  5. })

六、使用application / x-www-form-urlencoded格式

默认情况下,axios将JavaScript对象序列化为JSON。 要以应用程序/ x-www-form-urlencoded格式发送数据,您可以使用以下选项之一。

浏览器

在浏览器中,您可以使用URLSearchParams API,如下所示:

  1. var params = new URLSearchParams();
  2. params.append('param1', 'value1');
  3. params.append('param2', 'value2');
  4. axios.post('/foo', params);
  5. //请注意,所有浏览器都不支持URLSearchParams,但是有一个polyfill可用(确保polyfill全局环境)。

或者,您可以使用qs库对数据进行编码:

  1. var qs = require('qs');
  2. axios.post('/foo', qs.stringify({ 'bar': 123 });

Node.js

在node.js中,可以使用querystring模块,如下所示:

  1. var querystring = require('querystring');
  2. axios.post('http://something.com/', querystring.stringify({ foo: 'bar' });

TypeScript

axios包括TypeScript定义。

  1. import axios from 'axios';
  2. axios.get('/user?ID=12345');

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/578762
推荐阅读
  

闽ICP备14008679号