簡體   English   中英

REST - GET 返回與 POST/PUT 不同的結果

[英]REST - GET returns different result than POST/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

這種方法的一個缺點是需要兩個單獨的請求來獲取所有數據。

您將如何解決這種不一致?

這是完全正常的。 讓服務器用一些額外的信息來擴充表示是沒有問題的。 一個很好的例子是服務器向表示添加鏈接時。 在執行 PUT 時,客戶端不需要將這些鏈接的“副本”發送到服務器。 您 GET 和 PUT 的資源表示在概念上應該是相同的,不一定逐個字節相同。

您沒有正確使用 mimetypes。 我敢打賭,您使用的是application/xml通用 mimetype,並且您的客戶知道基於端點會發生什么,對嗎?

處理您的問題的正確方法是使用不同的 mimetype 對同一資源進行不同的表示。 例如,您可以將application/vnd.yourcompany.book.short+xml用於簡短表示,將application/vnd.yourcompany.book+xml用於完整表示。 客戶端可以使用Content-Type header 來說明他們要發送哪一個,並使用Accept header 來說明他們想要哪個。

這並不意味着客戶端必須在 POST 或 PUT 中發送簡短表示。 您可以將一些字段記錄為可選字段,客戶可以忽略它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM