最近自己寫了一個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目錄下,然后打開:
我們可以在routes/users.js
文件中自定自己想要得到的返回數(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
),然后打開
三、優(yōu)化項目
到這里就算基本完成啦,但是就這樣的話,你會發(fā)現(xiàn)每次都要來修改這個文件,修改后都需要重新啟動,非常的不方便。接下來我們就來繼續(xù)改進。
1、在項目下新建一個config
文件夾并新建一個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;
這里完成后,你就可以重新運行npm start,如果這個時候能成功運行,在瀏覽器打開http://localhost:3000/api/test,你就會看到返回的json。如果出現(xiàn)錯誤,根據(jù)提示進行解決,
一般是未安裝依賴:
npm install serve-favicon --save
這個時候我們在啟動項目 npm start
我們看到成功啟動了,如果出現(xiàn)了錯誤的話,大家對應(yīng)解決然后在啟動就好。在瀏覽器打開http://localhost:3000/api/test,會看到成功的出來數(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