REST这个概念表示representational state transfer,由 Roy Fielding 在2000年提出,并应用于HTTP1.1的实现,与URI的标准的设计。
其中下列几个要求
- Client-server architecture:服务端与客户端相分离,
- Statelessness:无状态,在请求之间,没有客户端的信息存储在服务端。每一个从客户端来的请求都包含足够信息,使服务端能够处理对应请求。(这里通过session来使用server-side cookie从而保存客户端的信息就是不允许的了。 【链接】)
- Cacheability:可缓存,发送同样的请求能够得到同样的相应。(在滴滴工作的同学说的一个案例,实现一个机器学习模型的时候,由于请求一次计算时间过长,算力要求很高,而一天内基本都是同一个请求。在不更改任何代码的情况下,直接通过中间件将请求缓存起来就不用重复计算了。)
- Layered system:分层系统,无需知道服务器情况,如中间有没有负载平衡组件之类的,无需知道请求的使哪一个服务器。便于系统扩容。
- Code on demand (optional):可选项,客户端能实现服务端功能。如java applets,这个太老了,现在也很少这样做了。
- Uniform interface:接口一致
- Resource identification in requests:请求的资源可以在请求中找到相关信息。并且不同的资源的表示不同,能够相互区分。例如使用不同的URI,
- Resource manipulation through representations:通过使用客户端保存的状态能够更改资源状态。
- Self-descriptive messages:信息包含足够内容来描述如何处理信息,如带上media类型符号等
- Hypermedia as the engine of application state:客户端能通过提供的链接等访问到服务器所提供的所有资源。并且服务端能返回包含其他资源的超链接供客户端访问。
一般服务器返回的格式为 HTML, XML, JSON等。
并且POST,PUT,DELETE等HTTP方法何时使用,有相应的规范,返回状态码也一般根据服务器处理情况返回不同状态码(很多的中间件什么的也可以通过状态码来处理返回)。