Mockjs请求及Url取参

4 篇文章 1 订阅
1 篇文章 1 订阅

用Mockjs实现模拟分页数据,获取列表的接口一般是后台需要接收页码以及每页条数,接着后台会返回总条数之类的信息。

学习mockjs以后觉得get请求十分麻烦,首先是需要处理接口地址由于携带参数而无法与后台匹配的问题,然后是mockjs没有内置的从url取参的方法,而是要自己通过对url不断地判断、截取、以及和参数名进行匹配才能取出参数,而post请求取参就相对很容易。

get请求:

组件内发送get请求获取后台返回的数据,向后台传了页码和每页条数:

//组件内 
getList () {
      axios.get('/api/get/list',{
        params: {
          pageindex: this.pageindex,
          pagesize: 10
        }
      }).then(res=>{
        this.list = res.data.list
        this.pageMax = res.data.totalPage
      }).catch(err=>{
        console.log('err',err)
      })
    }

解决携带参数的接口地址与后台定义无法匹配的问题:

//mockjs

//url为:/api/get/list?pageindex=1&pagesie=10
//无法与/api/get/list匹配,因此要用到正则
Mock.mock(/\/api\/get\/list/,'get',(options)=>{
    console.log(options)   //业务代码省略
})

定义方法解决mockjs无内置url取参的问题:

// 根据url获取query参数
  const getQuery = (url,name)=>{
      console.log(url);    //  /api/get/news?pageindex=1&pagesize=10
    const index = url.indexOf('?')
      console.log(index);  //13
    if(index !== -1) {
      const queryStrArr = url.substr(index+1).split('&')
      console.log(queryStrArr);   //['pageindex=1', 'pagesize=10']
                                  //0: "pageindex=1"
                                  //1: "pagesize=10"
      for(var i=0;i<queryStrArr.length;i++) {
        const itemArr = queryStrArr[i].split('=')
        console.log(itemArr)  //['pageindex', '1']    //['pagesize', '10']
                              //0: "pageindex"        //0: "pagesize"
                              //1: "1"                //1: "10"
        
        if(itemArr[0] === name) {
           return itemArr[1]
        }
      }
    }
    return null
  }

首先定义index为url中?的索引,可以看到输出为13

然后判断是否存在参数也就是index是否存在,如果存在就定义queryStrArr,通过&字符来分割?后携带的参数,得到一个数组里面的两个字符串

通过循环遍历,定义itemArr,通过=号进行分割,将内容分割成字符串数组

最后通过itemArr[0]与name进行匹配,返回itemArr[1]的值,也就是对应的参数

下面我们来看一下(已删除部分业务代码):

 Mock.mock(/\/api\/get\/list/,'get',(options)=>{
    // 获取传递的参数pageindex
    const pageindex = getQuery(options.url,'pageindex')
    // 获取传递的参数pagesize
    const pagesize = getQuery(options.url,'pagesize')
    return {
      status: 200,
      message: '获取数据列表成功',
      list: list,
      total:List.length,
      totalPage:totalPage
    }
  })

重点看看getQuery这个方法,传入url与name最终匹配则得到参数

POST请求

比如定义一个添加数据的接口,传入标题和内容,对于post请求mockjs接收很容易

//mockjs

Mock.mock('/api/add/list','post',(options)=>{
  const body = JSON.parse(options.body)
  List.push(Mock.mock({
    "title": body.title,
    "content": body.content,
  })) 
  return {
    status: 200,
    message: '添加成功',
  }
})

总的来说Mockjs真的是解决很多的前后台并行开发的痛点,值得大家花时间学习!

创作不易,能看到这儿的请支持一下谢谢大家

 

  • 20
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
Mock.js 可以通过拦截 Ajax 请求来实现生成随机数据并返回的功能,它使用了 XMLHttpRequest 对象的原型链来实现拦截。Mock.js 会重写 XMLHttpRequest 对象的 open() 和 send() 方法,当调用 open() 方法时,Mock.js 会检查 URL 是否符合 Mock.js 的规则,如果符合规则,则会拦截请求并返回 Mock.js 生成的随机数据,否则会继续发起原始的 Ajax 请求。当调用 send() 方法时,Mock.js 会将请求数据传递给 Mock.js 的解析器,并根据数据模板生成随机数据。 具体来说,Mock.js 会通过 XMLHttpRequest 的原型链来重写 open() 和 send() 方法,代码如下: ```javascript // 保存原始的 XMLHttpRequest 对象 var _XMLHttpRequest = window.XMLHttpRequest; // 重写 XMLHttpRequest 对象 window.XMLHttpRequest = function() { // 创建原始的 XMLHttpRequest 对象 var xhr = new _XMLHttpRequest(); // 重写 open() 方法 xhr.open = function() { // 检查 URL 是否符合 Mock.js 的规则 if (/* URL 符合规则 */) { // 拦截请求并返回 Mock.js 生成的随机数据 this.responseText = /* Mock.js 生成的随机数据 */; } else { // 继续发起原始的 Ajax 请求 _XMLHttpRequest.prototype.open.apply(this, arguments); } }; // 重写 send() 方法 xhr.send = function(data) { // 将请求数据传递给 Mock.js 的解析器,并根据数据模板生成随机数据 this.responseText = /* Mock.js 生成的随机数据 */; }; // 返回重写后的 XMLHttpRequest 对象 return xhr; }; ``` 这样,Mock.js 就可以拦截 Ajax 请求并生成随机数据了。需要注意的是,Mock.js 会影响全局的 XMLHttpRequest 对象,因此在使用 Mock.js 时需要谨慎处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beannnnnnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值