【WebAPI】RESTful 风格的 API 设计方案
目录RESTful设计要点1.网址中不能有动词,只能有名词,且应使用复数。2.get请求中参数一般都在url中RESTful风格API示例那什么是GET,PUT,POST,DELETE呢开始创建项目创建Help页面路由路由前缀隐藏API参数多参数参数约束可选参数api的多版本管理是否一定使用RESTful风格设计参考文章...
目录
RESTful设计要点
1.网址中不能有动词,只能有名词,且应使用复数。
例如:下面都是不符合RESTful风格的
https://xxx.com/api/getusers
https://xxx.com/api/getuserbyid
https://xxx.com/api/updateuser
2.get请求中参数一般都在url中
例如:
https://xxx.com/api/users 获取用户信息列表
https://xxx.com/api/users/true/18 获取性别为男性且年龄为18岁的用户信息列表 多参数
https://xxx.com/api/users/1001 获取ID为1001的用户信息 单参数
下面这种写法则不符合RESTful风格
https://xxx.com/api/users?isman=true&age=18
https://xxx.com/api/users?id=1001
RESTful风格API示例
GET https://xxx.com/api/users //获取所有用户信息列表
GET https://xxx.com/api/users/1001/details //获取ID为1001的用户信息
PUT https://xxx.com/api/users/1001 //修改ID为1001的用户信息
POST https://xxx.com/api/users //添加用户信息
DELETE https://xxx.com/api/users/1001 //删除ID为1001的用户信息
那什么是GET,PUT,POST,DELETE呢
对于我一开始接触这几个词的时候,也是懵懵懂懂
一开始接触WebAPI,我属于后端开发,前端的什么js,请求等懂得少,看来还是要多了解
GET,PUT,POST,DELETE就是前端请求数据的几种方式,对应着RESTful API的增删改查
在网上查资料的时候,很多都是这么写,对于一个后端开发人员来说,还是不懂,下面容我一一讲解
前端请求数据时,有各种参数,其中有一个type参数,可以填写请求的方式
例如:
获取用户信息列表
$.ajax({
url: "/api/users/", //请求地址
type: "GET", //请求方式
data: {}, //参数
success: function (data) { //请求成功时,做什么
},
error: function (data) { //请求失败时,做什么
}
});
修改用户信息
$.ajax({
url: "/api/users/1001", //请求地址
type: "PUT", //请求方式
data: {"ID": 1001, "name": "haha"}, //参数
success: function (data) { //请求成功时,做什么
},
error: function (data) { //请求失败时,做什么
}
});
添加用户信息
$.ajax({
url: "/api/users", //请求地址
type: "POST", //请求方式
data: {"name": "haha"}, //参数
success: function (data) { //请求成功时,做什么
},
error: function (data) { //请求失败时,做什么
}
});
删除用户信息
$.ajax({
url: "/api/users/1001", //请求地址
type: "DELETE", //请求方式
data: {}, //参数
success: function (data) { //请求成功时,做什么
},
error: function (data) { //请求失败时,做什么
}
});
开始创建项目
看看微软提供的示例
方法分别是Get,Post,Put,Delete,分别对应增删改查
public class ValuesController : ApiController
{
// GET: api/Values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/Values/5
public string Get(int id)
{
return "value";
}
// POST: api/Values
public void Post([FromBody]string value)
{
}
// PUT: api/Values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE: api/Values/5
public void Delete(int id)
{
}
}
以Get,Post,Put,Delete为前缀命名的方法会自动识别,你可以在方法上添加[HttpGet],[HttpPut],[HttpPost],[HttpDelete]特性,
比如,
创建Help页面
我用VS2019创建的WebAPI项目已经包含Help页面,旧版本的没有,
看看这里的 Web API帮助页 ,并添加注释 帮助文档添加注释
路由
默认的路由都是,api/+{控制器名}/+参数,比如 :api/Values/5
我们也可以添加Route特性修改路由
效果
路由前缀
我们可以设置整个控制器的路由前缀,使用RoutePrefix特性
在使用路由前缀的情况下,也可以使用~符号对单个路由进行重写
效果
隐藏API
添加ApiExplorerSettings特性可以设置api不在Help页面上显示,同样的也可以添加到控制器上,隐藏控制器的所有API。
我试过了,虽然Help页面的API隐藏了,但是还是可以调用的
参数
多参数
比如:获取特定性别特定年龄的用户信息
获取性别为男性且年龄为18的用户列表地址为https://xxx.com/api/users/true/18
参数约束
可以用来限制参数
比如,限制isMan为boo类型,限制age为int类型
[Route("{isMan:bool}/{age:int}")]
约束
可选参数
一般用这种写法,这样在Help页面上有添加参数备注,默认值为18
或
默认年龄为18
访问https://xxx.com/api/users/true/18和https://xxx.com/api/users/true是一样的
api的多版本管理
是否一定使用RESTful风格设计
知乎上这文章,大家都有大家的意见
https://www.zhihu.com/question/36706936
而我觉得,使用RESTful风格设计是一种规范,前后端的规范
如果要使用RESTful风格的就遵循它,不要使用一半不使用一半的
很多网友说当get请求参数很多时,就不能用RESTful了
而我觉得,当参数很多时,不可以拆分api吗,将一个api分为两个,并不是说获取的方法就只能一个,并且参数真的会那么多吗
看看,微软官方示例,比如
获取书的列表信息,可以分为多个api
是否使用RESTful风格设计一直以来都很受争议,本文也是代表个人观点,写的不好的请指出。谢谢
参考文章
理解RESTful架构
http://www.ruanyifeng.com/blog/2011/09/restful.html
RESTful设计指南
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
微软官方Web API文档路由设置
更多推荐
所有评论(0)