【问题标题】:Pass messages between requests with a REST API (JSON, XML, HTML...)使用 REST API(JSON、XML、HTML...)在请求之间传递消息
【发布时间】: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 通常如何实现它?

在这个问题之后,我有两个(可选的)误解。

基于this stack overflow answer

这并不排除 Web 服务器与之通信的其他服务 从维护有关业务对象(例如购物车)的状态, 只是与客户端当前的应用程序/会话状态无关。

其他服务在这里是什么意思?

基于this comment from the same answer

身份验证可以隐含在状态中,你认为 facebook 对其 REST API 的每个请求都进行“数据库访问”?或者 谷歌这件事?提示:没有

隐含在状态是什么意思?如果是他们使用令牌或类似的认证过程,那么他们应该每次访问数据库以获得新用户,不是吗?

提前谢谢你。

【问题讨论】:

    标签: javascript node.js rest api express


    【解决方案1】:

    Other Service 可以是 Redis 或任何可以在 API 调用之间存储用户状态的 NoSQL 数据库。参见12 Factor App 中的backed service 定义。

    【讨论】:

    • 我们能不能用任何可以存储数据的Web服务器以外的进程来总结?
    • 是的,它可以是任何可以存储数据的共享资源。
    • 你最后一句中的资源是什么意思?
    • 您的应用可能使用的东西:另一个 Web 服务、数据库。文件甚至一个进程(如果我们在一台机器上工作)。
    猜你喜欢
    • 2018-06-05
    • 2011-04-23
    • 1970-01-01
    • 2018-03-24
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多