- GraphQL实战:写给全栈工程师们
- 王北南
- 645字
- 2025-03-01 05:50:31
1.4.3 RESTful API是否真的无状态
RESTful API的无状态并不意味着应用就真的没有状态了,否则用户登录等Web应用最基本的功能就无从谈起了。RESTful API的无状态其实是指服务器端不保存用户会话的状态。这里有两个关键点,一个是服务器端无状态,而不是客户端无状态,这意味着状态保存在了客户端。在Web应用中用cookie的形式来记录客户端的登录状态或者说是身份信息。另一个是用户会话,因为会话的状态没有保存在服务器端而是保存在了客户端,所以客户端是带着自己的身份信息一次又一次地请求服务器。类似地,浏览网页前进和回退这样的操作都依赖于用户历史操作的状态,这些状态也保存在客户端。当回退的时候,首先检查客户端的状态,找到上一次访问的URL,然后通过这个URL再一次请求服务器。服务器端是不记录访问历史的,更不知道用户是回退回来的,它只是用户要什么,就给用户什么而已。在服务器不止一台,或者存在不止一个服务进程的时候,任意一个服务器或者服务进程都可以来服务这个请求,而不需要一个特定的“记得”或者“认识”这个用户的服务器才能服务。这是最理想也是最可靠的方案,因为即使有一些服务器突然坏了,剩余的服务器仍然可以无差别地满足客户的访问请求。
很多读者会有服务器端状态的疑问,因为许多Web应用在服务器端记录了用户的访问历史。但这些历史数据是被当作可以增删改查的资源来处理的,任何客户端只要带有该用户的身份标识,或者说任何服务器端只要收到带有该用户身份标识的请求,就可以去数据库中查找该用户的历史数据。这种操作和博客或者论坛的资源访问没有区别,本质上都还是RESTful API的资源访问。