Restful API设计规范

api设计遵循RESTful API设计规范。可以参考:《RESTful API 设计指南》

关键字介绍:

  • {endpoint}: 路径,在这里具体指的是表名。如:"/api/users"
  • {id}: 表的主键。一般为int的自增id。如:"/api/users/1"
  • {key_field}: 表的唯一字段,用于快速定位资源。使用格式:"/api/users/@windpro"
  • {sub_field}: 子资源字段。例如用户组的字段为: groups. 则这样使用:"/api/users/@windpro/groups"

数据查询

GET /api/{endpoint}

集合查询。支持的参数:GET Params.

例子:返回所有 users instances.

GET /api/users

HTTP/1.1 200 OK
{
  "total": 3,
  "items": [{"id": 1, "name": "windpro"}, ...]
}

例子:返回名称为"windpro"的用户

GET /api/users?name=windpro

HTTP/1.1 200 OK
{
  "total": 1,
  "items": [{"id": 1, "name": "windpro"}]
}

GET /api/{endpoint}/{id}

返回单个资源对象。支持GET Params.

相同功能api:

  • GET /api/{endpoint}/{key_field}

例子:获取id为1的用户

GET /api/users/1

HTTP/1.1 200 OK    
{
  "id": 1,
  "name": "windpro"
}

使用keyfield获取例子

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.Unicode(32), unique=True)

apimanager.add(User, methods=['GET', 'POST', 'DELETE'], key_field="name")
GET /api/users/@windpro

HTTP/1.1 200 OK    
{
  "id": 1,
  "name": "windpro"
}

GET /api/{endpoint}/{id}/{sub_field}

返回所有的子资源。支持的参数:GET Params.

相同功能api:

  • GET /api/users/{key_field}/{sub_field}

例子:返回windpro用户所有组

GET /api/users/1/groups

HTTP/1.1 200 OK
{
  "total": 2,
  "items": [{"id": 1, "name": "admin"}, ...]
}

例子:返回windpro用户的admin组信息

GET /api/users/1/grups?name=admin HTTP/1.1

HTTP/1.1 200 OK
{
  "total": 1,
  "items": [{"id": 1, "name": "admin"}]
}

创建资源

POST /api/{endpoint}

创建一个或者多个实例

具有相同作用的api,区别是它们将url字段数据填入request data中:

  • POST /api/{endpoint}/{id}
  • POST /api/{endpoint}/{key_field}

例子:创建一个用户。

POST /api/users
{
  "name": "windpro"
}

HTTP/1.1 201 Created
{
  "id": 1,
  "name": "windpro"
}

例子:创建多个用户。

POST /api/users
[
  {
    "name": "windpro"
  },
  {
    "name": "alex"
  }
]

HTTP/1.1 201 Created
[
  {
    "id": 1,
    "name": "windpro"
  },
  {
    "id": 1,
    "name": "alex"
  }
]

POST /api/users/{id}/{sub_field}

新增一个或多个子资源。被添加的资源不存在会自动创建。

具有相同作用的api:

  • POST /api/users/{key_field}/{sub_field}

Sample Request

这里以Users.groups关系作为例子

例子:windpro 用户添加一个 admin 组。

POST /api/users/1/groups HTTP/1.1
{
  "name": "admin"
}

HTTP/1.1 200 OK
{
  "id": 1,
  "name": "admin"
}

例子:windpro 添加 admin 和 normal 组。

POST /api/users/1/groups HTTP/1.1
[
  {
    "name": "admin"
  },
  {
    "name": "normal"
  }
]

HTTP/1.1 200 OK
[
  {
    "id": 1,
    "name": "windpro"
  },
  {
    "id": 2,
    "name": "normal"
  }
]

修改资源

PUT /api/{endpoint}/{id}

修改一个或多个实例.
当实例不存在的时候会创建实例。

具有相同作用的api:

  • PUT /api/{endpoint}
  • PUT /api/{endpoint}/{key_field}
  • PATCH /api/{endpoint}
  • PATCH /api/{endpoint}/{id}
  • PATCH /api/{endpoint}/{key_field}

例子:修改用户的年龄

PUT /api/users/1 HTTP/1.1
{
  "age": 26
}

HTTP/1.1 200 OK
{
  "id": 1,
  "name": "windpro",
  "age": 26
}

PUT /api/users/{id}/{sub_field}

替换子资源,原有的关系将被清空

具有相同作用的api:

  • PUT /api/users/{key_field}/{sub_field}
  • PATCH /api/users/{id}/{sub_field}
  • PATCH /api/users/{key_field}/{sub_field}

例子:替换windpro用户的所有组

PUT /api/users/@windpro/groups HTTP/1.1
[
  {
    "name": "admin"
  },
  {
    "name": "normal"
  }
]

HTTP/1.1 200 OK
[
  {
    "id": 1,
    "name": "admin"
  },
  {
    "id": 2,
    "name": "normal"
  }
]

删除资源

DELETE /api/{endpoint}/{id}

删除单个实例

具有相同作用的api:

  • DELETE /api/{endpoint}/{key_field}
  • DELETE /api/{endpoint}:可批量操作,查找规则为 id 或 unique key。

例子:删除windpro用户

DELETE /api/users/@windpro

HTTP/1.1 204 No Content

DELETE /api/users/{id}/{sub_field}

删除关系。查找规则为 id 或 unique key

具有相同作用的api

  • DELETE /api/users/{key_field}/{sub_field}

例子:删除 windpro 用户的 admin 组

DELETE /api/users/1/groups HTTP/1.1
[
  {
    "name": "admin"
  }
]

HTTP/1.1 204 No Content