vue搭配axios踩坑

  客户端项目中有一个小需求“我的卡券”,有单独入口,所以综合考虑之后,采用了vue来实现,因为是初次使用,导致了选型不当,先用了SUI-Mobile来搭建页面,当决定使用vue的时候,页面也搭建完毕了,最终结果就是使用vue+SUI-Mobile+vue-router实现了这么一个小需求。

  中间考虑使用axios来作异步请求的,但是很不幸的是,在请求接口的时候axios报了404,由于有方便替代的Zepto封装的ajax,所以当时直接改用ajax来请求了,也没有去研究究竟什么原因导致的axios请求报错的。这段时间,相对不那么忙的时候,想到这个问题,就回过头来把这块的vue代码做了一个简单的review,修改了一些明显不那么合适的vuejs的代码,然后就将目标定在了异步请求上面。

  先看一下,正确的ajax代码,真实的接口就以变量interface替代:

    getData(){
        var _this = this;
        $.showIndicator();
        var ctx = GetQueryString("path");
        $.ajax({
            type: "post",
            url:ctx+interface,
            data:{"coupon_status":1},
            success:function(data){
                $.hideIndicator();
                if(data.ret_code==1){
                  //网络异常
                  $.alert('网络异常');
                }else{
                  _this.list = data.ticketlist;
                }
            }
        })
      }

  除了真实的接口,这就是之前使用的能够正常请求的ajax请求。

  下面改造为axios格式的 

    getData(){
        var _this = this;
        var ctx = GetQueryString("path");
        $.showIndicator();
        axios.post(ctx + interface, {"coupon_status":1}).then((res)=>{
          $.hideIndicator();
          if(data.ret_code==1){
                  //网络异常
                  $.alert('网络异常');
                }else{
                  _this.list = data.ticketlist;
                }
        }) 
      }

  一眼看过去,除了将ajax改为axios,我相信大多数人是看不出有什么问题的

但是事实就是:报错了,而且报404错误

不明原因的ctx获取的值出现了重复的educloud,而在ajax请求时却是正常的,导致了接口报404。

通过翻阅axios在GitHub网站api,引用原文You can specify config defaults that will be applied to every request.就是对每一个请求接口设定一些默认配置。

axios.defaults.baseURL = ctx;

  再请求一次接口

  

  不再报404错误了,而是400,那400是什么呢?

400错误是由于不正确的请求造成的,说明正在搜索的网页可能已经删除、更名或暂时不可用。 

  关键在于请求不正确,说明接口已经请求到了,但是当前请求接口有问题,然而ajax请求是正常的,那么问题又在什么地方呢?如果经验比较丰富一点的,很容易联想到是不是参数有问题?

  继续翻看api,发现

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

  这里对参数进行了一下处理,那么就照着来吧

    import axios from "axios"
    var ctx = GetQueryString("path");
    var qs = require('qs');
    axios.defaults.baseURL = ctx;
    getData(){
        var _this = this;
        $.showIndicator();
        axios.post(interface, qs.stringify({
          "coupon_status":0
        })).then(function (response) {
          console.log(response)
          var data = response.data;
          $.hideIndicator();
          if(data.ret_code==1){
            //网络异常
            $.alert('网络异常');
          }else{
            _this.list = data.ticketlist;
          }
        }).catch((err)=>{
          console.log(err)
        })

  很荣幸,问题解决了,接口已经可以正确返回数据了。

  总结一下:

  axios在调用接口产生问题时,一方面可能是因为接口url不对,那么通过配置默认的baseURL,另一方面,考虑post参数问题,不能直接传递一个JS对象,而需要通过qs.stringify(对象)转换一下。

  试图使用JSON.stringify()转换,很不幸,不可以。 

  

 

  

转载于:https://www.cnblogs.com/zhuhuoxingguang/p/8118301.html

### 如何在 Vue 项目中使用 Axios 实现 HTTP 请求 为了在 Vue 项目中集成 Axios 并实现 HTTP 请求功能,可以按照以下方法操作: #### 1. 安装 Axios 首先,在项目的根目录下通过 npm 或 yarn 安装 Axios 库。运行以下命令完成安装: ```bash npm install axios ``` 或者如果使用 Yarn,则运行: ```bash yarn add axios ``` 此步骤确保 Axios 成为项目的一部分[^1]。 #### 2. 配置 Axios 可以在 `main.js` 文件中全局引入 Axios,以便在整个应用程序中都可以轻松访问它。以下是配置示例代码: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import axios from 'axios'; const app = createApp(App); // 将 Axios 添加到 Vue 原型链上 app.config.globalProperties.$axios = axios; app.mount('#app'); ``` 这样设置后,任何组件都能通过 `this.$axios` 访问 Axios 实例。 #### 3. 创建服务实例 (可选) 对于更复杂的场景,建议创建一个独立的服务文件来封装 Axios 调用逻辑。例如,新建名为 `apiService.js` 的文件,并定义如下内容: ```javascript import axios from 'axios'; const apiClient = axios.create({ baseURL: 'https://jsonplaceholder.typicode.com', // 替换为目标 API 地址 timeout: 1000, }); export default apiClient; ``` 随后导入该模块至其他地方调用即可。 #### 4. 发起 GET 请求 下面展示了一个简单的例子,演示如何在一个 Vue 组件内部发起 GET 请求并处理响应数据: ```html <template> <div id="example"> <h1>Posts</h1> <ul v-if="posts.length > 0"> <li v-for="(post, index) in posts" :key="index">{{ post.title }}</li> </ul> <p v-else>Loading...</p> </div> </template> <script> export default { data() { return { posts: [], }; }, mounted() { this.fetchData(); }, methods: { fetchData() { this.$axios.get('/posts') // 如果采用单独 service 则替换为此处写法:apiClient.get('/posts') .then((response) => { console.log(response.data); this.posts = response.data.slice(0, 5); // 只取前五个作为样例 }) .catch((error) => { alert('Error fetching the posts!'); console.error(error); }); }, }, }; </script> ``` 上述模板展示了当页面加载时自动拉取远程资源的过程。 #### 5. 处理 POST 请求 除了读取数据外,还可以利用 Axios 向服务器提交新记录。这里给出一段关于新增文章的例子: ```javascript methods: { async submitForm(titleContent) { try { const result = await this.$axios.post('/posts', { title: titleContent }); this.posts.push(result.data); } catch (err) { console.error(err.message || err.toString()); } }, } ``` 这段脚本允许用户输入标题并通过表单触发保存动作。 --- ### 总结 以上介绍了从环境搭建、基础配置直到具体应用场景下的实践指南,涵盖了基本的 GET 和 POST 方法运用方式。希望这些信息能够帮助开发者快速掌握如何借助 Axios 提升前端与后台之间的互动效率[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值