如何使用Restful API提交深层嵌套资源(HATEOAS)

Jos*_*orp 5 c# api rest web-services hateoas

假设我有一个包含联系详细信息资源的应用程序资源,联系人详细信息包含地址资源.

例如.

Application
--> Name
--> Application Amount
--> Application Contacts 
--> --> Contact 1
--> --> --> Address
--> --> Contact 2
--> --> --> Address
Run Code Online (Sandbox Code Playgroud)

在对应用程序执行POST时,我正在创建根应用程序.对于所有子资源,如应用程序联系人,我做一个POST来创建联系人1等...

我的问题是,Application =提交某个地方进行处理,但我不想在填写所有内容之前提交它,也就是所有子资源.

So the order of submission
1) Create Application Resource --> POST /Application --> Get ID
2) Create Contact 1 Resource --> POST /Application/id/Contacts --> Get ID
3) Create Contact 1 Address Resource --> POST /Application/id/Contacts/id/Addresses
4) Create Contact 2 Resource --> POST /Application/id/Contacts --> Get ID 
5) Create Contact 2 Address Resource --> POST /Application/id/Contacts/id/Addresses
6) DECIDE TO SUBMIT HERE <--- ?? HOW?
Run Code Online (Sandbox Code Playgroud)

玩笑

Ste*_*son 2

您的设计不是 RESTful。您的资源可能与您的业务实体是一对一的映射?我不建议这样做,因为它会将域模型的内部暴露给外界,这可能会导致版本控制问题。它还使此类问题变得比实际需要的更加困难 - 尽管您可能正在使用强制执行此设计的 REST 框架 :-( 。

\n\n

要记住的是,REST 中的资源是您希望外界看到的领域模型元素的抽象表示,它们很可能需要映射和转换才能转换为领域对象。它们可以任意复杂。

\n\n

我想说,这里的解决方案是让创建应用程序的 POST创建联系人及其地址。然后,客户端可以提供现有联系人和地址的 URL(服务器可以取消对域对象的引用),或者提供必要的详细信息以在单个POST中创建新联系人和地址。然后以事务方式创建和关联实体的责任就落在服务器身上。它只是返回对标识新应用程序的 URL 的引用。如果您需要知道联系人的 URL,那么您需要重新获取应用程序,它将包含它们。

\n\n

假设您的资源采用 JSON mime 类型,初始 POST 可能如下所示:\n

\n\n
{\n    Name: "Application name",\n    Amount: "123.00",\n    Contacts: [\n        {\n            Name: "Contact name",\n            Address: {\n                HouseNumber: "45",\n                StreetName : "Sesame Street"\n            }\n        }\n    ]\n}\nReturn: {href:  \xe2\x80\x9c/Application/6789\xe2\x80\x9d}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,对 /Application/6789 的 GET 将返回类似以下内容:\n

\n\n
{\n    Name: "Application name",\n    Amount: "123.00",\n    Contacts: [\n        { mimeType: "application/vnd.com.myStuff.contact+json", href: "/Contact/203" }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n