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 | { |
返回结果
针对不同操作,服务器向用户返回的结果应该符合以下规范:
GET/collections:返回资源对象的列表(数组)
GET/collections/identity:返回单个资源对象
POST/collections/identity:返回新生成的资源对象
PUT/collections/identity:返回更新后的完整的资源对象
PATCH/collections/identity:返回资源被修改的属性
DELETE/collections/identity:返回204状态码和一个空的响应体