如何使用 AJAX 或Websockets有效地提交一个问题一个问题的测验?[关闭]

fnx2tebb  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(122)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

2天前关闭。
Improve this question
有一个小测验,总共有250个问题。问题将保持不变,所以我不会从数据库中提取每个问题,但为了提交每个问题,我使用 AJAX 发送2个请求:1-请求开始计算用户应答所需的持续时间。2-请求提交用户的答案。
如果用户没有在特定的时间内提交答案,它会自动提交。
示例HTML:

<h3>Question 1</h3>
<span class="answer" data-ans="1" data-q="1">Answer 1</span>
<span class="answer" data-ans="2" data-q="1">Answer 2</span>
<span class="answer" data-ans="3" data-q="1">Answer 3</span>
<span class="answer" data-ans="4" data-q="1">Answer 4</span>

AJAX 开始计数:

$.ajax({
    url: 'http://exmaple.com/start-counting',
    type: 'GET'
});

QuizController.php:

public function start_counting()
{
    session(['start' => time()]);
    session()->save();
}

AJAX 请求提交答案:

$(".answer").click(function() {
    $.ajax({
        url: "http://exmaple.com/submit-question",
        type: "POST",
        data: {"question": $(this).data('q'), "answer": $(this).data('ans')}
    });
});

该项目托管在VPS服务器上,我正在考虑使用websockets。
我应该使用websockets吗?
我从来没有安装或使用过websockets,所以我不知道它是否适合这项任务,因为大多数时候我看到websockets用于聊天应用程序和通知。

ujv3wf0j

ujv3wf0j1#

Websockets是实现通知和聊天功能的常见选择。但是,对于您的特定用例来说,它可能不是最有效的解决方案,在这种情况下,用户的回答会触发一个事件,并且每次都通过WebSockets发送请求。更有效的方法是在从控制器加载页面时设置会话,或者使用 AJAX 来确定用户开始应答的确切时间。这避免了不必要地使用WebSockets,并提供了一个更有效的解决方案。

如果答案可以保存在JSON对象中,则可以处理来自前端的所有请求,并对答案数组进行散列以保持它们的安全性。您可以使用json_encode函数将对象转换为字符串,然后使用hash函数创建字符串的散列。例如,在Laravel中使用sha256算法对JSON对象进行哈希:

// The right answer to each question
$answers = [0 => 1, 1 => 4];
$json = json_encode($answers);
$hash = hash('sha256', $json);

对于JavaScript代码,假设$hash是从Laravel发送的散列值:

let hashedJson = '{{ $answers }}'; // assume that `$answers` is the hashed value
let jsonString = atob(hashedJson); // decode the hashed value from base64
let jsonData = JSON.parse(jsonString); // parse the JSON string to a JavaScript object

建议使用此方法,因为当许多学生同时回答时,为每个答案发送请求会导致学生体验不佳。虽然WebSockets可能没有帮助,但如果有必要,您可以尝试使用Pusher。

相关问题