[英]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.