1 回答

TA貢獻1773條經驗 獲得超3個贊
從 REST 的角度來看,要記住的重要一點是統一的接口——你有一些具有application/json表示的資源。我可以GET代表您,并使用我最喜歡的任何工具對其進行本地編輯。
如果我想提議更改資源以匹配我的表示,我們從 HTTP 協議中選擇適當的方法。換句話說,HTTP 中的方法都是“通過網絡傳輸此文檔”域的一部分。(參考:吉姆·韋伯,2011 年)。
因此,實際上,支持“所有這些”是確保可以使用最廣泛的通用客戶端與您的資源交互的方法。
PUT /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json
完全合理的起點;它有幾個優點 - 語義是冪等的,因此客戶端知道丟失的請求可以重復,并且 HTTP PUT包含重要用例的語義,例如我們接受您的表示,這樣可以減少網絡壓力。
當表示遠大于更改時,PUT 可能是一個不幸的選擇。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: ????
這是處理對大型表示的微小更改的一種完全合理的方法。您放棄了 PUT 的一些優點——丟失的消息現在處理起來更加復雜。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json
沒有任何懸念。 application/json不是補丁文檔格式——如果沒有某種帶外協議,您無法知道這種表示正在描述哪些變化。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/vnd.example.patch+json
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/prs.example.patch+json
這是前一點的“REST”方式;您定義一個自定義媒體類型,并記錄語義,然后任何實現您的媒體類型的客戶端都可以使用它。供應商樹和虛榮樹可用。該+json位是結構化語法名稱后綴,它為無法識別基本子類型的消費者提供結構提示。
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/json-patch+json
PATCH /31E772D3-0157-4B52-8243-75EEAB946E65
Content-Type: application/merge-patch+json
也是很好的選擇,因為這兩種類型已在RFC 6902和RFC 7936中標準化;您更有可能客戶已經知道這些類型。
了解 HTTP PATCH的客戶端大概也知道如何使用 OPTIONS 方法來發現服務器準備處理的方法和補丁文檔格式。
OPTIONS /31E772D3-0157-4B52-8243-75EEAB946E65
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, PUT, PATCH
Accept-Patch: application/prs.example.patch+json, application/json-patch+json, application/merge-patch+json
添加回答
舉報