美文网首页
服务器接口本地模拟-开发数据调试[Mac]

服务器接口本地模拟-开发数据调试[Mac]

作者: 玉圣 | 来源:发表于2021-10-19 15:23 被阅读0次

    最近自己写了一个Rxjava + Retrofit + okhttp网络请求框架,想测试一下效果,但是却没有接口来提供给自己测试。这下就尴尬了,虽然可以自己去写一个后台,但是这样做起来未免太麻烦,费时费力。我是拒绝这么做的,大家应该也是拒绝的吧!那有什么方便快捷的方法来获得我们想要的返回数据呢?最好是还能有一个网络请求的过程。接下来我们就来看看如何使用node.js来快速搭建自己想要的测试数据。

    不知道或者想了解node.js的小伙伴麻烦自行百度一下哈。

    一、搭建环境

    1、安装nodejs

    首先我们需要先搭建好环境:使用brew 进行安装nodejs,具体教程 百度

    此处安装省略一万字......

    为了检查node是否安装成功,我们可以在命令行中输入如下命令,查看版本号,如果能成功查看表明安装成功。
    node -v

    2、安装npm

    然后我们全局安装npm:命令行窗口中输入
    npm install -g npm

    3、安装express

    成功安装后再安装 express 应用程序生成器
    命令行窗口中输入如下命令
    npm install -g express-generator

    二、搭建项目

    1、安装一个express应用程序,你可以先选好安装在什么位置,取什么名字。
    比如我这里新建的nodeApi文件夹下的express文件夹中,取名为servers

    项目目录

    2、在命令行中进入express目录
    输入如下命令,等待成功后,在dos窗口中会看到如下输出信息
    express --view=pug qxb

    这时候我们看文件夹,你会看到你选择的安装目录下多了个servers文件

    输出信息

    3、根据命令行的提示,进行命令行安装,我们按照提示安装即可


    安装

    4、然后就可以启动项目了:输入:
    npm start

    这个时候你就可以在浏览器中输入如下命令,见证神奇的时候到了
    localhost:3000

    输入信息

    看到这个就证明你成功啦!

    这个时候,浏览器打开localhost:3000/users,可以看到页面显示
    respond with a resource

    我们好奇找到users文件,在routes目录下,然后打开:


    users

    我们可以在routes/users.js文件中自定自己想要得到的返回数据

    json数据
    exports.getData = function(method,data){
        var backData={
            "success":'true',
            "code":'000',
            "message":"",
            "data":{
                "total":'2',
                "users":[
                    {
                        'name':'YinL',
                        'age': '23',
                        'sex':'男'
                    },
                    {
                        'name':'yinl',
                        'age': '20',
                        'sex':'女'
                    }
                    ]
            }
        }
        return JSON.stringify(backData);
    }
    

    改后之后,因为有缓存的原因,我们需要重新启动node(命令行进入项目根目录【如:../express/servers】下,重新运行npm start),然后打开

    成功获取数据

    三、优化项目

    到这里就算基本完成啦,但是就这样的话,你会发现每次都要来修改这个文件,修改后都需要重新启动,非常的不方便。接下来我们就来继续改进。

    1、在项目下新建一个config文件夹并新建一个api.js,配置一下:

    api.js
    var fs = require('fs');
    
    /**
     * 检查请求的路径是否存在
     * @param apiName 请求路径
     * @param method  请求方式
     * @param params  请求参数
     * @param res 返回请求
     */
    function getDataFromPath (apiName,method,params,res){
        if(apiName){
            fs.access(
                apiName.substring(1)+'.js',  // 提取请求路径中的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);
    };
    

    2、然后打开根目录下app.js文件,在上面引入刚刚新建的文件api.js

    //引入API
    var api = require('./config/api');
    

    并替换配置

    /*配置请求*/
    app.get('/',function(req, res){
      res.send('hello world');
    });
    app.get('/api/*', api.get);
    app.post('/api/*', api.post);
    

    下方分别为修改之前和修改之后的内容

    修改之前的内容

    //***********************************修改之前的内容:
    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();
    
    // 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.use('/', indexRouter);
    app.use('/users', usersRouter);
    
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      next(createError(404));
    });
    
    // error handler
    app.use(function(err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    

    修改之后的内容

    //***********************************修改之后的内容:
    var createError = require('http-errors');
    var express = require('express');
    var path = require('path');
    var cookieParser = require('cookie-parser');
    var logger = require('Morgan');
    var bodyParser = require('body-parser');
    
    var app = express();
    //引入API
    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(bodyParser.json());
    app.use(bodyParser.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文件夹,在其中新建test.js;


    test.js

    这里完成后,你就可以重新运行npm start,如果这个时候能成功运行,在浏览器打开http://localhost:3000/api/test,你就会看到返回的json。如果出现错误,根据提示进行解决,

    windows提示错误

    一般是未安装依赖:
    npm install serve-favicon --save

    这个时候我们在启动项目 npm start
    我们看到成功启动了,如果出现了错误的话,大家对应解决然后在启动就好。在浏览器打开http://localhost:3000/api/test,会看到成功的出来数据啦!哦也!

    数据

    这个时候,你想添加其他数据,只需要在api目录下去新建其他.js文件就可以啦!添加后可以直接访问的哦。

    如果你想完全模仿线上的接口,你只需要一层层的建立文件夹就ok啦!假如线上接口是 https://www.yinl.com/mydata/school/data,我们在api文件夹按照路径新建文件夹和文件即可:api-->mydata-->school-->data.js

    注意:如果你想用android studio来测试下数据,你只需要把localhost替换成你本机电脑的ip就ok啦,例如:
    http://x.x.x.x:3000/api/test (把这个ip地址换成你本机的)
    如:http://10.6.18.156:3000/api/test

    参考:
    Android开发者如何模拟接口获得自己想要的数据进行测试?

    相关文章

      网友评论

          本文标题:服务器接口本地模拟-开发数据调试[Mac]

          本文链接:https://www.haomeiwen.com/subject/wyawbltx.html