一、   URI

URI规范

1.不用大写;

2.用中杠 - 不用下杠 _ 

3.参数列表要encode

4.URI中的名词表示资源集合,使用复数形式。

5.RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词(特殊情况可以使用动词),而且所用的名词往往与数据库的表格名对应

6.接口尽量使用名词,禁止使用动词

 

资源集合 vs单个资源

 

URI表示资源的两种方式:资源集合、单个资源

 

资源集合:

 

       /zoos //所有动物园

 

       /zoos/1/animals //id1的动物园中的所有动物

 

单个资源:

 

       /zoos/1//id1的动物园

 

       /zoos/1;2;3//id123的动物园

 

 

避免层级过深的URI

 

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

 

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

 

常见过滤参数

 

  • ?limit=10:指定返回记录的数量
  • ?offset=10:指定返回记录的开始位置。
  • ?page=2&per_page=100:指定第几页,以及每页的记录数。
  • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
  • ?animal_type_id=1:指定筛选条件

 

 

 

二、   版本

 

应该将API的版本号放入到URI

 

           https://api.example.com/v1/zoos

 

 

三、 Request

 

HTTP方法

 

通过标准HTTP方法对资源CRUD

 

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

 

GET /zoos

 

GET /zoos/1

 

GET/zoos/1/employees

 

POST:创建单个新资源。 POST一般向资源集合uri发起

 

POST/animals  //新增动物

 

POST/zoos/1/employees //id1的动物园雇佣员工

 

PUT:更新单个资源(全量),客户端提供完整的更新后的资源。与之对应的是 PATCHPATCH负责部分更新,客户端提供要更新的那些字段。 PUT/PATCH一般向单个资源uri发起

 

DELETE:删除

DELETE/zoos/1/employees/2

DELETE/zoos/1/employees/2;4;5

DELETE/zoos/1/animals  //删除id1的动物园内的所有动物

 

状态码

 

    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

 

§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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

 

 

分页

 

{
  "page": 1,            # 当前是第几页
  "pages": 3,           # 总共多少页
  "per_page": 10,       # 每页多少数据
  "has_next": true,     # 是否有下一页数据
  "has_prev": false,    # 是否有前一页数据
  "total": 27           # 总共多少数据
}

 

 

、Response

{
data : { // 请求数据,对象或数组均可
user_id: 123,
user_name: "tutuge",
user_avatar_url: "http://tutuge.me/avatar.jpg"
...
},
msg : "done", // 请求状态描述,调试用
code: 1001, // 业务自定义状态码
extra : { // 全局附加数据,字段、内容不定
type: 1,
desc: "签到成功!"
}
}

返回结果用data字段作为key

 

错误处理

 

如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

 

 

{
    error: "Invalid API key"
}

 

 

参考网址:

http://tutuge.me/2016/05/02/design-json-api-respoense/

http://vb2005xu.iteye.com/blog/2304843

https://blog.csdn.net/bossaiaboy/article/details/64126334

https://blog.csdn.net/chenxiaochan/article/details/73716617

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

https://www.jianshu.com/p/8b769356ee67

https://blog.csdn.net/u013731455/article/details/56278168

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2018-06-01 22:40  风又奈何  阅读(222)  评论(0编辑  收藏  举报