Restful接口规范

729 阅读3分钟

RESTful API

RESTful API(Representational State Transfer)是一种设计风格,用于设计网络应用的轻量级、可维护的接口。

RESTful接口原则

  1. 无状态:每个请求从客户端到服务器必须包含所有必要的信息来理解和处理请求。服务器不会存储任何客户端请求之间的信息。
  2. 统一接口:客户端和服务器之间的接口被统一为一组标准的HTTP方法,如GET、POST、PUT、DELETE等。
  3. 可缓存:响应应该被标记为可缓存或不可缓存,以提高性能。
  4. 分层系统:客户端不应该了解它正在与之通信的服务器之上或之下的层。
  5. 按需代码:服务器有能力向客户端提供执行特定功能的代码(例如,JavaScript),客户端可以选择执行。
  6. 统一接口:RESTful API应该使用统一接口简化和隐藏内部逻辑。

RESTful API 设计步骤:

  1. 确定资源:确定你的API需要操作哪些资源。资源是任何可以被命名的事物,如用户、产品、文章等。

  2. 使用名词而非动词:资源应该用名词表示,而操作则通过HTTP方法来定义。

  3. 定义HTTP方法

    • GET:读取资源。
    • POST:创建新资源。
    • PUT:更新现有资源或创建新资源。
    • DELETE:删除资源。
    • PATCH:部分更新资源。
  4. 使用状态码:使用HTTP状态码来表示操作结果,例如:

    • 200 OK:请求成功。
    • 201 Created:资源创建成功。
    • 204 No Content:请求成功,但没有内容返回。
    • 400 Bad Request:客户端请求有语法错误。
    • 401 Unauthorized:请求未经授权。
    • 404 Not Found:资源未找到。
    • 500 Internal Server Error:服务器内部错误。
  5. 使用资源标识符:使用URI来唯一标识资源。

  6. 使用过滤、排序、搜索和分页:提供查询参数来过滤、排序、搜索和分页数据。

  7. 使用HATEOAS:超媒体作为应用程序状态的引擎(Hypermedia As The Engine Of Application State),即API应该提供足够的信息来让客户端知道下一步可以做什么。

  8. 错误处理:定义清晰的错误响应格式,以便客户端能够理解和处理。

  9. 版本控制:在URI或通过请求头来管理API版本。

  10. 安全性:确保API的安全,使用OAuth、JWT等认证和授权机制。

RESTful API示例

RESTful API设计

基础URLhttps://api.example.com/v1

  • 创建新实验

    • POST /experiments
    • 请求体包含算法ID、参数集和任何其他元数据。
  • 获取实验列表

    • GET /experiments
  • 获取特定实验的详细信息

    • GET /experiments/{experimentId}
  • 更新实验参数

    • PUT /experiments/{experimentId}/parameters
  • 启动实验(如果API支持自动执行):

    • POST /experiments/{experimentId}/start
  • 停止实验(如果API支持):

    • POST /experiments/{experimentId}/stop
  • 获取实验结果

    • GET /results/{resultId}
  • 获取特定实验的所有结果

    • GET /experiments/{experimentId}/results
  • 删除实验

    • DELETE /experiments/{experimentId}
  • 获取参数模板(如果API提供预定义的参数模板):

    • GET /parameters/templates/{templateId}
  • 保存模型(当实验完成后):

    • POST /models
    • 请求体包含实验ID和模型的元数据。
  • 获取模型列表

    • GET /models
  • 获取特定模型的详细信息

    • GET /models/{modelId}
  • 删除模型

    • DELETE /models/{modelId}

请求和响应示例

创建新实验

POST /experiments
Host: api.example.com
Content-Type: application/json

{
  "algorithmId": "123",
  "parameters": {
    "learning_rate": 0.01,
    "n_estimators": 100
  },
  "description": "Initial experiment with default parameters."
}

响应

HTTP/1.1 201 Created
Content-Type: application/json

{
  "experimentId": "456",
  "status": "created",
  "message": "Experiment created successfully."
}

获取实验列表

GET /experiments
Host: api.example.com

响应

HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "experimentId": "456",
    "algorithmId": "123",
    "status": "running",
    "parameters": {
      "learning_rate": 0.01,
      "n_estimators": 100
    }
  },
  ...
]

更新实验参数

PUT /experiments/456/parameters
Host: api.example.com
Content-Type: application/json

{
  "parameters": {
    "learning_rate": 0.005,
    "n_estimators": 200
  }
}

响应

复制
HTTP/1.1 200 OK
Content-Type: application/json

{
  "experimentId": "456",
  "status": "updated",
  "message": "Experiment parameters updated successfully."
}