我正在为我的公司设计REST服务。这里没有人有太多的REST经验,所以我读了几本关于这个主题的书,但我仍然坚持POST的资源设计与相同数据的GET请求的资源设计。特别是在外国关系的情况下。
例如,我有一个PurchaseRequest类,它代表购买某些固定资产的请求。在幕后,我的服务是关系数据库的接口。有一个PURCHASE_REQUEST表,它有一个ASSET表的外键(定义正在请求固定资产列表中的哪一个)和一个PERSON表(定义哪些用户正在进行请求)。当前在我的服务中,当为购买请求发出GET命令时,该服务返回整个事物:PURCHASE_REQUEST表条目的XML表示以及如下所示的资产条目列表:
<PurchaseRequest>
<ID></ID>
<RequestDate></RequestDate>
<Requestor href="/requestors/requestorID">
<RequestorID></RequestorID>
<FirstName></FirstName>
<LastName></LastName>
</Requestor>
<RequestedAssets>
<RequestedAsset href="/assets/AssetNumber" >
<AssetNumber></AssetNumber>
<Year></Year>
<Make></Make>
<Model></Model>
<Cost></Cost>
</RequestedAsset>
<RequestedAsset href="/assets/AssetNumber" >
<AssetNumber></AssetNumber>
<Year></Year>
<Make></Make>
<Model></Model>
<Cost></Cost>
</RequestedAsset>
<RequestedAsset href="/assets/AssetNumber" >
<AssetNumber></AssetNumber>
<Year></Year>
<Make></Make>
<Model></Model>
<Cost></Cost>
</RequestedAsset>
</RequestedAssets>
</PurchaseRequest>
这非常有效。消费应用程序发出单个请求并获取整个资源,并在需要时链接到完整资源请求者资源或资产资源。
问题出在POST上。我的直觉告诉我尝试使用相同的资源布局来发布新的购买请求,因为我用来检索现有的请求。无论如何,这就是我读过的书中的所有例子。我不需要知道除资产编号和请求者ID以外的任何内容来完成POST。这意味着数据不是必需的,但仅靠低效率并不困扰我。最重要的是,在创建采购申请时,您无法编辑资产的年份,品牌或型号,这些字段是预定义的。您还应该能够在创建采购申请时创建新的资产定义。同样,您在创建购买请求时也无法更新/创建人员的详细信息。有单独的服务来创建/更新人员和资产。
我唯一能想到的是为POST定义一个不同的DataContract类,它具有识别资产或人的最小信息,并且不会公开那些无法更新的字段。我真的不喜欢这个选项,因为它会创建大量的DataContracts类(我的数据库中的几乎所有表都有外来关系,这不是孤立于一个请求或我不会担心它)但是我真的不喜欢我目前的设计,因为REST没有只读字段。现在我的服务的消费者负担不断地检查,“它是否保存了这个领域......这个怎么样?......”还有其他人遇到过这个问题吗?为POSTing和GETing定义一个单独的DataContract类是很常见的吗?看起来像一个非常基本的设计问题,但我没有看到关于这个主题的很多帖子所以我希望我只是错过了一些东西。任何帮助表示赞赏。