1

我正在为我的公司设计一个 REST 服务。这里没有人对 REST 有太多经验,所以我通读了几本关于这个主题的书,但我被困在 POST 的资源设计与 GET 请求的资源设计对相同数据的对比上。尤其是在涉外关系的情况下。

例如,我有一个类 PurchaseRequest 代表购买某些固定资产的请求。在幕后,我的服务是关系数据库的接口。有一个 PURCHASE_REQUEST 表,它具有一个外键到一个资产表(定义正在请求的固定资产列表中的哪一个)和一个 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 没有只读字段。我的服务的消费者现在有责任不断检查,“它是否保存了这个字段......这个呢?......” 有没有其他人遇到过这个问题?必须为 POST 和 GET 定义单独的 DataContract 类是否很常见?似乎是一个非常基本的设计问题,但我没有看到很多关于这个主题的帖子,所以我希望我只是错过了一些东西。任何帮助表示赞赏。

4

0 回答 0