[toc]
>= 三层,则使用'?'带参数 PUT/PATCH
DELETE:删除资源
很多客户只支持GET/POST请求,一般有两种方式模拟PUT等请求
/users/1?_method=put&name=111 X-HTTP-Method-Override: PUT /users/1?state=closed ?type=1&state=closed
+ 升序,如?sort=+create_time,根据id升序 - 降序,如?sort=-create_time,根据id降序 ?limit=10&offset=10
使用 , 分隔,如
/users/1?fields=name,age,city 三种方案:
自定义Media-Type参考资料 github
| Code | Method | Describe |
|---|---|---|
| 200 | ALL | 请求成功并返回实体资源 |
| 201 | POST | 创建资源成功 |
| Code | Method | Describe |
|---|---|---|
| 400 | ALL | 一般是参数错误 |
| 401 | ALL | 一般用户验证失败(用户名、密码错误等) |
| 403 | ALL | 一般用户权限校验失败 |
| 404 | ALL | 资源不存在(github在权限校验失败的情况下也会返回404,为了防止一些私有接口泄露出去) |
| 422 | ALL | 一般是必要字段缺失或参数格式化问题 |
| CODE | METHOD | DESCRIBE |
|---|---|---|
| 500 | ALL | 服务器未知错误 |
以上是常见的状态码,完整的状态码列表在这 状态码
在介绍HATEOAS之前,先介绍一下REST的成熟度模型
在介绍 HATEOAS 之前,先介绍一下 Richardson 提出的 REST 成熟度模型。该模型把 REST 服务按照成熟度划分成 4 个层次:
HATEOAS(Hypermedia as the engine of application state)是 REST 架构风格中最复杂的约束,也是构建成熟 REST 服务的核心。它的重要性在于客户端和服务器之间的解耦。
request请求,查询user,每页显示10条,从第10条开始显示(第二页)
/users?limit=10&offset=10 response
{ data: { xxxx }, meta: { _link: [ {rel: 'self', href: 'xxx/users?limit=10&offset=10'}, {rel: 'first', href: 'xxx/users?limit=10&offset=0', title: 'first page'}, {rel: 'last', href: 'xxx/users?limit=10&offset=50', title: 'last page'}, {rel: 'prev', href: 'xxx/users?limit=10&offset=0', title: 'prev page'}, {rel: 'next', href: 'xxx/users?limit=10&offset=20', title: 'next page'} ] } } _link 返回了5个资源
如用户查询一个订单
request
/orders/1 response
{ data: { xxx }, meta: { _link: [ {rel: 'self', href: 'xxx/orders/1'}, {rel: 'related', href: 'xxx/orders/1/payment', title: 'pay the order'} ] } } _link 返回两个资源
/order/1/payment 用户可以使用此资源进行支付 request
/orders/1 response
{ data: { xxx }, meta: { _link: [ {rel: 'self', href: 'xxx/orders/1'}, {rel: 'edit', href: 'xxx/orders/1', title: 'edit the order'}, {rel: 'delete', href: 'xxx/orders/1', title: 'delete the order'} ] } } 此用户拥有修改与删除订单的权限,因此返回了3个资源
| rel | describe |
|---|---|
| self | 资源本身,每个资源表述都一个包含此关系 |
| edit | 指向一个可以编辑当前资源的链接 |
| delete | 指向一个可以删除当前资源的链接 |
| item | 如果当前资源表示的是一个集合,则用来指向该集合中的单个资源 |
| collection | 如果当前资源包含在某个集合中,则用来指向包含该资源的集合 |
| related | 指向一个与当前资源相关的资源 |
| first、last、prev、next | 分别用来指向第一个、最后一个、上一个和下一个资源 |
由以上例子可以看出 _link 就是以Hyperlink表述资源与资源之间的关系,这种方式使客户端与服务端能很好的分离开来,只要接口的定义不变,客户端与服务端就可以独立的开发和演变。