REST - GET返回的结果与POST / PUT不同

时间:2011-07-16 16:38:04

标签: rest post get put

在我们的项目中,可以通过POST或PUT请求发送书籍结构(XML,JSON,...)来添加书籍。例如,在XML中,书籍结构如下所示(简化):

<book>
    <title>My Book</title>
    <author>John Q.</author>
</book>

在我们的后端数据库中插入此书时,会自动添加一些自动生成的属性,例如创建日期,提交书籍的用户ID,标识符......

通过GET检索图书时,这些附加属性包含在图书定义中:

<book>
    <title>My Book</title>
    <author>John Q.</author>
    <info>
        <creation_date>2011...</creation_data>
        <user_id>48</user_id>
        <identifier>my_book_john_q</identifier>
    </info>
</book>

这基本上意味着新/编辑的书籍(=从客户端到服务器)的XML方案与检索到的书籍(=从服务器到客户端)不同。这让事情变得混乱。

可能性是在不同的URI中提供这些附加属性,例如:

http://server/books/:id/             -> returns the short version
http://server/books/:id/information/ -> returns the generated properties

这种方法的缺点是需要两个单独的请求来获取所有数据。

您如何解决这种不一致?

2 个答案:

答案 0 :(得分:5)

这是完全正常的。服务器使用一些附加信息来扩充表示没有问题。一个很好的例子是服务器添加到表示的链接。在进行PUT时,客户端不需要将这些链接的“副本”发送到服务器。您GET和PUT的资源表示在概念上应该相同,不一定是字节相同的字节。

答案 1 :(得分:0)

您没有正确使用mimetypes。我敢打赌你使用application/xml通用mimetype,你的客户知道根据端点会发生什么,对吗?

处理问题的正确方法是对同一资源使用不同的mimetypes进行不同的表示。例如,您可以为短表示设置application/vnd.yourcompany.book.short+xml,为完整表示设置application/vnd.yourcompany.book+xml。客户端可以使用Content-Type标头说出他们要发送的标头,并使用Accept标头说出他们想要的标头。

这并不意味着客户端必须在POST或PUT中发送短表示。您可以将某些字段记录为可选字段,并且客户端可以省略它们。