0%

简易的RESTfulAPI设计指南

HTTP协议

菜鸟教程—HTTP简介 比本文写的好+.+

URL:

格式:schema://host[:post]/path[?query-string][#anchor]

  • schema 指定底层使用的协议(例如:http,https,ftp…)
  • host 服务器的IP地址或者域名
  • port 服务器端口,http默认80,https默认443
  • path 资源访问的路径
  • query-string 发送给http服务器的数据
  • anchor 锚,当使用命名锚(named anchors)时,我们可以创建直接跳至该命名锚(比如页面中某个小节)的链接,这样使用者就无需不停地滚动页面来寻找他们需要的信息了。

请求

格式:请求行、消息报头、请求正文

  • 请求行:Method Request-URI HTTP-Version CRLF (请求方法 请求地址 请求所使用的HTTP版本号(v1.0、v1.1)回车换行)

    eg. GET/HTTP/1.1

响应

格式:状态行、消息报头、响应正文

  • 状态行:HTTP-Version Status-Code Reason-Phrase CRLF

    eg. HTTP/1.1 200 OK

    常用状态码:

    • 200 OK //客户端请求成功
    • 400 Bad Request //客户端请求有语法错误,服务器无法理解
    • 401 Unauthorized //服务器收到请求,但拒绝服务
    • 404 Not Found //服务器无法根据客户端的请求找到资源
    • 500 Internal Server Error //服务器内部错误,即有bug啊
    • 503 Service Unavailable //由于超载或系统维护,服务器暂时的无法处理客户端的请求。

设计RESTful API

资源路径

在RESTful架构中,每个网址代表一种资源,所以网址中不能有动词,只能有名词。

一般来说API的名词应该使用复数

举例:

举例来说,有一个API提供动物园的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样:

  • 动物园资源:https://api.example.com/vi/zoos ,版本号也可以放在请求头中

  • 动物资源:https://api.example.com/vi/animals

  • 雇员资源:https://api.example.com/vi/employees

请求Method

  • POST/zoos:新建一个动物园
  • GET/zoos/ID:获取某个指定动物园的信息
  • PUT/zoos/ID:更新某个指定动物园的信息
  • DELETE/zoos/ID:删除某个动物园

过滤信息

如果记录数量很多,服务器不可能都将他们返回给客户,API应该提供参数,过滤返回结果(分页)

举例:

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

状态码

  • 200 OK 服务器成功返回用户请求的数据,该操作是幂等的

  • 201 CREATED 新建或修改数据成功

  • 204 NO CONTENT 删除数据成功//删除数据时是没有响应体的

  • 400 BAD REQUEST 用户发出的请求有错误,该操作幂等

  • 401 Unauthorized 表示该用户没有认证,不能执行当前操作 //没有提供认证参数

  • 403 Forbidden 表示用户权限不足,无权执行当前操作 //提供了认证参数,但还是被拒绝

  • 422 Unprocesable Entity 创建/更新对象时,发生数据验证错误 ,配合响应体返回相应信息

  • 500 Internal Server Error 服务器内部错误,无法完成请求

错误处理

如果状态码是4xx或者5xx,就应该向用户返回出错信息。一般返回信息中将”error“作为key,出错信息作为value(为了安全,不要将具体的服务器错误调用栈返回出去)

1
2
3
4
5
{

"error" : "参数错误"

}

返回结果

针对不同操作,服务器向用户返回的结果应该符合以下规范:

  • GET/collections:返回资源对象的列表(数组)

  • GET/collections/identity:返回单个资源对象

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

  • PUT/collections/identity:返回更新后的完整的资源对象

  • PATCH/collections/identity:返回资源被修改的属性

  • DELETE/collections/identity:返回204状态码和一个空的响应体