簡體   English   中英

關於DELETE方法的REST API設計

[英]REST API Design regarding DELETE method

我正在構建一個REST API。 實際上我理解了共同的指導和規則。

但我有DELETE方法的問題,因為我需要在請求中通過正文發送數據,DELETE方法將忽略正文。

如果你問什么數據讓我通過DELETE方法將它發送到身體,是一個'url'和一些其他參數。 當然'url'在數據庫中有id,所以我可以使用DELETE沒問題,比如DELETE https://api.example.com/content/url:url_id 但是,通過id,我選擇傳遞它自己和其他一些參數的URL。 我的業務邏輯和要求迫使我傳遞url而不是DELETE方法中的id。

所以在閱讀之后,我發現還有一些代理阻塞DELETE和PUT方法。 並且HTML表單僅支持GET和POST方法。

我開始認為最好只在我的REST API中使用GETPOST 所以我可以使用POST進行刪除和對象或資源,如下所示:

POST /content/delete/url
Body :
    url : xxxx
    param1 : xxxx
    param2 : xxx

但是在“REST API設計規則手冊,O'reilly”中,第18頁說

“應該使用HTTP請求方法來指示執行哪個CRUD功能”

以下反模式舉例說明了不該做的事情:

 GET /deleteUser?id=1234 GET /deleteUser/1234 POST /users/1234/delete 

在再次搜索和閱讀之后,我找到了一些解決方案

  1. 使用X-HTTP-Method-Override

  2. 使用api方法名稱,如flicker (api.flickr.com/services/rest/?method=flickr.collections.getInfo)mailchimp(api.mailchimp.com/1.3/?method=campaignDelete)

我想我喜歡解決方案1,使用'X-HTTP-Method-Override'。 你怎么看?

谷歌似乎使用X-HTTP-Method-Override,對此https://developers.google.com/gdata/docs/2.0/basics

Flicker和Mailchimp使用方法名稱,如解決方案2中所示

不能發送帶有DELETE請求的正文。 它沒有意義!

RESTful會是

DELETE  http://www.plocal:3000/api/v1/content/page-1
DELETE  http://www.plocal:3000/api/v1/content/info-page
DELETE  http://www.plocal:3000/api/v1/content/1
DELETE  http://www.plocal:3000/api/v1/content/2

testcall用

curl -v http://www.plocal:3000/api/v1/content -X DELETE

URL是要刪除的內容項的標識信息嗎? 如果是這樣的話,

DELETE https://api.example.com/content/:id 

並將url作為id的一部分。 Id不必嚴格整數。

您可能還想制作新的路線

resources :content, :except => [:delete] do
  member do
    delete delete_by_url
  end
end

然后,您將擁有一個新的刪除路由,其中​​包含更合適的名稱和控制器中的特定操作。

DELETE https://api.example.com/content/:id/delete_by_url

我知道它是您業務邏輯的一部分,但我建議您重新考慮它,或者嘗試使用其他解決方案而不是REST。

通過做你提到的那些東西,你將破壞所有REST概念,但仍然沒有在你的應用程序上做足夠好的事情。

我認為在您的情況下,最好的解決方案是考慮您的業務邏輯。 也許它可以在不中斷REST的情況下完成。

如果您認為無法完成,那么我會建議您列出的第一個解決方案。 感覺不那么錯了。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM