在现代的 web 应用开发中,RESTful API 已经成为了一种非常流行的 API 设计风格。虽然它的设计原则和优点已经被广泛的认识和理解,但是在实践中还是存在许多的误区和不当的设计选择。本文将为大家详细分析 RESTful API 设计中的常见误区,帮助开发人员避免这些错误,保证开发出优秀的 RESTful API。
本文将从以下几个方面进行讨论:
- GET, POST, PUT 和 DELETE 操作的定义和用处
- 响应状态码以及错误处理
- URL 的设计
- 资源的设计和命名
- Hypermedia 和 HATEOAS
GET, POST, PUT 和 DELETE 操作的定义和用处
在 RESTful API 中,HTTP 协议提供了四个常用的操作:GET、POST、PUT 和 DELETE。正确理解和使用这些操作是设计 RESTful API 的基础。
GET
GET 方法用于获取某个资源的信息。在设计 API 时,GET 方法应该只用于查询数据,而不应该对数据库产生影响,也不应该产生副作用。
例如,查询用户列表的 API 可以这样设计:
GET /users
POST
POST 方法用于创建新的资源。在设计 API 时,POST 方法应该只用于新增数据,而不应该用于更新数据。且应该在请求体中包含新资源的信息。
例如,新增用户的 API 可以这样设计:
POST /users
PUT
PUT 方法用于更新指定的资源。在设计 API 时,PUT 方法应该只用于更新整个资源,而不应该用于部分更新。且应该在请求体中包含更新后的整个资源。
例如,更新用户信息的 API 可以这样设计:
PUT /users/{id}
DELETE
DELETE 方法用于删除指定的资源。在设计 API 时,DELETE 方法应该只用于删除数据,而不应该用于查询或更新数据。
例如,删除用户的 API 可以这样设计:
DELETE /users/{id}
响应状态码以及错误处理
HTTP 协议提供了丰富的状态码用以描述响应的状态。在 RESTful API 设计中,正确使用状态码是十分重要的。HTTP 响应码 200 表示请求成功,而 HTTP 响应码 404 则表示找不到资源等等,具体可以参考 HTTP 协议说明。
在错误处理中,应该使用适当的状态码来表示错误的类型,而不仅仅是返回一个字符串。例如,当请求的参数缺失或不合法时,可以使用状态码 400。当请求需要认证或授权时,可以使用状态码 401 或 403。在服务器端出现内部错误时,可以使用状态码 500。
错误响应应该包含错误的描述和可能的解决方案。
例如,缺失必须参数的请求,可以返回如下的错误响应:
HTTP/1.1 400 Bad Request Content-Type: application/json { "error_code": "missing_parameter", "message": "The 'name' parameter is missing.", "solution": "Please provide the 'name' parameter and try again." }
URL 的设计
URL 是 RESTful API 中的一个核心元素,它应该被设计为简洁可读且易于理解。URL 应该描述资源的层次结构,并避免在 URL 中包含任何业务逻辑。
URL 可以采用两种方式来描述资源层次结构:层级式 URL 和 平铺式 URL。
在层级式 URL 中,URL 的层次结构反映了资源之间的层次关系。例如,一个博客网站的 URL 可以这样设计:
GET /blogs # 获取所有的博客 POST /blogs # 新增一篇博客 GET /blogs/{id} # 获取指定 id 的博客 PUT /blogs/{id} # 更新指定 id 的博客 DELETE /blogs/{id} # 删除指定 id 的博客
在平铺式 URL 中,URL 的结构更扁平化,每个资源都是独立的。例如:
GET /blogs # 获取所有的博客 POST /blog/{id} # 新增或更新指定 id 的博客 DELETE /blog/{id} # 删除指定 id 的博客
无论使用哪种方式描述资源,URL 都应该保证可读性。
资源的设计和命名
在 RESTful API 中,资源是指数据或服务的一个唯一表示。资源应该按照信息建模的方法进行设计,而不是按照数据库模式进行设计。
资源应该拥有一个唯一的 ID,并在 URL 中使用该 ID 进行标识。资源的属性或数据应该作为 JSON 或 XML 输出。在设计资源属性时,应该避免使用与 HTTP 查询参数相同的名称,以免引起混淆。
资源的命名应该尽可能地简洁明了,同时表达出其所代表的业务含义。例如:
/blogs # 博客列表 /blog/{id} # 指定 id 的博客
资源的设计和命名应该遵循以下原则:
- 避免使用单数和复数的混合。
- 使用小写字母,并用破折号分隔不同的单词。
- 避免使用动词,除非在表示操作时。
Hypermedia 和 HATEOAS
Hypermedia 和 HATEOAS 是 RESTful API 设计的两个关键元素。
Hypermedia 是指提供超文本链接来引导用户浏览资源的方式。Hypermedia 可以被视为浏览网页的一种方式,也就是说每个资源都应该有相关联的链接,从而使得 API 的使用更加灵活友好。
HATEOAS 全称为 Hypermedia As The Engine Of Application State,即超媒体即应用状态的引擎,是 RESTful API 设计的另一个核心概念。它的主要思想是,客户端不应该先预设和后台的通信流程和协议,而是应该按照资源模型的方式动态浏览资源的结构和关系。
一个 HATEOAS 的 API 应该将具有不同关系的资源通过超媒体相关性链接起来。这允许客户端在不事先定义 API 全貌的前提下从服务端发现和构建出自己的工作流程。通过动态构建访问路径和资源标识符,HATEOAS 可以极大地简化 API 的使用方式,使其具有更大的可复用性和扩展性。
总结
本文详细分析了 RESTful API 设计中的常见误区。在进行 API 设计时应该遵循这些原则,以保证 API 的可读性、可维护性和可扩展性。如果你遵循了这些原则,你将会自如地设计出优秀的 RESTful API,充分利用它带来的优势和便利。下面的示例代码可以帮助你更好地理解这些概念。
示例代码:
-- -------------------- ---- ------- -- ------ --- ------ -- ---- ---- ------ - ------- ----- ----- -------- ---------------------- ----------- ------------- - -- ------ --- ----------- - ------- ----- ----- -------- ---------------------- ----------- ------------- - -- ---- ------ ----------- -- ---- -------- --- --- ------- ------------- ---------------- - ------------- -------------------- ---------- ---- ------ --------- -- ---------- ----------- ------- ------- --- ------ --------- --- --- ------- - -- ---- --- ------ -- -- -- --- --- ---------- -- ---- -- --- ------ ----------
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6643b174d3423812e41a998f