假设我有一个包含联系人详细信息资源的应用程序资源,联系人详细信息包含地址资源。
例如
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?
约什
答案 0 :(得分:2)
您的设计不是RESTful。您的资源可能与您的业务实体进行一对一的映射?我不建议这样做,因为它会将您的域模型的内容暴露给外部世界,这可能会导致版本问题。它也会使这样的问题变得比他们需要的更难 - 尽管你可能正在使用一个强制这个设计的REST框架:-(。
要记住的是,REST中的资源是您希望外部世界看到的域模型元素的抽象表示,在将它们转换为域对象之前,它们可能需要映射和转换。它们可以是任意复杂的。
我要说的是,解决方案是让POST创建应用程序 创建联系人及其地址。然后,客户端可以为现有的联系人和地址(服务器可以取消引用域对象)提供URL,或者在单个 POST中创建新的URL。然后,以事务方式创建和关联实体的责任落在服务器上。它只返回对标识新Application的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 to / Application / 6789会返回如下内容:
{
Name: "Application name",
Amount: "123.00",
Contacts: [
{ mimeType: "application/vnd.com.myStuff.contact+json", href: "/Contact/203" }
]
}
答案 1 :(得分:0)
希望我能正确理解你的问题。让我知道,如果我错过了这一点,并总能带回一些新的东西。
因此,如果已经从步骤1到步骤5创建了所有“子资源”。在每个步骤中,都应该有一个返回的ID来确认资源的成功创建。像,
POST /Application
Return: {appid: “/Application/id”}
因此,只要步骤5 POST返回,就会创建最后一个资源。然后下一步是启动应用程序'处理'。
“应用程序处理”可以被视为资源,业务操作是:“创建处理”资源和“检查处理结果”
可以在“处理”资源上分别使用POST和GET对它们进行建模。
创建处理资源
POST /Application/id/Processing
Return: {processingid: “/Application/id/Processing/id”}
检查处理资源
GET /Application/id/Processing/id
Return: {processingid: “/Application/id/Processing/id”, <other info>}
要恢复整个应用程序,
GET /Application/id
Return: {all info on the application including processing status as well…}
希望得到这个帮助。
答案 2 :(得分:0)
您很可能会有某种状态字段来指示是否已提交申请。在这种情况下,我建议采用以下两种方法:
1)发布到应用程序资源,并将其状态字段设置为适当的值以指示您的意图:
POST /application/654321
status=submitted...
以下是Fielding Dissertation的引用:
“REST组件使用a对资源执行操作 用于捕获当前或预期状态的表示 资源并在组件之间转移该表示。“
2)将应用程序发布到特定的集合/提交的应用程序,您也可以使用它来通过GET搜索您提交的应用程序:
POST /submittedapplications
id=654321...
由于除了更新应用程序资源之外,很可能还有其他处理步骤,因此您应该使用POST动词来指示双重提交不正常。
BTW这两种方法并不相互排斥,你当然可以在同一个API中实现它们。