服務(wù)器接口本地模擬-開發(fā)數(shù)據(jù)調(diào)試[Mac]

最近自己寫了一個Rxjava + Retrofit + okhttp網(wǎng)絡(luò)請求框架,想測試一下效果,但是卻沒有接口來提供給自己測試。這下就尷尬了,雖然可以自己去寫一個后臺,但是這樣做起來未免太麻煩,費時費力。我是拒絕這么做的,大家應(yīng)該也是拒絕的吧!那有什么方便快捷的方法來獲得我們想要的返回數(shù)據(jù)呢?最好是還能有一個網(wǎng)絡(luò)請求的過程。接下來我們就來看看如何使用node.js來快速搭建自己想要的測試數(shù)據(jù)。

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

一、搭建環(huán)境

1、安裝nodejs

首先我們需要先搭建好環(huán)境:使用brew 進行安裝nodejs,具體教程 百度

此處安裝省略一萬字......

為了檢查node是否安裝成功,我們可以在命令行中輸入如下命令,查看版本號,如果能成功查看表明安裝成功。
node -v

2、安裝npm

然后我們?nèi)职惭bnpm:命令行窗口中輸入
npm install -g npm

3、安裝express

成功安裝后再安裝 express 應(yīng)用程序生成器
命令行窗口中輸入如下命令
npm install -g express-generator

二、搭建項目

1、安裝一個express應(yīng)用程序,你可以先選好安裝在什么位置,取什么名字。
比如我這里新建的nodeApi文件夾下的express文件夾中,取名為servers

項目目錄

2、在命令行中進入express目錄
輸入如下命令,等待成功后,在dos窗口中會看到如下輸出信息
express --view=pug qxb

這時候我們看文件夾,你會看到你選擇的安裝目錄下多了個servers文件

輸出信息

3、根據(jù)命令行的提示,進行命令行安裝,我們按照提示安裝即可


安裝

4、然后就可以啟動項目了:輸入:
npm start

這個時候你就可以在瀏覽器中輸入如下命令,見證神奇的時候到了
localhost:3000

輸入信息

看到這個就證明你成功啦!

這個時候,瀏覽器打開localhost:3000/users,可以看到頁面顯示
respond with a resource

我們好奇找到users文件,在routes目錄下,然后打開:


users

我們可以在routes/users.js文件中自定自己想要得到的返回數(shù)據(jù)

json數(shù)據(jù)

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),然后打開

成功獲取數(shù)據(jù)

三、優(yōu)化項目

到這里就算基本完成啦,但是就這樣的話,你會發(fā)現(xiàn)每次都要來修改這個文件,修改后都需要重新啟動,非常的不方便。接下來我們就來繼續(xù)改進。

1、在項目下新建一個config文件夾并新建一個api.js,配置一下:

api.js
var fs = require('fs');

/**
 * 檢查請求的路徑是否存在
 * @param apiName 請求路徑
 * @param method  請求方式
 * @param params  請求參數(shù)
 * @param res 返回請求
 */
function getDataFromPath (apiName,method,params,res){
    if(apiName){
        fs.access(
            apiName.substring(1)+'.js',  // 提取請求路徑中的js文件
            function(err) {  // 回調(diào)函數(shù),檢查請求的路徑是否有效失敗返回一個錯誤參數(shù)
                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);
    }
};

/**
 *  響應(yīng)頭
 * @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);
}

/**
 * 返回參數(shù),如無返回參數(shù)返回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);

下方分別為修改之前和修改之后的內(nèi)容

修改之前的內(nèi)容

//***********************************修改之前的內(nèi)容:
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;

修改之后的內(nèi)容

//***********************************修改之后的內(nèi)容:
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。如果出現(xiàn)錯誤,根據(jù)提示進行解決,

windows提示錯誤

一般是未安裝依賴:
npm install serve-favicon --save

這個時候我們在啟動項目 npm start
我們看到成功啟動了,如果出現(xiàn)了錯誤的話,大家對應(yīng)解決然后在啟動就好。在瀏覽器打開http://localhost:3000/api/test,會看到成功的出來數(shù)據(jù)啦!哦也!

數(shù)據(jù)

這個時候,你想添加其他數(shù)據(jù),只需要在api目錄下去新建其他.js文件就可以啦!添加后可以直接訪問的哦。

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

注意:如果你想用android studio來測試下數(shù)據(jù),你只需要把localhost替換成你本機電腦的ip就ok啦,例如:
http://x.x.x.x:3000/api/test (把這個ip地址換成你本機的)
如:http://10.6.18.156:3000/api/test

參考:
Android開發(fā)者如何模擬接口獲得自己想要的數(shù)據(jù)進行測試?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,367評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,001評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,213評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,535評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,317評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,868評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,963評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,090評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,599評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,549評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,712評論 1 367
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,233評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,961評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,353評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,607評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,321評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,686評論 2 370

推薦閱讀更多精彩內(nèi)容