【WebAPI】RESTful 风格的 API 设计方案

目录

RESTful设计要点

1.网址中不能有动词,只能有名词,且应使用复数。

2.get请求中参数一般都在url中

RESTful风格API示例

那什么是GET,PUT,POST,DELETE呢

开始创建项目

创建Help页面

路由

路由前缀

隐藏API

参数

多参数

参数约束

可选参数

api的多版本管理

是否一定使用RESTful风格设计

参考文章

RESTful设计要点

1.网址中不能有动词,只能有名词,且应使用复数。

例如:下面都是不符合RESTful风格的

xxx.com/api/getuser…

xxx.com/api/getuser…

xxx.com/api/updateu…

2.get请求中参数一般都在url中

例如:

xxx.com/api/users 获取用户信息列表

xxx.com/api/users/t… 获取性别为男性且年龄为18岁的用户信息列表 多参数

xxx.com/api/users/1… 获取ID为1001的用户信息 单参数

下面这种写法则不符合RESTful风格

xxx.com/api/users?i…

xxx.com/api/users?i…

RESTful风格API示例

GET xxx.com/api/users //获取所有用户信息列表

GET xxx.com/api/users/1… //获取ID为1001的用户信息

PUT xxx.com/api/users/1… //修改ID为1001的用户信息

POST xxx.com/api/users //添加用户信息

DELETE xxx.com/api/users/1… //删除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的用户列表地址为xxx.com/api/users/t…

参数约束

可以用来限制参数

比如,限制isMan为boo类型,限制age为int类型

[Route("{isMan:bool}/{age:int}")]
复制代码

约束

可选参数

一般用这种写法,这样在Help页面上有添加参数备注,默认值为18

默认年龄为18

访问xxx.com/api/users/t…

api的多版本管理

符合RESTful风格的多版本管理设计方案

是否一定使用RESTful风格设计

知乎上这文章,大家都有大家的意见

www.zhihu.com/question/36…

而我觉得,使用RESTful风格设计是一种规范,前后端的规范

如果要使用RESTful风格的就遵循它,不要使用一半不使用一半的

很多网友说当get请求参数很多时,就不能用RESTful了

而我觉得,当参数很多时,不可以拆分api吗,将一个api分为两个,并不是说获取的方法就只能一个,并且参数真的会那么多吗

看看,微软官方示例,比如

获取书的列表信息,可以分为多个api

是否使用RESTful风格设计一直以来都很受争议,本文也是代表个人观点,写的不好的请指出。谢谢

参考文章

理解RESTful架构

www.ruanyifeng.com/blog/2011/0…

RESTful设计指南

www.ruanyifeng.com/blog/2014/0…

微软官方Web API文档路由设置

docs.microsoft.com/zh-cn/aspne…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享