我们正在使用Web-API开展休息服务,并打破我们要遵循的路由策略。
我们获得了一些资源:
(作为旁注:我们计划使用Hateoas来连接资源。)
我们正在考虑控制器[动作] [Id]导致
API\Grade[?personid] (GET/POST)
API\Grade\{id}[?personid] (GET/PUT/DELETE)
API\Grade\Lastgrades\{days}[?personid] (GET)
或使用上下文
API\Student\Grade (GET)
API\Student\Grade\{id} (GET)
API\Student\Grade\Lastgrades\{days} (GET)
AND
API\Parent\Student\{id}\Grade (GET)
API\Parent\Student\{id}\Grade\{id} (GET)
API\Parent\Student\{id}\Grade\Lastgrades\{days} (GET)
AND
API\Teacher\Student\{id}\Grade (GET/POST)
API\Teacher\Student\{id}\Grade\{id} (GET/PUT/DELETE)
API\Teacher\Student\{id}\Grade\Lastgrades\{days} (GET)
是否有充分理由将一种策略用于另一种策略?
答案 0 :(得分:3)
在第一个选项中,重点是成绩,这是API旨在管理的资源 在您的第二个选项中,只需查看URL模式,就可以使用更多资源,例如教师和学生。
在不了解您的业务用例的情况下,您的问题的答案更多地与API的初始范围有关。 如果它专注于成绩而不是教师和学生,那么您只需提供API来管理“成绩”资源,这意味着您的选项-1。
稍后,如果您还需要管理“教师和学生”,则可以将选项-2添加到您的实施中。
它们没有必要相互排斥。
角色/上下文不应该是URL的一部分。一旦每个角色登录到系统,就应该单独处理;应该已经有办法与后端中的角色相关联,例如通过会话等。
URL设计重点应放在资源上,在本例中为Grades。此外,从逻辑上讲,成绩应与学生联系,甚至与学生参加的课程相关联,我建议将其设计如下:
/api/v1/grades/students/[student-id]/
OR
/api/v1/students/[student-id]/grades/
OR
/api/v1/students/[student-id]/classes/[class-id]/grades/
这些都是可接受的解决方案,根据您的业务用例,一个可能比其他更好。
只有CRUD operations可以对这些资源采取行动才能发挥作用,例如教师可以POST / PUT / GET
/api/v1/students/[student-id]/grades/
但学生/家长只能参加GET
/api/v1/students/[student-id]/grades/
您仍然需要将角色/上下文视为整体设计的一部分,也许还需要考虑URL设计如何更有意义,具体取决于您希望如何支持每个角色将使用URL来管理资源的操作。但“上下文/角色”不应该是URL的一部分。