RESTFul API及幂等性
RESTful是一种API设计风格,用于client和server之间的数据交互。它不是标准也不是协议,而是一组设计原则和约束条件。
RESTful的主要原则有:
- 使用HTTP方法:GET查询资源,POST创建资源,PUT更新资源,DELETE删除资源。
- 资源(Resources)设计:将API结构化为可识别的资源,每个资源都有唯一的URL来标识。
- 无状态(Stateless):请求之间不保存状态,每个请求必须包含所有的信息。
- 层次结构(Hierarchy):资源可组成层次结构,从而形成连贯的API。
- 用途统一(Uniform Interface):使用标准的HTTP方法操作资源,返回标准HTTP状态码。
- 可缓存(Cacheable):资源的响应可以标记为可缓存,以提高系统性能。
- 客户端-服务器(Client-Server):RESTful API遵循C/S架构,客户端和服务器之间进行资源请求和响应。
- 分布式的(Layered System):客户端不需要知道服务器的结构,服务器也不需要知道数据的来源。
- 代码即链接(Code on Demand):允许返回可执行代码,如JavaScript。
RESTful API的主要优点是:
- 简单易于理解,灵活扩展, loose coupling。
- 服务端与客户端之间解耦,服务器无状态,适合于分布式环境。
- 缓存支持,可以提高性能。
- 易于测试自动化,支持持续集成。
主流Web服务框架 wie SpringMVC 和 Express 都支持构建RESTful API。RESTful API已经被广泛应用于互联网领域,是当下主流的API设计规范。所以,理解RESTful设计原则和如何构建RESTful API对于开发高质量的Web服务至关重要。它是现代Web应用开发人员必备的一项重要技能。
幂等性(Idempotence)是RESTful API的一个重要特性。一个幂等的API意味着对同一个资源执行同一操作多次,服务端状态不发生变化,且返回相同的结果。
RESTful API中的幂等操作主要是:
- GET:查询资源,永远是幂等的。无论查询多少次,服务器状态不变,返回相同结果。
- PUT:更新资源,也应该是幂等的。多次 PUT 同一资源,服务器状态不变,返回相同结果。
- DELETE:删除资源,同样应该是幂等的。无论删除多少次,服务器状态相同,返回相同结果。
- POST不是幂等操作,因为执行多次POST会在服务器上创建多个资源,状态和结果发生变化。
为什么RESTful API需要支持幂等性?主要有以下几点原因:
- 网络不可靠,客户端可能发送了请求但没有收到响应。此时无法判断服务端是否已经处理,如果再次发送请求就需要确保服务端状态不变。
- 防止重复提交。用户可能多次点击提交按钮,如果每个提交都产生影响就可能导致意外的状态变化。
- 支持缓存。中间代理可以直接返回缓存结果,而不需要转发请求到服务器。这需要请求是幂等的。
- 简化重试机制。如果请求是幂等的,客户端可以简单地重试,而不需要额外判断服务端的状态。
幂等性是RESTful系统的必要约束条件。若不满足,就不再是RESTful。所以,设计RESTful API时,对于可能造成状态变化或副作用的操作,要慎重考虑其幂等性。如果不满足幂等性,在实现上也要做相应措施以防止重复执行导致意外。幂等性是RESTful API设计的一个重要的原则和特性,理解它的含义和如何在设计中体现对构建高质量RESTful API非常重要。