RESTful 架构详解

753 阅读4分钟

RESTful 架构详解

RESTful(Representational State Transfer,表述性状态转移)是一种‌软件架构风格‌,主要用于设计网络应用程序的 API(应用程序接口)。它基于 HTTP 协议,强调‌资源‌的表述和状态转移,适用于分布式系统和 Web 服务开发。

应用其实也简单,我觉得吧,就是和注解结合,做成一种统一的代码风格,看起来比较整齐,闲话稍许,让我们回到正题.


1. RESTful 的核心概念

(1) 资源(Resource)

  • RESTful 的核心是‌资源‌,每个资源都有一个唯一的标识符(URI)。

  • 例如:

    • /users 表示用户集合
    • /users/1 表示 ID 为 1 的用户

(2) 表述(Representation)

  • 资源可以有多种表述形式(如 JSON、XML、HTML)。
  • 客户端通过 HTTP 请求获取资源的某种表述(如 Accept: application/json)。

(3) 状态转移(State Transfer)

  • 客户端通过 HTTP 方法(GET、POST、PUT、DELETE)操作资源,改变其状态。

  • 例如:

    • GET /users 获取用户列表
    • POST /users 创建新用户
    • PUT /users/1 更新用户 1
    • DELETE /users/1 删除用户 1

(4) 无状态(Stateless)

  • 服务器不存储客户端会话信息,每次请求必须包含所有必要信息(如 Token、Session ID)。
  • 优点:提高可扩展性,降低服务器负担。

2. RESTful 的设计原则

(1) 统一接口(Uniform Interface)

  • 使用标准的 HTTP 方法(GET、POST、PUT、DELETE)操作资源。
  • 资源通过 URI 唯一标识。
  • 使用 HTTP 状态码表示操作结果(如 200 OK404 Not Found)。

(2) 资源导向(Resource-Oriented)

  • 所有操作围绕资源进行,URI 应清晰表达资源层级。

  • 例如:

    • /users(用户集合)
    • /users/1/orders(用户 1 的订单)

(3) 无状态通信(Stateless Communication)

  • 服务器不保存客户端状态,每次请求独立处理。

  • 例如:

    • 使用 JWT(JSON Web Token)进行身份验证,而不是 Session。

(4) 可缓存(Cacheable)

  • 使用 HTTP 缓存机制(如 Cache-ControlETag)提高性能。

(5) 分层系统(Layered System)

  • 客户端无需知道服务器架构细节(如负载均衡、CDN)。

(6) 按需代码(Code-On-Demand,可选)

  • 服务器可以返回可执行代码(如 JavaScript),但这不是必须的。

3. RESTful API 设计规范

(1) URI 设计

  • 使用名词,而不是动词‌(资源导向):

    • ✅ /users(正确)
    • ❌ /getUsers(错误)
  • 使用小写字母和连字符(- ‌:

    • ✅ /user-profiles
    • ❌ /UserProfiles
  • 避免文件扩展名‌:

    • ✅ /users/1
    • ❌ /users/1.json
  • 层级关系用 / 表示‌:

    • /users/1/orders(用户 1 的订单)

(2) HTTP 方法使用

方法用途幂等性安全性
GET获取资源✅ 是✅ 是
POST创建资源❌ 否❌ 否
PUT更新资源(全量替换)✅ 是❌ 否
PATCH更新资源(部分修改)❌ 否❌ 否
DELETE删除资源✅ 是❌ 否

(3) HTTP 状态码

状态码含义适用场景
200 OK请求成功GET/PUT/PATCH/DELETE 成功
201 Created资源创建成功POST 成功
204 No Content无返回内容DELETE 成功
400 Bad Request请求错误参数校验失败
401 Unauthorized未授权未登录
403 Forbidden禁止访问权限不足
404 Not Found资源不存在URI 错误
500 Internal Server Error服务器错误代码异常

(4) 数据格式

  • 请求/响应通常使用 JSON‌:

    jsonCopy Code
    {
      "id": 1,
      "name": "张三",
      "email": "zhangsan@example.com"
    }
    
  • 支持 Content-Type 和 Accept 头‌:

    • Content-Type: application/json(请求体格式)
    • Accept: application/json(期望的响应格式)

4. RESTful vs. SOAP vs. GraphQL

特性RESTfulSOAPGraphQL
协议HTTPHTTP/SMTPHTTP
数据格式JSON/XMLXMLJSON
查询灵活性固定端点固定端点动态查询
性能较高(可缓存)较低(XML 冗长)高(按需查询)
适用场景CRUD 操作企业级 API复杂数据查询

5. 实际示例(Spring Boot RESTful API)

javaCopy Code
@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping
    public List<User> getAllUsers() {
        return userService.findAll();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.findById(id);
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.update(id, user);
    }

    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}

6. 总结

✅ ‌RESTful 的优点‌:

  • 简单、易理解、符合 HTTP 标准
  • 可扩展性强(无状态、可缓存)
  • 适用于 Web、移动端、微服务架构

❌ ‌RESTful 的缺点‌:

  • 不适合实时通信(如 WebSocket)
  • 复杂查询可能需多次请求(GraphQL 更适合)

RESTful 是目前最流行的 API 设计风格,适用于大多数 Web 服务开发场景。