盒子
盒子

模拟后台接口

本文章参照于Android开发者如何模拟接口获得自己想要的数据进行测试?

由于基本上都是自己一个人做项目,常常前后端两端包,刚开始感觉没什么,在学Android的过程中又能学习后台,但到后期便发现里不重新或则说写来写去都是哪些简单的接口毫无意义,所以想在网上找一个可以模拟后台接口的测试方法,果然被我找到了

本文章是根据简书博主Yinll的文章Android开发者如何模拟接口获得自己想要的数据进行测试内容写的,相当于做一下笔记吧

操作需要以下几部:

  • 安装Node
  • Node

    在cmd输入node -v会显示版本号则说明安装成功

  • 安装npm
  • 1
    npm install -g npm

    同样在cmd输入npm -v会显示版本号则说明安装成功

  • 安装express
  • 1
    npm install -g express-generator

  • 选择目标文件夹生成yinl文件夹
  • 切换所在目录到你想要将yinl文件夹生成的目录下,例如我想将其放在D:\BackTest,则:

    1
    cd D:\BackTest

    然后输入命令:

    1
    express --view=pug yinl

  • 按照cmd提示完成最后操作
  • 此时cmd界面会有提示步骤,照着它做:

    1
    cd yiml

    再:

    1
    npm install

    启动

    要切换到yiml目录(切记),输入:

    1
    npm start

    使用

    此时在浏览器中输入:

    1
    localhost/3000

    若出现 Welcome to Express则说明成功

    在浏览器输入

    1
    localhost/3000/users

    会发现出现:respond with a resource

    去yiml文件夹的routes文件夹,找到users.js文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var express = require('express');
    var router = express.Router();

    /* GET users listing. */
    router.get('/', function(req, res, next) {
    res.send('respond with a resource');
    });

    module.exports = router;

    res.send(‘respond with a resource’)即决定了刚刚网页出现的数据

    故可以输出json串:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    var express = require('express');
    var router = express.Router();
    //增加data json串
    var data = {
        'code':'200',
        'message':'数据获取成功',
        'lists':[
            {
              'name':'YinL',
                'age': '23',
                'sex':'男'
            },{
              'name':'yinl',
                'age': '20',
                'sex':'女'
            }
        ]
    }
    router.get('/', function(req, res, next) {
    //替换成data
    res.send(data);
    });
    module.exports = router;

    只要Android端请求[本机ip]/users就可获取该json串从而实现模拟后台接口拿数据的功能

    可进一步优化:

  • 创建api文件
  • 在yile目录新建config文件夹并创建api.js文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    var fs = require('fs');
    /**
    * 检查请求的路径是否存在
    * @param apiName 请求路径
    * @param method  请求方式
    * @param params  请求参数
    * @param res 返回请求
    */
    function getDataFromPath (apiName,method,params,res){
        if(apiName){
            fs.access(
                // 提取请求路径中的js文件
                apiName.substring(1)+'.js',
                // 回调函数,检查请求的路径是否有效失败返回一个错误参数
                function(err){
                    if(!err){
                        // 每次请求都清除模块缓存重新请求
                        delete require.cache[require.resolve('..'+apiName)];
                        try{
                            addApiResult(res,require('..'+apiName).getData(method,params));
                        }catch(e){
                            console.error(e.stack);
                            res.status(500).send(apiName+' has an error,please check the code.');
                        }
                    }else{
                        addApiResult(res);
                    }
                }
            );
        }else{
            addApiResult(res);
        }
    };
    /**
    *  响应头
    * @param res
    */
    function addApiHead(res){
        res.setHeader('Content-Type', 'application/json;charset=utf-8');
        // 跨域
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
        res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
        // 控制http缓存
        res.header("Cache-Control", "no-cache, no-store, must-revalidate");
        res.header("Pragma", "no-cache");
        res.header("Expires", 0);
    }
    /**
    * 返回参数,如无返回参数返回404
    * @param res
    * @param result
    */
    function addApiResult(res,result){
        if(result){
            res.send(result);
        }else{
            res.status(404).send();
        }
    }
    /*请求方式*/
    // get
    exports.get = function(req, res){
        addApiHead(res);
        getDataFromPath(req.path,'GET',req.query,res);
    };
    // post
    exports.post = function(req, res){
        addApiHead(res);
        getDataFromPath(req.path,'POST',req.body,res);
    };

  • 修改app.js文件
  • 修改后文件源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    var createError = require('http-errors');
    var express = require('express');
    var path = require('path');
    var cookieParser = require('cookie-parser');
    var logger = require('morgan');

    var indexRouter = require('./routes/index');
    var usersRouter = require('./routes/users');

    var app = express();

    var api = require('./config/api');

    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'pug');

    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));

    /*配置请求*/

    app.get('/',function(req, res){

    res.send('hello world');});

    app.get('/api/*', api.get);

    app.post('/api/*', api.post);

    module.exports = app;

  • 创建api目录
  • 该目录里面存放接口文件

    比如我要模拟一个获取课程表的接口,则新建一个getSchedule的js文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    exports.getData = function(method,data){
        var backData={
    "success":'true',
            "code":'000',
            "message":"",
    "data":{
    "total":'2',
    "users":[
    {
                'name':'YinL',
                'age': '23',
                'sex':'男'
    },
        {
                'name':'yinl',
                'age': '22',
                'sex':'女'
    }
    ]}
        }
        return JSON.stringify(backData);
    }

    结束按下Ctrl+C

    若遇到一些错误,一般又两种解决办法:

    1. 文件配置错写错了,认真与原文章比对,再做修改

    2. 输入以下指令:

    1
    npm install serve-favicon --save

    还是不行可尝试删除yiml目录,从选择目标文件夹生成yinl文件夹那一步重新走一遍

    再次感谢这篇文章Android开发者如何模拟接口获得自己想要的数据进行测试?

    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