restful 风格 web api规范

时间:2021-08-13 04:13:12

api: 标明api接口服务

xxx: 服务

xxx: 资源

版本控制:

一、使用MediaType,即在请求头header中做版本控制,数据格式等控制

想要获取的资源格式

GET /user/123456 HTTP/1.1 

Accept: application/vnd.123456.user-v3+json

获取v3版userid为123456 的用户信息,返回资源格式为json

响应的文本格式

HTTP/1.1 200 OK 

Content-Type: application/vnd.123456.user-v3+json 

{"user":  {userId":"123456","name":"张三"} } 

服务端响应v3版userId为123456 的用户信息,返回资源格式为json

严格遵守restful风格,可读性差

二、URI中添加版本信息

/xxx

缺点:版本的不同会导致同一个资源对应多个uri,后期维护非常麻烦(亲身经历,令人头疼)

三、通过传输固定参数字段 version,比较折中的方法,维护也比较方便

动词(动作):

GET 获取资源

POST 创建资源

PUT 更新资源(客户端提供改变后的完整资源)

PATCH 更新资源(客户端提供改变的属性)

DELETE 删除资源

HEAD 获取资源元数据

OPRATIONS 获取资源属性,,哪些是可修改的,属性描述等等

例:GET /user/{userId}    获取用户信息

    POST /user                创建用户

  PUT /user/{userId}    更新项目信息

DELETE /user/{userId}  删除项目信息

安全和幂等

安全性:不会改变资源状态,可以理解为只读的;

幂等性:执行1次和执行N次,对资源状态改变的效果是等价的。

 

 

安全性

 

幂等性

 

GET

 

 

 

POST

 

×

 

×

 

PUT

 

×

 

 

PATCH

 

×

 

 

DELETE

 

×

 

 

HEAD

 

 

 

OPRATIONS

 

 

 

 

URI规则:

1、uri 标志唯一资源,语义明确

例:用户服务

/user/users/{userId} 

GET /user/users/{userId} 表示查询

PUT /user/users/{userId} 表示更新

单个项目是网络上的资源,一个uri唯一标识,不应该根据操作的不同,版本的不同而改变

2、单/复数查询

复数以对应单数名词的复数形式表示

例:

获取用户信息

GET /user/users/{userId}

获取所有用户

GET /user/users

获取某个用户的所有订单信息

GET /user/users/{userId}/orders

获取某个用户的所有某个订单信息

GET /user/users/{userId}/orders/{orderId} 

2、复杂查询

restful 允许url 冗余,允许以 ?name=value的形式过滤资源信息(根据业务的具体情况需要定义一些约定参数,例order排序方式,limit 每页记录 offset 起始记录)

 

 

表示

 

备注

 

过滤条件

 

?status=1&type=2

 

资源也可以表示为

/user/users?userId=123456

/user/users/123456

 

排序

 

?sort=time,desc

 

 

 

投影

 

?selectlist=userId,name,status

 

 

 

分页

 

?limit=10&offset=1

 

 

 

例:

获取前10条用户数据

GET /user/users?limit=10

获取第一页用户数据,每页显示10条

GET /user/users?offset=1&limit=10

按时间倒排序获取第一页项目数据,每页显示10条

GET /user/users/?offset=1&limit=10&sort=time,desc

响应数据

响应数据尽可能包含全面信息

{

//response 状态信息

"statusCode": 404,

"statusLine": HTTP/1.1 200 OK,

"requestData":{"limit":10,"offset":1},

"responseData":{

//业务状态

errorCode:20001

errorMessage:"签名无效"

data{

"paging":{"limit":10,"offset":1,"total":100},

"users":[{},{},{}]

}

}  

}

响应数据可以包含另一个资源的请求信息信息

{

//response 状态信息

"statusCode": 200,

"statusLine": HTTP/1.1 200 OK

"requestData":{"userId":"123456"},

"responseData":{

//业务状态

errorCode:1

errorMessage:"成功"

data{

"user":["userId":"123456",

         "blod":"http://blod.exmple.com/userId=123456"

        ]

}

}  

}

restful 风格 web api规范