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

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

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

首先我们需要先搭建好环境:先把node.js下载

Node.js安装包及源码下载地址为:https://nodejs.org/en/download/。大家根据自己的系统选择下载就行

Node.js下载界面

下载后安装,安装过程非常简单,直接下一步,在第五步时选择第三个选项即可,

大家也可以按照这个Node.js安装教程过程来,安装完成后,我们来到cmd命令行工具中,进入安装目录下(直接打开安装的文件路径,然后在地址栏输入cmd就直接进入了当前目录下)

node安装目录

如上两图所示:第一个为node安装目录,找到后再上方地址栏中输入cmd(如第二图)然后回车,就会进入dos命令窗口,并且在node安装路径下。

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

然后我们全局安装npm: dos窗口中输入  npm install -g npm  回车

成功安装图

然后在输入 npm install -g cnpm  回车

成功安装图

成功安装后再安装  express 应用程序生成器

dos窗口中 输入npm install -g express-generator  回车

成功安装后截图

接下来就是重点了:这一步我们会安装一个express应用程序,你可以先选好安装在什么位置,取什么名字

比如我这里安装在D盘node文件夹下的express文件夹中,取名为yinl。那么首先我们需要在dos中进入D:\node\express目录

到这个目录后我们输入命令:express --view=pug yinl 回车,等待成功后,在dos窗口中会看到如下输出信息


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

我们切换到dos窗口,你会看到下方提示我们安装东西,我们按照提示安装即可

先在dos窗口中输入cd yinl  回车

然后 输入 npm install 回车

然后就可以启动项目了:输入 npm start  回车

启动

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

看到这个就证明你成功啦!开不开心!哈哈,别着急,我们还有事情需要做。

打开yinl项目,你看到的目录如下图所示:

yinl项目原始目录

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

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

routes/users.js文件

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

修改

var express = require('express');

var router = express.Router();

//新增数据

var data = {

    'code':'200',

    'message':'数据获取成功',

    'lists':[

        {

          'name':'YinL',

            'age': '23',

            'sex':'男'

        },{

          'name':'yinl',

            'age': '20',

            'sex':'女'

        }

    ]

}

/* GET users listing. */

router.get('/', function(req, res, next) {

  res.send(data);  //修改

});

module.exports = router;

改后之后,因为有缓存的原因,我们需要重新启动node(dos进入项目根目录下,重新运行npm start),然后打开

成功获取数据

到这里就算基本完成啦,但是就这样的话,你会发现每次都要来修改这个文件,修改后都需要重新启动,非常的不方便。接下来我们就来继续改进。在项目下新建一个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(

            // 提取请求路径中的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文件,在上面引入刚刚新建的文件api.js

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

并替换配置

/*配置请求*/

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

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

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

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

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

原始app.js文件内容


修改后app.js 文件内容

然后我们在根目录新建api文件夹,在其中新建test.js;

test.js文件中写上你想要的数据即可。

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);

}

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

这是因为没有安装这个依赖,我们安装就好了: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://192.168.x.xxx:3000/api/test  (把这个ip地址换成你本机的)

  下方为我在android studio测试的数据返回(这是新写的请求框架,有想要的小伙伴嘛?)

可以看到我这里成功的通过android studio访问到我自定义的数据啦,这个log显示的信息也一目了然,新写的这个Rxjava + Retrofit + okhttp 网络请求框架有想要的小伙伴请留言哦,后续我也可能会写对应的博客的!

希望这篇文章能够给大家带来帮助,有啥问题欢迎留言!感谢大家的阅读!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容