为什么要用Put/Delete接口:Restful API简介

博客文章

Articles

嗖嗖搜

Dwg

友链

Friends

一枚萌新

About

文章目录

前言HTTP/1.1的八种方法Rest和Restful API 1、资源和表述 2、资源的链接 3、状态和转移 4、状态码

为什么要用Put/Delete接口:Restful API简介

最后更新于2018年11月15日 / 7198次浏览 / 2次点赞 / 0条评论

 PATCH,Restful API

前言

最近发现小伙伴们写的API不仅仅有Get/Post,还有大量的Put/Patch/Delete,其实是有点疑惑的:所有的这些操作使用Post不就都能搞定吗?​事实确实如此,Post能够搞定一切的需求。那为什么还要使用专门的Put、Patch、Delete呢?理由就是为了构建Restful架构。

HTTP/1.1的八种方法

HTTP(HyperText Transfer Protocol,超文本传输协议)是应用层的无状态网络协议,2015年提出了HTTP2.0,但是目前用得最多的还是HTTP1.1。HTTP1.1定义了八种方法来操作资源:

方法 初始来源作用描述
 Get HTTP 1.0

请求指定的页面信息,并返回实体主体。

 Post HTTP 1.0向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
数据被包含在请求体中。
POST请求可能会导致新的资源的建立和/或已有资源的修改。 
 Head HTTP 1.0

类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头    

 Put HTTP 1.1

从客户端向服务器传送的数据取代指定的文档的内容。

 Delete HTTP 1.1

请求服务器删除指定的页面。

 Connect HTTP 1.1HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
 Options HTTP 1.1

这个方法可使服务器传回该资源所支持的所有HTTP请求方法。

允许客户端查看服务器的性能。

 Trace HTTP 1.1

回显服务器收到的请求,主要用于测试或诊断。

Rest和Restful API

(崩溃,都快写完了死机一下,又得从这里开始重写……)

Rest(Representational State Transfer,表述状态转移)在2000年Roy Fielding的博士论文《Architectural Styles and the Design of Network-based Software Architectures》中首次被提出,指的是一组架构约束条件和原则。符合这些约束条件和原则框架的API就是Restful API。

简单地总结这些约束条件和原则就是,URL定位资源,HTTP动词描述操作

1、资源和表述

通常Web资源可以使用URI(Uniform Resource Identifier,统一资源标识符)来定位,URL是URI的一个子集,URL除了确定资源,还确定了访问方式(是用HTTP呢,FTP呢,还是LDAP呢),例如官方的例子,这些都是URI,但只有部分是URL:

 
  1. ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
  2. http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
  3. ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
  4. mailto:John.Doe@example.com (also a URL because of the protocol)
  5. news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
  6. tel:+1-816-555-1212
  7. telnet://192.0.2.16:80/ (also a URL because of the protocol)

Rest对资源的表述具体的约束:

(1)资源的格式

【只能使用名词,不能使用动词】

举个例子,通常的URL会这样设计:

 
  1. http://www.bewindoweb.com/getArticle?id=1

而Restful API是这样的:

 
  1. http://www.bewindoweb.com/articles/1

看起来更像是某个资源的位置了,而不管具体的访问方法。

【问号用来过滤】

还是那个例子,我们想要对文章内容分页获取,普通的设计:

 
  1. http://www.bewindoweb.com/getArticle?id=1&pageNo=1

而Restful API是这样的:

 
  1. http://www.bewindoweb.com/articles/1?pageNo=1

id并不使用问号,是因为它是资源定位的一部分;pageNo使用问号,是因为在对这个资源进行过滤操作,过滤可以包括pageNo、limit、state=0等等。

【单数和复数】

没有统一规定,但明显复数比单数好,例如articles/1article/1更好,因为文章可能有很多篇。

【版本号】

可以在URL里面加入版本号,如:

 
  1. http://www.bewindoweb.com/v1/article/1

(2)统一的访问接口

Rest规定使用HTTP统一的Get、Post、Put、Patch、Delete来对资源进行访问。这里多了一个Patch,Patch是2010年RFC5789新增的HTTP请求方式,然而目前大多数容器都不支持,部分浏览器也不支持,HTML4只支持Get/Post,HTML5也增加了Put/Delete而已。所以对于Patch,在处理的时候需要去查询具体的解决方法。在讲述这些接口的作用前,了解两个概念:

【安全性(Safety)】

无论请求多少次,都不会改变服务器的状态。

例如,无论使用Get请求多少次文章,都不会改变文章具体的数据。

【幂等性(Idempotent)】

无论对资源操作多少次,结果总是一样的。

例如,采用PUT提交修改后的文章,无论操作多少次,修改后的文章内容都是一样的;而用POST让银行卡余额减少200,每次POST之后银行卡的余额都会发生变化。

所以,总结一下这5个请求方法:

请求方法 安全性 幂等性 作用
 Get安全幂等获取表示
变更时获取表示(缓存)
 Post不安全不幂等 服务端的实例号创建资源
