2013-01-10 52 views
1

設計API並尋找一些建議。REST風格的設計:區分取消發佈和刪除

這裏的行動:

  • publish:發佈文檔(POST)
  • update:更新文檔(PUT或PATCH)
  • unpublish:有把它的意圖採取把文件(?)
  • delete:完全刪除文檔(DELETE)

有什麼想法?

謝謝! 馬特

回答

2
  • 更新和刪除是非常明顯的,因爲你有他們。

  • 您認爲「發佈」與「創建」相同嗎? 「發佈」可能意味着將您創建的文檔公開並可見。一種想法是,你只能創建一次文檔,但是你可以多次發佈和取消發佈。

您可能會考慮文檔的生命週期以及在「取消發佈」後可以使用它做什麼。它的類型取決於你想要的序列:「創建(發佈?)...取消發佈...發佈...取消發佈...刪除」來做。如果發佈/取消發佈不做任何與創建/刪除不同的內容,那麼您可以放棄它們並避免複雜性。

  • 的純粹的REST的答案是提供在表示一個屬性:{...「發表」:真...},讓客戶端PUT的更新改變這種狀態。如果該狀態發生變化,則會觸發發佈或取消發佈文檔所需的任何處理。

  • 但是,我在一個團隊中感到不舒服,因爲在公開和技術上可能對發佈文檔有很大的影響。因此,他們選擇將操作視爲POST「數據處理」請求(如HTTP規範所提供的)並提供POST URL以「發佈」和「取消發佈」文檔。

  • 還有其他一些選擇。就像使用POST作爲附加動詞一樣,並提供一個「發佈列表」URI,允許您將文檔添加到發佈列表中,執行任何所需的處理:

    POST ht_p://.../documents {文檔}

    POST ht_p://.../published-documents {ID =}

    DELETE ht_p://.../published-documents/ {ID}

    DELETE ht_p ://.../documents/ {id}

編輯:打破了prentend URIs,因爲stackoverflow抱怨。;)

+0

謝謝你的想法!我想避免區分已發佈和未發佈的文檔。你有什麼想法使用查詢字符串來區分?像'DELETE /?action = unpublish'。取消發佈可能不是一種常見模式。 – Matt

+0

哦,'create = publish'在這種情況下。 – Matt

+0

我可能不會稱之爲「動作」,只是因爲你不應該在REST中這樣做(HTTP動詞應該表示你的動作)。但是您可以將它視爲請求的修飾符,並將其稱爲「unpublish_only = true」或「permanent = false」或「erase = true」或其他。雅我知道那種聽起來像是文字遊戲......但是...... – Rob