2016-06-16 56 views
1

的行爲這是一個多部分的問題:REST網址:整數VS串和PUT

  1. 給定一個REST API與含有自然數作爲路徑段的URL,是通常預期的行爲,該數目是解釋爲索引或鍵?
  2. 當針對深層資源路徑執行PUT時,通常預期的行爲是路徑被解釋爲狀態聲明?這意味着沿着路徑創建所有不存在的資源。或者如果路徑上的任何資源不存在,應該返回一個錯誤?
  3. 對問題2進行擴展,如果路徑確實存在,並且路徑定義的資源結構與存在的資源結構不同,則應覆蓋現有資源,再次作爲狀態聲明或者返回指示類型不匹配?

例如,考慮端點:

domain.tld/datasource/foo/2/bar/1/baz

  • foo是一個字符串,並確定頂級資源。
  • 2可以被解釋爲索引或鍵。
  • bar是一個字符串,被解釋爲一個鍵。
  • 1可以被解釋爲索引或鍵。
  • baz是一個字符串,被解釋爲一個鍵,指向一個葉節點。

換句話說,該標識符foo下駐留在domain.tld/datasource數據可以是任何以下的:基於

指數:

[ 
    null, 
    null, 
    { 
    'bar': [ 
     null, 
     {'baz': null} 
    ] 
    } 
] 

基於密鑰:

{ 
    '2': { 
    'bar': { 
     '1': { 
     {'baz': null} 
     } 
    } 
    } 
} 

基於指數和密鑰:

{ 
    '2': { 
    'bar': [ 
     null, 
     {'baz': null} 
    ] 
    } 
} 

問題1

應該21被認爲是一個整數或字符串?由於這可能不可能知道,在REST URL中是否存在用於處理這種情況的類型註釋標準?在白板上的一些解決方案到目前爲止是這樣的斷言2是一個鍵和1是索引如下:

  • domain.tld/datasource/foo/2:str/bar/1:int/baz
    • 其中:str表示前面的值是一個關鍵
    • :int表示前面的值是一個指數
  • domain.tld/datasource/foo/2/bar/1/baz?types=ki
    • 其中k,爲的types構件0,映射到所述第一類似於int的段,和表示該值是一個關鍵
    • i,爲的types部件1,映射到第二類似於int的段,和表示該值是一個指數

問題2

如果沒有ABOV的e數據存在,如果PUT針對此路徑創建這些資源或返回錯誤?如果返回錯誤,每個級別的每個資源是否應該單獨創建,需要多個針對路徑的多個PUT

問題3

如果從第一圖(基於索引的)中的數據已經存在應該從(基於密鑰)第二插圖中的數據強制地覆蓋在所有級別的所有數據路徑中或者返回一個指示類型不匹配的錯誤?這裏的推論再次表明,對於任何改變類型的分配,都需要多個PUT

我可能是過於複雜的問題或缺少基本的東西,但我沒有找到明確的指導意見的方式很多。我可以完全控制系統,並可以執行我認爲合適的任何規則。不過,我感興趣的是經驗,這意味着相互作用應該很容易推理,邏輯,預期,確定性等

+0

關於最後2個問題,我認爲這取決於您的RESTful API在什麼級別。例如,查看[Richardson成熟度模型的第3級](http://martinfowler.com/articles/richardsonMaturityModel.html#level3),在執行PUT之前,您必須實際導航到資源,所以你可以假設路徑是有效的。同時,硬編碼網址而不是導航不是正確的方式來消費這樣的API。 –

回答

0

從我的角度來看,你永遠也不會做出像「深資源」時嘗試「寧靜」還是「重振」 - 我真的沒有看到好處。它只是使系統的方式更難理解,使用和開發(例如:見你的問題:))。

爲什麼不保持它的簡單,並具有「單」,網址爲單一的資源呢?這樣,客戶很清楚PUT將會做什麼,DELETE會做什麼。

所以只是作爲一個例子,你可以有列表資源端點domain.com/datasource將返回所有註冊的Foo的列表。它會返回一個HREF列表......比如domain.com/foo/1 ...在某些元數據下面,foo/1也可以包含一列酒吧......但是,它們不是嵌套在'foo URI',它們是簡單的頂級資源,例如'domain.com/bar/1'。

這樣一個客戶端可以輕鬆地刪除,更新,創建項目。你可以鏈接它們,在實體中設置正確的鏈接。

關於你的問題2和3:我認爲這完全取決於你的系統。如果你看到鏈接domain.com/datasource/foo/1/bar/2/baz作爲一個大資源,這意味着響應不僅包括有關baz的信息,還包括bar,foo和datasource的信息,重新創建'(完全更新)資源。如果該鏈接「唯一」返回有關baz的信息,則只會完全更新該資源。