Restful

在web API开发中,有两种风格:面向过程(RPC)和面向REST

HTTP设计

1:通过URL进行资源定位,如获取id=8的用户则向/user/8发送请求
2:具有不同的请求方法(也叫请求谓词),主要有get、post、put、delete,获取资源使用get,新增资源使用post,整体更新使用put,删除资源使用delete
3:请求谓词中,除了post之外都是幂等的,幂等指的是对于一个接口采用同样的参数请求一次和多次结果一致,不会产生副作用。比如点击评论发布,评论被插入数据库,但是因为网络问题用户没有看到发布成功的消息,则多次点击发布按钮,幂等同样会只插入一次。
4:get请求的相应是可以被缓存的
5:服务端要通过状态码来反映资源获取的结果,如404

RPC

通过“控制器/操作方法”的形式来调用服务端的方法,也就是把服务端的代码当做了方法调用。这种风格的接口可能会用POST处理所有的操作方法(无论是新增、获取、还是删除)。在这样的接口中,通过QueryString或者请求报文来为服务器传递数据,只要是服务端能够正常完成客户端的请求,服务端统一返回200的http状态码,对于逻辑上的错误,同样返回200,只不过会在响应报文中不同的错误码来表示。

Restful(Rest)

按照HTTP的语义来使用HTTP协议: 
1:URL用于资源的定位:/user/888、/user/888/orders;
2:HTTP谓词:GET、POST(新增)、PUT(整体更新)、DELETE、PATCH(局部更新)等;
3:什么是“幂等”,举例?DELETE、PUT、GET是幂等的,POST不幂等; (执行一次跟执行多次结果是一样的就是幂等,不一样就是不幂等)
4:GET的响应可以被缓存; 
5:服务器端要通过状态码来反映资源获取的结果:200 (意思是一切正常),201(新增成功),400(错误请求,一般是客户端请求的参数错误),401(未授权,没登录的意思),、403(没有权限,一般指已经登录,但是你没有权限访问当前方法),404(没有找到任何资源),500 (服务器错误)

每个控制器都是对一类资源的操作的集合,每个操作方法都被不同的HTTP谓词触发

[Route("api/[controller]")]
public class PersonsController : ControllerBase
{
    [HttpGet]
    public IEnumerable<Person> GetPersons();
    [HttpGet("{id}")]
    public Person GetPersons(long id); 
    [HttpPut("{id}")]
    public void UpdatePerson(long id,Person person);
    [HttpPost]
    public void SavePerson(Person person);
    [HttpDelete("{id}")]
    public void DeletePerson(long id);
}
需求调用方法地址HTTP谓词
加载所有用户添加了[HttpGet]的GetPersons方法/api/PersonsGet
获取Id=8的用户添加了[HttpGet(“{id}”)]的GetPersons方法/api/Persons/8Get
更新Id=8的用户添加了 [HttpPut(“{id}”)]的UpdatePerson方法/api/Persons/8Put
新增用户添加了 [HttpPost]的SavePerson方法/api/PersonsPost
删除id=8的用户添加了 [HttpDelete(“{id}”)]的DeletePerson方法/api/Persons/8Delete

其中新增用户信息以JSON格式放在请求报文中,在Restful风格中,URL中的单词都是名词,动作通过HTTP谓词来表述

Restful优缺点

优点:
1:所有资源尽量通过URL表示,避免通过QueryString、报文体对资源进行定位,URL语义性更清晰
2:增删改查都会对应相应的HTTP谓词
3:get、put、delete等幂等操作可以对失败的请求自动重试
4:网管可以对get请求进行缓存
5:可以通过http状态码反映服务器端的处理结果,能够统一错误码
6:网关等系统可以根据状态码来分析系统的访问数据,比如通过http状态码分析有多少成功请求有多少失败请求

缺点:
1:真实系统资源复杂,很难清晰的进行资源划分
2:并不是所有的操作都能简单对应到put、get、delete、post
3:系统的改变,比如一开始设计为幂等,但后来更改了规则
4:通过URL不太符合中文的习惯,比如查询年级编号为8且年龄等于18的用户:person/class/8/age/18
5:某些客户端不支持put,delete请求

Restful如何传递参数

客户端向服务器传递参数的3中形式:

1:URL

只要在控制器里面的方法的HTTP谓词里面加上“{id}”,这里参数名称为id的参数就是通过url操进来

[HttpGet("{id}")]
public Person GetPersons(long id); 

2:QueryString

3:请求报文体(只有put、post支持请求报文体)

Web Api参数传递建议:
1:对于保存、更新类的请求一般是用post,put请求,将全部参数放到请求报文体中
2:对于delete请求,要传递的参数一般是一个Id,所以使用QueryString即可
3:对于get请求,参数不会太长一般使用QueryString即可
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值