假设我有一个包含联系方式资源的应用程序资源,而联系方式包含地址资源。
例如。
Application
--> Name
--> Application Amount
--> Application Contacts
--> --> Contact 1
--> --> --> Address
--> --> Contact 2
--> --> --> Address
当对应用程序执行 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?
乔希
最佳答案
您的设计不是 RESTful。您的资源可能与您的业务实体是一对一的映射?我不建议这样做,因为它会将领域模型的核心暴露给外部世界,这可能会导致版本控制问题。它还使此类问题变得比它们需要的更难 - 尽管您可能正在使用 REST 框架来强制您进行这种设计:-(。
要记住的是,REST 中的资源是您希望外界看到的领域模型元素的抽象表示,在将它们转换为领域对象之前,它们很可能需要映射和转换。它们可以任意复杂。
这里的解决方案,我想说的是让创建应用程序的 POST 同时创建联系人及其地址。然后客户端可以提供现有联系人和地址的 URL(服务器可以取消对域对象的引用),或者提供必要的详细信息以在单个 POST 中创建新的。然后以事务方式创建和关联实体的责任落在服务器上。它只是返回对标识新应用程序的 URL 的引用。如果您需要知道联系人的 URL,那么您重新获取应用程序,它将包含它们。
假设您的资源是 JSON mime 类型,初始 POST 可能如下所示:
{
Name: "Application name",
Amount: "123.00",
Contacts: [
{
Name: "Contact name",
Address: {
HouseNumber: "45",
StreetName : "Sesame Street"
}
}
]
}
Return: {href: “/Application/6789”}
然后 GET 到/Application/6789 会返回如下内容:
{
Name: "Application name",
Amount: "123.00",
Contacts: [
{ mimeType: "application/vnd.com.myStuff.contact+json", href: "/Contact/203" }
]
}
关于c# - 如何使用 Restful API (HATEOAS) 提交深度嵌套的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17692800/