NodeJS RESTful Api 架构

REST 即表述性状态传递(英文:Representational State Transfer,简称 REST)是 Roy Fielding 博士在2000年他的博士论文中提出来的一种软件架构风格。表述性状态转移 是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。需要注意的是,REST 是设计风格而不是标准。REST 通常基于使用 HTTPURI,和XML以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。REST通常使用JSON数据格式。

RESTful Web Services

Web service 是一个平台独立的,低耦合的,自包含的、基于可编程的 web 的应用程序,可使用开放的 XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

由于轻量级以及通过 HTTP 直接传输数据的特性,Web 服务的 RESTful 方法已经成为最常见的替代方法。可以使用各种语言(比如 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。

Demo

假如有如下数据 users.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"user1" : {
"name" : "mahesh",
"password" : "password1",
"profession" : "teacher",
"id": 1
},
"user2" : {
"name" : "suresh",
"password" : "password2",
"profession" : "librarian",
"id": 2
},
"user3" : {
"name" : "ramesh",
"password" : "password3",
"profession" : "clerk",
"id": 3
}
}

基于以上数据,我们创建以下 RESTful API

  • listUsers [GET] - (空) 显示所有用户列表
  • addUser [POST] - (JSON 字符串) 添加新用户
  • deleteUser [DELETE] - (JSON 字符串) 删除用户
  • id [GET] - (空) 显示用户详细信息

/listUsers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
console.log( data );
res.end( data );
});
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})

/addUser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//添加的新用户数据
var user = {
"user4" : {
"name" : "mohit",
"password" : "password4",
"profession" : "teacher",
"id": 4
}
}
app.get('/addUser', function (req, res) {
// 读取已存在的数据
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
data["user4"] = user["user4"];
console.log(data);
res.end(JSON.stringify(data));
});
})

/id

1
2
3
4
5
6
7
8
9
10
11
12
13
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/:id', function (req, res) {
// 首先我们读取已存在的用户
fs.readFile(__dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse(data);
var user = data["user" + req.params.id];
console.log(user);
res.end(JSON.stringify(user));
});
})

/deleteUser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var express = require('express');
var app = express();
var fs = require("fs");
var id = 2;
app.get('/deleteUser', function (req, res) {
// First read existing users.
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
data = JSON.parse( data );
delete data["user" + 2];
console.log( data );
res.end(JSON.stringify(data));
});
})

Demo2

数据库连接 db.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
var mysql = require('mysql');
var sqlOptions = {
host: '127.0.0.1',
user: 'root',
password: '111111',
database: 'mydb',
port: 3306
};
var pool = mysql.createPool(sqlOptions);
function query(sql, callback) {
pool.getConnection(function (err, conn) {
if (err) {
callback(err, null);
} else {
conn.query(sql, function (err, result) {
callback(err, result);
conn.release();
});
}
});
}
module.exports.query = query;

网络请求 user.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
var express = require('express');
var db = require('./db');
var router = express.Router();
// 重定向,将请求重定向到指定路径
router.get('/', function (req, resp, next) {
resp.redirect('/users/pageIndex/1/pageSize/20');
});
router.get("/pageIndex/:pageIndex/pageSize/:pageSize", function (req, resp) {
var pageIndex = req.params["pageIndex"];
var pageSize = req.params["pageSize"];
db.query('select * from User limit ' + pageSize + " offset " + (pageIndex - 1) * pageSize, function (err, result) {
if (err) {
resp.end(JSON.stringify(err));
} else {
resp.render('ejs_userlist', {
users: result,
pageIndex: pageIndex,
pageSize: pageSize,
});
}
});
});
router.get("/edit/:userId", function (req, resp) {
var editUserId = req.params["userId"];
resp.end(editUserId);
});
router.get("/del/:userId", function (req, resp) {
var delUserId = req.params["userId"];
resp.end(delUserId);
});
module.exports = router;