2015-04-16 80 views
0

我一直在琢磨這一段時間,但無法將其包裹在我的頭上。假設我有一個通過REST公開的任務系統。任務有自己的生命週期例如爲:REST - PUT(更新)資源狀態

CREATED -> ACTIVE -> PROCESSING -> CLOSED 
    |   |    | 
    |   |-->ESCALATED-->| 
    | 
    --> DISMISSED 

現在用POST我在體內有效載荷提供的所有信息創建任務。

但是現在我只需要改變任務的狀態並且可以添加註釋。所以在所有理論PUT是要走的路 - 它正在更新資源。但這裏的東西:

PUT:/任務/ {任務id}行動=激活 似乎合法的URI但動作已經擁有可用於改變資源的狀態的請求參數:param - 那麼PUT有效載荷呢?該端點的用戶發送長度爲0的消息的請求是否直觀?

更新:

對不起我的英文不好。我的意思是 - 改變資源狀態的一種好方法是使用URI參數,而不使用BODY(Content-Lenght:0)因此URI:/ tasks/32/?action = PUT請求僅限已關閉將「任務」狀態從改爲改爲已關閉

如果這是一種不好的做法 - 哪種方法被認爲是更好的做法?

+0

我不確定我是否明白了,但是,恕我直言,從REST的角度來看,你應該把資源與機構有效載荷(比如POST),而不是通過querystring傳遞數據;我假設查詢字符串僅用於獲取資源。 – ilpaijin

+0

和寫了10分鐘後,我發現這 - http://stackoverflow.com/questions/7323958/areput-and-post-requests-required-expected-to-have-a-request-body @ ilpaijin - 感謝輸入,但是上面的堆棧文章呢? – Xeperis

+0

我很抱歉我的英語不好,但我沒有得到你的問題「上面的堆棧帖子」。 – ilpaijin

回答

1

是的,它是基於舊RFC的選項,但已過時(請參閱rfc7231)。說實話,我覺得很不尋常的是考慮PUTting的實際用法,或者發佈一個空的資源並且只有查詢參數和值。

據我所知,一個基本的RESTful體系結構包括使用HTTP動詞,調用資源端點以及創建/更新/刪除這些資源。 (請參閱@PedroWerneck的意見以進一步澄清)。

這基本上意味着你使用的HTTP動詞,調用資源(任務/ ABC),發送給該資源的一些數據,以便進行修改(即認沽期權):

PUT /tasks/abc 

title=abc&body=aabbccddeeff&status=changedToSomethingElse 

已創建與

POST /tasks 

title=abc&body=aabbcc&status=created 
+0

REST是獨立於協議的。它與HTTP無關。 –

+0

你說得對REST不是一個協議,但我不同意它與HTTP無關。我相信REST體系結構應該與HTTP動詞進行通信(這裏也聲明http://en.wikipedia.org/wiki/Representational_state_transfer) – ilpaijin

+0

REST可以使用任何傳輸協議來實現.HTTP是最常見的,但是您正在想象一個強大的耦合的地方它並不真正存在。 –

3

不,你不能這樣做,並調用應用程序的RESTful,原因有二:

  1. URI是原子標識符。您不能將查詢字符串參數視爲方法參數,或者使用主體有效載荷的相同語義。它們是標識符的一部分。

  2. PUT要求服務器用提交的表示法替換給定URI處的資源。你不能像使用PUT那樣進行部分更新,並且肯定是你不能使用PUT在部分更新中應用查詢字符串參數。

考慮到這一點,有你想要的,可以視爲最佳做法是什麼幾個選項做:

  1. 你可以把整個表示,改變要更新狀態值。換句話說,您的客戶將發出一個GET,更改文檔中的值,並使用PUT將所有內容發回。

  2. 您可以修改僅將更改應用於狀態值的差異文檔。以json-patch爲例說明與PATCH方法兼容的數據格式。

  3. 您可以向僅執行所需更改的專用端點發出POST請求,但必須記錄如何使用它。 POST提交要由目標資源處理的有效負載,因此您可以使用它執行任何操作。

+0

因此,假設我的客戶端只能通過多種方式與資源交互 - 添加評論或更改「任務」資源的狀態,最好是第二或第三選項?因爲爲了論證的緣故,可以說任務只能由經理角色和簡單的員工角色創建,用戶不具有所有這些權力只是一個子集。 – Xeperis

+0

理想情況下,您的所有資源都應該在應用程序中統一支持第一個和第二個選項,因此您只需要爲尚未達到標準的操作實施POST。 –