【问题标题】:What would be a good way to structure endpoints to provide quiz-like functionality?什么是构建端点以提供类似测验的功能的好方法?
【发布时间】:2020-01-26 06:21:17
【问题描述】:

假设您有包含以下字段的 Questions and Answers 数据库表:

问题
- 身份证
- 文字

答案
- 身份证
- 问题(问题表的外键)
- 文字
- is_correct(显示这个答案是否正确)

API 使用者想要检索带有可能答案的问题,还必须有一种方法让使用者为给定问题提供答案,并且在后端我们将确定它是否是正确答案并将其存储在一些进度表。

这是我最初的想法:
/questions/ - 在 GET 上返回所有问题及其可能的答案。
示例

[
{
  "id": "24",
  "text": "Can people fly?",
  "answers": [
    {
      "id": "1",
      "text": "Yes"
    },
    {
      "id": "2",
      "text": "No"
    },
    {
      "id": "3",
      "text": "Really complex answer"
    }
  ]
},
...
]

/questions/<question_id>/answer - 带有答案 ID 的 POST 请求以提交给定问题的答案。
我主要关心的是在这个端点中使用动词“答案”。我认为它不遵循 REST 约定,我们在设计端点时必须使用名词而不是动词。

【问题讨论】:

    标签: rest django-rest-framework


    【解决方案1】:

    我主要关心的是在此端点中使用动词“答案”。我认为它不遵循 REST 约定,我们在设计端点时必须使用名词而不是动词。

    REST 不关心您为资源标识符使用的拼写。

    /问题//答案 /问题//12345 /问题//正确的马电池主食 /bdeee0e1-9094-4c8d-a35a-aee971106534

    这些都是完美找到的标识符; REST 不在乎——通用客户端不会尝试从标识符中提取语义信息。

    但是……

    您使用的拼写表明您并没有真正考虑资源本身。在 HTTP 中,核心思想是我们是passing documents over a network。

    这意味着您可以经常尝试想象您的问题是使用笔和纸来实现的。所以想象一个学校教室接受测验——每个学生都会收到一张纸,上面有问题清单,还有空白让学生添加她的答案。学生通过提供答案修改文档。

    因此,在这种情况下,您的“资源”可能类似于测验的纸——不是带有正确答案的原版,而是学生的带有空白答案的副本。

    因此,您可能会为每个参加测验的学生提供不同的资源

    /quiz/12345/alice
    /quiz/12345/bob
    

    当然,整个测验可以分布在多个资源上,这更接近您当前的模型:

    /question/67890/alice
    /question/67890/bob
    

    Resource是HTTP中一个非常重要的概念

    任何可以命名的信息都可以是资源:文档或图像、时间服务(例如“洛杉矶今天的天气”)、其他资源的集合、非虚拟对象(例如人)、等等。

    如果您在为资源找到合适的标识符时遇到困难,这通常表明您实际上并不了解信息是什么以及如何命名。因此,首先要集中精力弄清楚这一点。

    【讨论】:

    • 感谢您的深入回答。不幸的是,我提供了错误的示例:不应该有任何指示符来响应答案是否正确。我希望我的测验是多项选择题。但是,无论如何,你让我走上了正轨,再次感谢。
    【解决方案2】:

    对于还想知道如何为其测验系统设计 API 的任何人,Canvas LMS 有一个记录良好的 API(查看测验相关部分)。也许他们的做法可以启发和/或影响您的做法:)
    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2013-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多