【发布时间】:2018-10-22 07:27:40
【问题描述】:
让我们想象一个可以返回 JSON、XML、HTML 和其他格式的 REST API。 如果浏览器 Web 客户端未启用 JavaScript,则 API 返回 HTML。令牌用于身份验证和授权。
在经典网站项目中,可能需要从页面A到另一个页面B进行重定向。它可以用于例如显示另一个页面中的欢迎消息或错误消息。在这种情况下,要在页面 B 上显示来自页面 A 的消息(例如 flash),我们通常会使用 session. express 中的两个简单(和缩小)示例(但概念在其他技术中是相同的):
// With session directly
const session = require('express-session');
app.use(session({ /* ... */ });
function (req, res, next) {
req.session.message = 'Welcome, you are connected';
return res.redirect('/');
}
<p class="message">${ session.message }</p>
// With a library as connect-flash
const flash = require('connect-flash');
app.use(flash());
function (req, res, next) {
req.flash('error', {
message: 'An error!',
});
return res.redirect('/login');
}
<p class="message">${ flash.message }</p>
现在,基于 REST 原则,为了尊重无状态约束,它不应该使用在两个请求之间存储状态的会话。
我的问题是:无状态网络服务器通常应该如何在两个请求之间传递消息?(在重定向的情况下)
- 会话:非无状态要求
- 数据库?
- 查询字符串?
- 饼干?
- 其他?
注意:我知道如何实施这些解决方案,但我要求正确的方法在无状态 Web 服务器的情况下做到这一点。 REST API 通常如何实现它?
在这个问题之后,我有两个(可选的)误解。
这并不排除 Web 服务器与之通信的其他服务 从维护有关业务对象(例如购物车)的状态, 只是与客户端当前的应用程序/会话状态无关。
其他服务在这里是什么意思?
基于this comment from the same answer:
身份验证可以隐含在状态中,你认为 facebook 对其 REST API 的每个请求都进行“数据库访问”?或者 谷歌这件事?提示:没有
隐含在状态是什么意思?如果是他们使用令牌或类似的认证过程,那么他们应该每次访问数据库以获得新用户,不是吗?
提前谢谢你。
【问题讨论】:
标签: javascript node.js rest api express