【问题标题】:What can I use besides Sessions in order to use the following method as an API method?除了 Sessions 之外,我还可以使用什么来将以下方法用作 API 方法?
【发布时间】:2019-05-27 12:33:09
【问题描述】:

我有一个带有 laravel 后端和 Vue 前端的测验应用程序。我正在为这个应用程序开发一个 API。但是,我遇到的问题是我需要一个 API 端点:从 Questions 表返回一个问题 - 但它需要:

  1. 每次调用该方法时随机返回一个问题
  2. 不是用户已经看过的问题(除非所有问题都看过)

到目前为止,我一直在使用 shuffle 方法随机化问题集合,并依靠 Sessions 来存储 unseenQuestions 的 id。

但是,由于 API 调用是无状态的,因此会话将不起作用。我想知道有什么方法可以解决这个问题?

public function random(Module $module, $category){
    // Get question ids in randomised order (for a given module + category)
    $questions =  Question::CategoryForModule(1, $module->id)->shuffle()->pluck('id');

    // Name and Get unseenQuestions
    $sessionName = 'unseenQuestions_' . $category .  strval($module->id); //unseenQuestions_anatomy_2

    if (session()->has($sessionName)) {
        $unseenQuestions = session()->get($sessionName);

    } else {
        $unseenQuestions = collect($questions);

    }
    // Pop new Question
    $newQuestionID = $unseenQuestions->shift();;

    // Store unseenQuestions OR remove unseenQuestions (if it has no items);
    if ($unseenQuestions->count() == 0) {
        session()->forget($sessionName);
    } else {
        session()->put($sessionName, $unseenQuestions);
    }

    return new QuestionResource(Question::find($newQuestionID));
}

【问题讨论】:

  • API 调用并非完全无状态,它们只是不启动会话。您仍然可以使用 cookie(但可能不应该)或传递用户特定的 API 密钥,该密钥又用于确定用户是谁(通常人们为此使用 OAuth2)。
  • API 调用应设计为无状态且不得使用 cookie。 Cookie 是浏览器用来存储会话数据的一种方式,但 API 端点可能会从移动应用程序、命令行界面等调用
  • 我本质上需要的是在调用 random() 方法之间存储 unseenQuestions 的东西(无需持久化到数据库)。我以前使用会话来执行此操作。代币会是这个问题的答案吗?

标签: php laravel api laravel-session


【解决方案1】:

您可以采用其中一种方法来做到这一点

  • 验证您的 API 调用:每个用户都有一个用于验证调用的令牌。然后,每当您从数据库中提取问题时,您将问题存储(在数据库中)为seen 用户
  • 随 API 一起发送seen 问题数组。恕我直言,应避免这种方法,因为它是可利用的,并且您委托客户决定是否已看到问题。

我会选择第一个选项。

【讨论】:

  • 我希望避免持久化到数据库,因为看到的问题需要临时存储。看到测验中的所有问题后,需要将看到的问题重置为 0。
  • 当用户看到所有问题后,您可以从数据库中删除一些行。与会话有什么区别?如果是基于时间的,您可以考虑使用缓存。但是,同样,您不应该依赖客户端,因此您必须将此信息存储在服务器中。介质(数据库、文件、键/值存储)无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2021-12-03
  • 2018-03-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多