这几天用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
| 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
| 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地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等