相信不少朋友在使用 SAP ABAP Gateway Client 測試 OData 服務時,都看到過這三個相似的 HTTP 請求類型:PUT, MERGE 和 PATCH.

這三種類型有什麼差別呢?
- PUT:将 HTTP 請求(payload)作為輸入,這個輸入将被傳入 OData 模型的 DPC Class 的 UPDATE_ENTITY 方法中。
例如我們通過 PUT 傳入如下的資料:
{ “Vbkur” : “170” }
複制
則隻有 Vbkur 在 update_entity 方法中可見。 總之,如果将 OData 模型的
屬性子集(attribute subset)
作為 PUT 方法的輸入,則相同的屬性子集将會被傳入 UPDATE_ENTITY 方法進行處理。
- PATCH & MERGE: 如果在有效負載(HTTP 請求)中傳遞屬性的子集,這兩個方法會自動擷取其他屬性。 Patch 和 Merge 的行為方式相同,但基本差別在于 PATCH 支援 OData 3.0 協定,而 MERGE 支援 OData 1.0 和 2.0 協定。 是以我們應該優先使用 PATCH,而不是 MERGE.
舉個例子,下列是訂單的擡頭屬性字段集合:
{
"Vbeln" : "32346",
"Erdat" : "\/Date(1627171200000)\/",
"Erzet" : "PT19H29M37S",
"Ernam" : "FIORIUSER",
"Audat" : "\/Date(1627171200000)\/",
"Netwr" : "193.050",
"Waerk" : "USD",
"Vkorg" : "1710",
"Vtweg" : "10",
"Vkbur" : "180"
}
複制
當我們使用 PATCH 操作時,僅僅傳遞一個待修改屬性:
但是在 DPC 的 UPDATE_ENTITY 方法内,訂單擡頭的所有字段都可以通路:
SAP ABAP OData 架構每當觸發 PATCH 或 MERGE 調用時,它将首先觸發相應的 GET_ENTITY(collect all properties) 方法,然後才執行 UPDATE_ENTITY 方法。
注意:由于 MERGE 不是 HTTP 規範 [RFC2616] 中定義的動詞之一,是以使用 MERGE 動詞可能不會像 HTTP 規範中定義的方法那樣無縫地通過網絡中介。 在處理支援 OData 3.0 協定的資料服務時,HTTP PATCH 動詞優先于 HTTP MERGE。 支援 OData 2.0 和 OData 3.0 協定的資料服務可以支援動詞隧道以減輕此限制。