Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Restful API(HATEOAS)提交深度嵌套的资源_C#_Web Services_Api_Rest_Hateoas - Fatal编程技术网

C# 如何使用Restful API(HATEOAS)提交深度嵌套的资源

C# 如何使用Restful API(HATEOAS)提交深度嵌套的资源,c#,web-services,api,rest,hateoas,C#,Web Services,Api,Rest,Hateoas,假设我有一个包含联系人详细信息资源的应用程序资源,而联系人详细信息包含地址资源 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 Resou

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

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?
例如

在执行“发布到”应用程序时,我正在创建根应用程序。 对于所有子资源,如应用程序联系人,我做了一个帖子来创建联系人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?
那么提交的顺序是什么
1) 创建应用程序资源-->发布/应用程序-->获取ID
2) 创建联系人1资源-->发布/应用程序/id/联系人-->获取id
3) 创建联系人1地址资源-->POST/Application/id/Contacts/id/地址
4) 创建联系人2资源-->发布/应用程序/id/联系人-->获取id
5) 创建联系人2地址资源-->POST/Application/id/Contacts/id/地址

6) 决定在此提交希望我正确理解您的问题。如果我没有抓住要点,可以随时带着新的东西回来,请告诉我

因此,如果已经从步骤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>}
检查处理资源

POST /Application/id/Processing
Return:  {processingid: “/Application/id/Processing/id”}
GET /Application/id/Processing/id
Return: {processingid: “/Application/id/Processing/id”, <other info>}

希望有此帮助。

您很可能会有某种状态字段来指示申请是否已提交。在这种情况下,我建议以下两种方法:

1) 将“状态”字段设置为适当的值以指示您的意图后,发送到应用程序资源:

POST /application/654321
status=submitted...
以下是引用自:

“REST组件通过使用 表示以捕获该对象的当前或预期状态 资源,并在组件之间传输该表示。”

2) 将应用程序发布到特定的集合/提交的应用程序,您也可以使用该集合/提交的应用程序通过GET搜索您提交的应用程序:

POST /submittedapplications
id=654321...
因为除了更新应用程序资源之外,很可能还有其他处理步骤,所以您应该使用POST谓词来表示双重提交不合适


顺便说一句,这两种方法并不相互排斥,您当然可以在同一个API中实现这两种方法。

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

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

我认为,这里的解决方案是让POST创建应用程序也创建联系人及其地址。然后,客户端可以为现有联系人和地址提供URL(服务器可以取消对域对象的引用),或在一篇文章中创建新实体所需的详细信息。然后,以事务方式创建和关联实体的责任落在服务器上。它只返回对标识新应用程序的URL的引用。如果您需要知道联系人的URL,则重新获取应用程序,然后它将继续让他们安静下来

假设您的资源为JSON mime类型,则初始帖子可能如下所示:

然后,GET to/Application/6789将返回如下内容:


从main submit方法中,您应该像上面列出的那样单独调用每个帖子,更多的是一种模板类型的模式,这样您就可以进行控制。因此,单独进行调用,在获得所有子项后进行主调用。也许您还可以考虑一次性返回所有需要的数据并执行数据处理构建在客户端上的结构??将节省跨线路的数据传输。我假设您希望异步发出所有这些post请求,然后在它们全部返回时将所有内容重新加入到一个线程中?或者您可以同步发出调用吗?此外,由于您的标记,我假设您正在使用C#?发出这些post请求。NET Framework?像这样更粗粒度的方法还具有简化事务边界的额外好处。处理更多地是应用程序的状态,而不是应用程序的资源。像上面的@dmibor那样做,并将应用程序的状态设置为启动应用程序的状态更为正确处理和更新资源(从技术上讲,使用PUT)或将应用程序包装成其他内容,并为要处理的请求创建新资源。类似于POST/request{ApplicationId:??}或者甚至颠倒资源创建的顺序,首先创建所有联系人,然后在创建应用程序后立即开始处理该应用程序。
{
    Name: "Application name",
    Amount: "123.00",
    Contacts: [
        { mimeType: "application/vnd.com.myStuff.contact+json", href: "/Contact/203" }
    ]
}