• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

RESTful API规范 接口URL路径设计与返回结果数据格式

编写API有什么好处呢?由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。

编写REST API,实际上就是编写处理HTTP请求的async函数,不过,REST请求和普通的HTTP请求区别

  • REST请求仍然是标准的HTTP请求,但是,除了GET请求外,POST、PUT等请求的body是JSON数据格式,请求的Content-Type为application/json;

  • REST响应返回的结果JSON数据格式,因此,响应的Content-Type也是application/json

url 即资源

rest接口是围绕“资源”展开的,利用HTTP的协议,其实rest本也可以和HTTP无关,但是现在大家普遍的使用rest都是依托于HTTP协议。HTTP 的url即资源。

RFC 3986定义了通用的URI语法:

URI = scheme “://” authority “/” path [ “?” query ][ “#” fragment ]
  • scheme: 指底层用的协议,如http、https、ftp

  • host: 服务器的IP地址或者域名

  • port: 端口,http中默认80

  • path: 访问资源的路径,就是咱们各种web 框架中定义的route路由

  • query: 为发送给服务器的参数

  • fragment: 锚点,定位到页面的资源,锚点为资源id

Rest设计原则

那么怎么样可以设计成REST的架构规范呢? 需要符合如下的一些原则:

1. 每一个URI代表一种资源;

2. 同一种资源有多种表现形式(xml/json);

3. 所有的操作都是无状态的。

4. 规范统一接口。

5. 返回一致的数据格式。

6. 可缓存(客户端可以缓存响应的内容)。

URL设计规范

1) uri末尾不需要出现斜杠/

2) 在uri中使用斜杠/是表达层级关系的。

3) 在uri中可以使用连接符 -, 来提升可读性。

4) 在uri中不允许出现下划线字符 _.

5) 在uri中尽量使用小写字符。

6) 在uri中不允许出现文件扩展名. 比如接口为 /xxx/api, 不要写成 /xxx/api.php 这样的是不合法的。

7) 在uri中使用复数形式

符合上述REST原则的架构方式被称作为 RESTful 规范。

CURD操作

  • GET:  获取资源

  • POST:  新建资源

  • PUT:在服务器更新资源(向客户端提供改变后的所有资源)

  • PATCH: 在服务器更新资源(向客户端提供改变的属性)

  • DELETE:删除资源

PATCH一般不用,用PUT

http://xxx.com/api/users;    // GET请求方式 获取所有用户信息
http://xxx.com/api/users;        // POST请求方式 添加新的用户
http://xxx.com/api/users/1;   // GET请求方式 获取标识为1的用户信息
http://xxx.com/api/users/1;   // DELETE请求方式 删除标识为1的用户信息
http://xxx.com/api/users/1;   // PUT/PATCH请求方式,更新标识为1的用户全部部分信息

QUERY 资源过滤

当我们只需要获取部分数据时,可通过参数限制返回的结果集

  • limit:指定返回记录数量

  • offset:记录开始位置

  • direction:请求数据的方向,取值prev-上一页数据;next-下一页数据

  • page:第几页

  • per_page:每页条数

  • total_count:总记录数

  • total_pages:总页数,等于page时,表示当前是最后一页

  • sort:column1,column2排序字段

  • orderby:排序规则,desc或asc

  • q:搜索关键字(uri encode之后的)

例如,返回第2页评论,每页10项,按时间排序:

GET /api/products/123/reviews?page=2&size=10&sort=time

返回结果

  • GET /collections 返回资源列表

  • GET /collections/:id 返回单独的资源

  • POST /collections 返回新生成的资源对象

  • PUT /collections/:id 返回完整的资源对象

  • PATCH /collections/:id 返回被修改的属性(也可返回完整的资源对象)

  • DELETE /collections/:id 返回一个空文档(也可返回完整的资源对象)

返回数据格式

服务器端返回的数据格式可以是XML、或json. 或者直接返回状态码的方式。

RESTful规范中的请求应该返回统一的数据格式。对于返回的数据,一般会包含如下字段:

1) code: http响应的状态码(查看http状态码说明)。

2) status: 包含文本, 比如:'success'(成功), 'fail'(失败), 'error'(异常) 

HTTP状态响应码

  • 在500-599之间为 'fail'; 

  • 在400-499之间为 'error',

  • 其他一般都为 'success'。 

  • 对于响应状态码为 1xx, 2xx, 3xx 这样的可以根据实际情况可要可不要。

3) message: 当status的值为 'fail' 或 'error'时,需要添加 message 字段,用于显示错误信息。

4) data: 当请求成功的时候, 返回的数据信息。

  •  当状态值为 'fail' 或 'error' 时,data仅仅包含错误原因或异常信息等。

返回成功的响应JSON格式一般为如下:

{
    "code": 200,
    "status": "success",
    "data": [{
        "userName": "tugenhua",
        "age": 31
    }]
}

返回失败的响应json格式为如下:

{
    "code": 401,
    "status": "error",
    "message": '用户没有权限',
    "data": null
}


2
0
下一篇:常见的 http 状态码 整理

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。