RESTful规范 GET请求、POST请求、PUT请求、DELETE请求?

        RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

RESTFul规范:

一.http动词:

GET(SELECT):从服务器取出资源(一项或多项)

POST(CREATE):在服务器新建一个资源(动作类:无法用http动词表示的)

PUT(UPDATE):在服务器更新资源

DELETE(DELETE):从服务器删除资源

二.  资源:

所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实体。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

三.误区:

  1. 最常见的一种设计错误,就是URI包含动词

RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。

举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

2.资源 != 表

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:POST /accounts/1/transfer/500/to/2
正确的写法是把动词transfer改成名词transactions,资源不能是动词,但是可以是一种服务:POST /accounts/transactions HTTP/1.1  from=1&to=2&amount=500.00(动词若没有名词形式,则直接使用动词加s)

四.命名原则:

URI命名通常有三种,驼峰命名法(serverAddress),蛇形命名法(server_address),脊柱命名法(server-address)。由于URL是大小写敏感的,如果用驼峰命名在输入的时候就要求区分大小写,一个是增加输入难度,另外也容易输错,报404。支付宝用的是蛇形命名法,stackoverflow.com和github.com用的是脊柱命名法(例如

https://help.github.com/articles/why-are-my-commits-linked-to-the-wrong-user/#commits-are-not-linked-to-any-user

(\https://stackoverflow.com/questions/5262224/how-are-reddit-and-hacker-news-ranking-algorithms-used

1.URI命名原则

(1)URI请求采用小写字母,数字,部分特殊符号(非制表符)组成。

(2)URI请求中不采用大小写混合的驼峰命名方式,尽量采用全小写单词,如果需要连接多个单词,则采用连接符“-”连接单词(脊柱命名法)

2. 使用-来让URI可读性更好

3. 使用/来表示资源的层级关系:

曾经Web上的URI都是冰冷的数字或者无意义的字符串,但现在越来越多的网站使用_或-来分隔一些单词,让URI看上去更为人性化。 例如国内比较出名的开源中国社区,它上面的新闻地址就采用这种风格:

如http://www.oschina.net/news/38119/oschina-translate-reward-plan。(我们统一使用-)

4. 避免层级过深的URI(推荐两级)

在url中表达层级,用于 按实体关联关系进行对象导航 ,一般根据id导航。

过深的导航容易导致url膨胀,不易维护,如 GET /zoos/1/areas/3/animals/4 ,尽量使用查询参数代替路径中的实体导航,如 GET/animals?zoo=1&area=3 ;

5. 使用?用来过滤资源

6. ,可以用来表示同级资源的关系 

五.API规范:

多条件查询:

1.GET  /api/版本号/资源s?过滤条件

例如:GET  /api/v1/req-infos?过滤条件

http://localhost:8801/api/v1/req-infos?pageNumber=0&pageSize=10&state=2

分页多条件查询需求信息

 

单数据查询:

2.GET   /api/版本号/资源s/id

例如:GET /api/v1/req-infos/1

http://localhost:8801/api/v1/req-infos/1

获取id为1的需求信息

 

分组多条件查询:

3.GET  /api/版本号/资源s/group/groupColumn1,groupColumn2?过滤条件

例如:GET api/v1/req-infos/group/state?过滤条件

http://localhost:8801/api/v1/req-infos/group/state?source=2

获取根据state分组且source=2的需求列表信息的分组信息

例如:GET api/v1/req-infos/group/state,source?过滤条件

http://localhost:8801/api/v1/req-infos/group/state,source?source=2

获取根据state和source分组且source=2的需求列表信息的分组信息

 

资源保存:

4.POST  /api/版本号/资源s

例如:POST /api/v1/req-infos

http://localhost:8801/api/v1/req-infos

新建一条需求信息

 

单数据更新:

6.PUT  /api/版本号/资源s/ID

例如:PUT /api/v1/req-infos/1

http://localhost:8801/api/v1/req-infos/1

更新id为1的需求信息

 

根据主键批量更新:

7. PUT  /api/v1/req-infos/batch/id1,id2,id3

例如:PUT  /api/v1/req-infos/batch/id1,id2,id3

http://localhost:8801/api/v1/req-infos?batch=1,2,3

更新id1,2,3的需求信息

 

根据除主键外其他字段批量更新:

8. PUT  /api/v1/req-infos/batch?过滤条件

例如:PUT  /api/v1/req-infos/batch?createDate=2018-04-20

http://localhost:8801/api/v1/req-infos?createDate=2018-04-20

更新createDate为2018-04-20的需求信息

 

单数据删除:

9.DELETE  /api/版本号/资源s/ID

例如:DELETE  /api/v1/req-infos/1

http://localhost:8801/api/v1/req-infos/1

删除id1的需求信息

 

根据主键批量删除:

10. DELETE /api/v1/req-infos/batch/id1,id2,id3

例如:DELETE /api/v1/req-infos/batch/id1,id2,id3

http://localhost:8801/api/v1/reqInfos?batch=1,2,3

删除id1,2,3的需求信息

 

根据除主键外其他字段批量删除:

11. DELETE /api/v1/reqInfos/batch?过滤条件

例如:DELETE /api/v1/reqInfos/batch?createDate=2018-04-20

http://localhost:8801/api/v1/reqInfos?createDate=2018-04-20

更新createDate为2018-04-20的需求信息

 

操作类:

运行一条流水线:

http://localhost:8801/api/v1/pipelines/{id}/runs

终止一条流水线:

http://localhost:8801/api/v1/pipelines/{id}/ends

校验流水线名称:

http://localhost:8801/api/v1/pipelines/validations

下载多个图片:

http://localhost:8801/api/v1/pictures/downloads

下载一个资源:

http://localhost:8801/api/v1/resources/{id}/downloads

六.过滤信息:

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

下面是一些常见的参数:

?limit=10:指定返回记录的数量

?offset=10:指定返回记录的开始位置。

?pageNumber=2&pageSize=100:指定第几页,以及每页的记录数。

?orderBy=name&sort=asc:指定返回结果按照哪个属性排序,以及排序顺序。

?reqTitle=新业务:指定筛选条件

七.状态码:

对于添加(POST)、修改(PUT)这类方法我们需要返回添加或更新后的数据以备前端使用(注意:对前端不关心的数据可以不做返回)

(一般GET请求成功返回200加对象、集合,

POST/PUT请求成功返回201加对象、集合,

DELETE求成功返回204,对于失败的请求代码中暂时不去处理)

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。

201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。

202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)

204 NO CONTENT - [DELETE]:用户删除数据成功。

400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。

401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。

403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。

404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。

406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。

410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。

422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。

500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值