盒子
盒子

restful服务中post/put/patch的区别

这几天用express+mongoose来实现restful api,get、post、put和delete都实现了,用postman调试也没问题,这时看到有patch这个方法。上网查了一下,了解了post、put与patch之间的区别,这里做下简单的总结。

RESTFUL中四个基本的方法

POST = 新增
GET = 读取
PUT = 更新
DELETE = 刪除

HTTP的POST/PUT方法,这两个方法似乎都可以用来创建或更新一个资源。

区别是细微但清楚的:

POST方法用来创建一个子资源,如 /api/users,会在users下面创建一个user,如users/1

POST方法不是幂等的,多次执行,将导致多条相同的用户被创建(users/1,users/2 …而这些用户除了自增长id外有着相同的数据,除非你的系统实现了额外的数据唯一性检查)

而PUT方法用来创建一个URI已知的资源,或对已知资源进行完全替换,比如users/1,

因此PUT方法一般会用来更新一个已知资源,除非在创建前,你完全知道自己要创建的对象的URI。

这里是PUT跟POST,那么PUT与PATCH呢,PUT可以理解为replace(create or update),例如put /user/1的意思是替换/user/1,如果user/1已经存在那么就替换,如果没有那么就创建。PUT必须包含/user/1的所有属性资料。

但是如果只是为了更新/user/1下的一个属性值,那么使用PUT就显得太过笨重,因为需要传入/user/1的所有属性值。这里就可以使用PATCH,用来做局部更新

下面是express实现的restful的代码,代码比较简单,只是表达下POST,PUT,PATCH这些api

POST

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
router.post('/users', function(req, res, next) {
var name = req.body.userName;
var password = req.body.password;
var resbody = { state: '' };
var md5 = crypto.createHash('md5');
var password = md5.update(password).digest('hex');
var user = new db.User({
name: name,
password: password
});
var check = finduser(db.User, { name: name });
if (check) {
resbody.state = 'fail';
res.send(resbody)
} else {
user.save(function(err, user) {
if (err) {
return console.log(err);
}
resbody.state = 'success';
res.send(resbody)
})
}
next();
})

PUT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//change user's password
router.put('/users/:id', function(req, res, next) {
if (req.body.id) {
var obj = {
name: req.body.name,
password: req.body.password
}
db.User.findByIdAndUpdate(req.body.id, obj).exec();
} else {
var newUser = new db.User({
name: req.body.name,
password: req.body.password
})
newUser.save(function(err) {
if (err) return console.log(err)
})
}
res.send('OK')
})

PATCH

1
2
3
4
5
6
7
8
9
10
11
12
//change user's password
router.put('/users/:id', function(req, res, next) {
var id = req.params.id,
password = req.body.updatepassword;
db.User.findOneAndUpdate({ id: name }, { $set: { password: password } }, function(err) {
if (err) {
console.log(err)
}
res.send('update success');
});
})

最后,放上URI的区别URL
关于URI和URL:
URI—Universal Resource Identifier通用资源标志符
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。

URL—Uniform Resource Location统一资源定位符
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等

支持一下
扫一扫,支持wind
  • 微信

  • 支付宝