Restful接⼝规范
Rest,即Resources Representational State Transfer(资源表现层状态转化)。
  ·资源(Resources),⽹络上的⼀个实体,每种资源对应⼀个特定的URI(统⼀资源标识符)
  ·表现层(Representational),资源呈现的形式,⽐如:json
  ·状态转化(State Transfer),http协议⾥,四个表⽰操作⽅式的基本操作
Restful API设计规范
  ·使⽤http协议
  ·url中只有名词,如add、delete等动词不应出现
  ·不同操作由动词来区分:get,post(新建),put(更新,客户端需提供改变后的完整资源),patch(更新,客户端只需提供资源改变的属性),delete(删除)
  ·查询字符串中指定过滤条件
结果
  · GET /collection:返回资源对象的列表(数组)
  · GET /collection/id:返回单个资源对象
  · POST /collection:返回新⽣成的资源对象
  · PUT /collection/id:返回完整的资源对象
  · PATCH /collection/id:返回更新后的完整资源对象
  · DELETE /collection/id:返回⼀个空资源
restfulAPI.js
var express = require('express');
var app = express();
var path = require('path');
var bodyParser = require('body-parser');
app.set('view engine','ejs');
//solve  取当前⽬录的绝对路径
app.set('views',solve());
app.use(bodyParser.urlencoded({extended:true}));
/*app.use(bodyParser.raw({
type:'application/!*'
}));
app.({
type:'text/!*'
}));*/
app.use(function(req,res,next){
console.log('body',req.body);
next();
});
app.use(function(err,req,res,next){
<(err);
next();
});
/*app.post('/raw',function(req,res){
res.send(req.body);
});*/
var users = [{id: 1, name: 'zfpx1',mny:100}, {id: 2, name: 'zfpx2',mny:100}];
/
**
* 1. 获取所有的⽤户 curl -v -H 'accept:text/html'  localhost:8080/users
* 2.
*/
//1.获取所有的⽤户
<('/users', function (req, res) {
//Accept:text/html,application/xml;q=0.9,image/webp,*/*;q=0.8。获取请求中accept权重最⾼的格式    var accept = req.headers['accept'];
var acceptType = accept.split(',').map(function (item) {
var values = item.split(';');
return {
type: values[0],//需要的⽂件类型
q: values[1] ? values[1].split('=')[1] : 1 //权重默认是1
}
//⽤优先级进⾏排序,取排名最⾼那个
}).sort(function (a, b) {
return b.q - a.q;
})[0].type;
console.log(acceptType);
if(acceptType == 'text/plain'){
res.setHeader('Content-Type',acceptType);
res.send(users);
}else if(acceptType == 'text/html'){
/
/设置响应类型
res.setHeader('Content-Type',acceptType);
//渲染模板
users:users
});
}else{
res.send(users);
}
});
//返回某个⽤户信息路径参数
/
/curl  localhost:8080/users/1  使⽤函数过滤器过滤
<('/users/:id', function (req, res) {
var id = req.params.id;
var filteredUsers = users.filter(function(user){
return user.id == id;
});
res.send(filteredUsers.length>0?filteredUsers[0]:'此⽤户不存在');
});
//新增加⽤户
// -X 指定请求⽅法 --data 指定请求体的数据
//curl -X POST --data "name=zfpx3"  localhost:8080/users  ⽤body-parser获取请求体
app.post('/users', function (req, res) {
var addedUser = req.body;
if(addedUser){
//为增加的⽤户赋⼀个最⼤的ID
addedUser.id = users[users.length-1].id+1;
users.push(addedUser);
//当新增加⼀个资源的时候要返回新⽣成的资源完整对象
res.send(addedUser);
}else{
res.send({msg:'增加资源失败'});
}
});
//整体更新全部属性
// curl -X PUT --data "id=2&name=zfpx20"  localhost:8080/users/2
app.put('/users/:id',function(req,res){
var putUser = req.body;
if(putUser){
for(var i=0;i<users.length;i++){
//判断当前⽤户和⽤户传进来要更新的⽤户ID是否⼀致
if(users[i].id == req.params.id){
users[i] = putUser;//把⽼的对象整体替换成新的对象
break;
}
}
res.send(putUser);
}else{
res.send({msg:'更新资源失败'});
}
});
//局部更新请求体⾥只传要更新的字段
//curl -X PATCH --data "name=zfpx200"  localhost:8080/users/2
app.patch('/users/:id',function(req,res){
var updatedFields = req.body;
if(updatedFields){
for(var i=0;i<users.length;i++){
//判断当前⽤户和⽤户传进来要更新的⽤户ID是否⼀致
if(users[i].id == req.params.id){
for(var attr in updatedFields){
//⽤新的值替换旧的值
if(updatedFields.hasOwnProperty(attr))
users[i][attr] = updatedFields[attr];
}
res.send(users[i]);
break;
}
}
}else{
res.send({msg:'更新资源失败'});
}
});
//删除
//curl -X DELETE  localhost:8080/users/2  end不能接收对象参数,send可以接收
app.delete('/users/:id',function(req,res){
/*for(var i=0;i<users.length;i++){
if(users[i].id == req.params.id){
users.splice(i,1);
res.send({});
return;
}
}*/
users  = users.filter(function(user){
return user.id != req.params.id;
});
res.send({msg:'删除失败'});
});
//以资源为中间 URL⾥不要包含动词⽐如从id 1转账到 id 2,此时不是简单的restful形式,可以灵活变化但定义url时避免使⽤动词app.post('/transaction/:fromId/:toId',function(){
var money = ;
});
app.listen(8080);
tips:
/**
* map 替换所有的元素
* filter 过滤数组中的元素
* reduce 聚合
* reduceRight 从右往左聚合
* some 有⼀个满⾜就可以
* every 全部满⾜条件
filter过滤对象数组* indexOf 第⼀个索引
* lastIndexOf 最后索引
*/
var nums = [1,2,3,1,6,4];
/**
*  会依次把数组中的每⼀元素传⼊next
*  每次返回值会传⼊下⼀次的current
*  最后得到⼀个最终值
*  获取元素最⼤值
*/
var s = duce(function(current,next){ return current>next?current:next;
},0);
console.log(s);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。