创建子资源
 Put不安全幂等 客户端的实例号创建资源
替换的方式更新资源
 Patch不安全不幂等 部分更新资源
 Delete不安全幂等删除资源

根据服务端实例号创建资源:POST /items,服务端生成uuid。如果发生问题,服务端会重新生成uuid。

根据客户端实例号创建资源:PUT /items/31a1576d-7149-461a-a631-38bc11a5b2d3,利用幂等特性,无论出现什么问题,uuid不会变。

部分更新资源:Patch user/1 + 参数username=bwb,只需要携带一个参数即可,不需要全部的user属性。

(3)多种表现形式

客户端根据Accept、服务端根据Content-Type来进行协商,可以使用XML、Json等等很多表现形式。

2、资源的链接

资源之间需要链接起来,那么就要求表述格式里面加入链接来引导客户端,例如:

【请求】

 
  1. GET https://api.bewindoweb.com/articles/1 HTTP/1.1
  2. Accept: application/json

【响应】

 
  1. HTTP/1.1 Status: 200 OK
  2. Link: <https://api.bewindowb.com/articles/1?page=2>; rel="next",
  3. <https://api.bewindoweb.com/articles/1?page=3>; rel="last"
  4. Content-Type:application/json; charset=utf-8
  5. [
  6. {
  7. .....
  8. }
  9. ]

响应头里面包含了如何访问下一页和尾页的链接。

3、状态和转移

Rest是无状态通信的,每一次请求都看作是全新的请求,是不会存在JSESSIONID这样的Cookie的。服务端只维护资源状态,并不关心客户端的状态(不会保存session);客户端才维护应用状态,所以状态转移指的是客户端的状态转移。

举个例子,如果你想要查询工资,那么你需要经过登录→工资界面→工资数据,这是普通的Session的有状态通信;如果你输入一个URL立刻得到了工资数据,这就是符合Rest要求的架构。

很明显可以看出一个问题是,资源的安全性应该如何保障?目前通用的做法是JWT(JSON Web Token)进行认证和授权。

4、状态码

Rest要求返回具体的状态码,而不是出错返回200,然后再在Json里面描述出错信息。简单列举一些状态码:

状态码 描述 
 200  操作完成(更新成功、删除成功)
 201 新资源被创建
 204 资源为空
 304 没有变化,客户端可以使用缓存
 400 非法调用(参数错误)
 401 未认证
 403 不允许访问
 404 资源不存在
 500 通用错误
 503 服务器当前无法处理请求

 

总结

Restful API非常适合于分布式服务器提供接口服务,认证逻辑简单,资源控制清晰,可以跨域等等,不需要保存任何会话数据,值得实践。

 

 写得很赞  微博收藏  打赏作者

转载请注明出处http://www.bewindoweb.com/221.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。

 你可能还会喜欢

长连接波动队列暴增与连接量限制排查2020年11月01日

 

JWT的签名算法选择研究2020年10月28日

 

kafka原理和源码(四):V0、V1、V2消息格式2020年09月18日

 具体问题具体杠

 

 

© 2017-2018 BEWINDOWEB bwbUI2.0黑ICP备17001360号   发送邮件  github  个人wiki

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在设计Django框架的RESTful API接口时,我们需要考虑以下几个方面: 1. URL设计 2. 请求方法的选择 3. 数据的序列化和反序列化 4. 异常处理 下面我们将逐一介绍这些方面的设计。 1. URL设计 RESTful API接口的URL设计应该遵循一定的规范。一般而言,我们可以将URL按照以下的方式进行设计: ``` http(s)://host:port/api/{version}/{resource}/{resource_id}/ ``` 其中,`version`表示API版本,`resource`表示资源,`resource_id`表示资源的唯一标识符。例如: ``` http://localhost:8000/api/v1/users/1/ ``` 表示获取ID为1的用户信息。 2. 请求方法的选择 RESTful API接口支持以下四种请求方法: - GET:获取资源 - POST:创建资源 - PUT:更新资源 - DELETE:删除资源 这四种请求方法对应着CRUD操作中的"读取"、"创建"、"更新"和"删除"。 3. 数据的序列化和反序列化 在RESTful API中,数据的序列化和反序列化是非常重要的。序列化是将Python对象转换为JSON或XML等格式的过程,而反序列化则是将JSON或XML等格式的数据转换为Python对象的过程。 Django框架提供了一些强大的序列化工具,例如`django-rest-framework`。我们可以使用这些工具来实现数据的序列化和反序列化。 4. 异常处理 在RESTful API接口的设计中,异常处理也是非常重要的。我们需要对可能出现的异常进行处理,并返回适当的错误信息。 在Django框架中,我们可以使用`try...except`语句来捕获异常,并使用`HttpResponse`对象返回错误信息。例如: ```python from django.http import HttpResponse def my_view(request): try: # some code here except: return HttpResponse('Error occurred', status=500) ``` 以上是Django框架RESTful API接口设计的基本要素,通过合理的设计可以实现一个高效、易用的API接口

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值