REST(表现性状态转移)是大多数Web API使用的架构风格——但”REST API”这个名称被不一致地使用,许多所谓的REST API违反了原始设计原则。以下是REST实际上是什么以及为什么这些原则中的一些很重要。
核心原则
面向资源:API应该暴露资源(名词),而非操作(动词)。GET /users/123是REST;GET /getUser?id=123是基于HTTP的RPC,而非REST。HTTP方法有含义:GET(读取,安全,幂等)、POST(创建)、PUT(更新/替换,幂等)、PATCH(部分更新)、DELETE(删除)。对所有事情使用POST忽略了协议语义。无状态:每个请求包含所需的所有信息——服务器上请求之间没有会话状态。状态码有含义:200(成功)、201(已创建)、400(错误请求——客户端错误)、401(未授权)、403(禁止)、404(未找到)、500(服务器错误)。在响应体中返回{“error”: “not found”}并带200状态码是REST反模式。
URL设计
资源使用复数名词:/users、/orders、/products。嵌套资源表达关系:/users/123/orders(属于用户123的订单)。URL中避免动词:/users/123/activate是错误的;PATCH /users/123 {“active”: true}更好。使用查询字符串进行过滤和排序:/products?category=books&sort=price&order=asc。
每个人都搞错的状态码
404意味着资源不存在,而非搜索返回无结果。GET /search?q=nothing返回404是错误的——返回200并带空的结果数组。422(不可处理的实体)是验证失败的正确状态,而非400(意味着请求格式错误)或200。
何时不使用REST
当客户端需要灵活地获取数据时(避免过度获取),GraphQL更好。对于内部服务间通信(模式优先、高效二进制协议),gRPC更好。REST适用于公共API、移动后端和任何简单性和广泛客户端支持重要的情况。




