传递具有依赖关系的模型以休息api服务

时间:2017-01-27 15:28:51

标签: c# rest design-patterns asp.net-web-api restful-architecture

当我想传递引用另一个模型的模型时,RESTful api服务的“良好实践”是什么?像:

class ClassModel
{
int Id
int Number
List<StudentModel> Students
}

class StudentModel
{
int Id
string Name
string Surname
ClassModel CurrentClass
}

并在创建新学生时POST .../api/students/ 我应该传递StudentModel对象整个ClassModel关联对象还是仅传递Id类并在服务端获取此对象?

2 个答案:

答案 0 :(得分:0)

最佳做法是仅传递您尝试执行的任何操作所需的数据。

如果您尝试遵循标准,那么您真的应该使用POST来创建新数据并使用PUT进行更新。

现在,您处理数据的方式取决于您的业务规则。乍一看,我这样说:

如果您想创建学生,则只使用初始注册所需的数据...姓名,联系信息,地址,以及您需要的任何内容。 那么你会有类似EnrollStudentInClass的东西,以及你执行链接的地方。如果完成所有这些调用是一个链接操作,那么您不需要传递该类的整个数据图,只需要您唯一标识您所在类所需的数据,在本例中为Id。

这有助于保持良好的分离。但是,如果您的业务要求表明您无法创建学生而不将其注册到至少一个班级,那么您也会传递班级信息并在一次通话中完成所有这些。

这里最重要的是保持尽可能简单,除非你真的需要,否则不要一次做太多。

答案 1 :(得分:0)

创建学生时,其中的任何关联资源都将作为参考提供,因为您不会使用该资源创建学生也可以创建课程。

  • POST /students将创建学生。
  • POST /classes将创建课程。

如果您想创建学生并将其与现有课程相关联,您可以使用/students动词向POST发送请求,其实体将如下所示:

{ "name": "Matías", "surname": "Fidemraizer", "class": { "id": 38 } }

另一方面,如果您需要创建一个类,则会向POST发送一个/classes请求,该请求将收到带有201 Created状态代码的响应,并且还会带有Location标头,其中包含已创建的资源URI(fe Location: /classes/2)。

您可能应该设计模型和服务以避免加载关联并使用引用,因为即使您的业务层也不需要加载类以将其与给定学生相关联。

此外,您的ClassModel可以提供Load方法来加载整个模型,这太简单了,因为您只需要通过其标识符获取模型并填充其余属性全班!