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

标签 c# web-services api rest hateoas

假设我有一个包含联系方式资源的应用程序资源,而联系方式包含地址资源。

例如。

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/

相关文章:

c# - "hot deploy"是否可以顺利运行 ASP.NET Core 应用程序?

c# - 是否可以将 Func<T1,T2,TResult> 转换为 Func<T2,T1,TResult>

c# - 您如何动态分配母版页?

java - java中Rest WS响应中的不同日期格式

api - 如何为 Jenkins 申请面包屑发行人

web-services - 如何从外部访问 joomla Controller /模型功能?

c# - 使 NSwag 生成的客户端中的属性可为空

jquery - 如何从 2.0 asmx Web 服务返回 JSON

android - 上传时获取 JSON 异常

java - 尝试访问类别时出现状态 404