2013-01-14 86 views
4

我正在構建一個REST API。其實我明白了共同的指導和規則。關於DELETE方法的REST API設計

但我有DELETE方法的問題,因爲我需要發送數據通過請求中的身體,其中DELETE方法將忽略身體。

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

所以讀完之後,我發現還有一些代理阻塞了DELETE和PUT方法。而且HTML表單只支持GET和POST方法。

我開始考慮在我的REST API中只使用GETPOST。 這樣我就可以有網友發帖進行刪除和對象或資源這樣的:

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 

搜索,並再次看完之後,我想出了使用API​​方法名稱,比如閃爍(api.flickr.com/services/rest/?method=flickr.collections.getInfo)mailchimp(api.mailchimp.com/1.3/?method=campaignDelete)

我使用X-HTTP-Method-Override

  • 一些解決方案

    1. 想我如解決方案1,使用'X-HTTP-Method-Override'。你怎麼看?

      谷歌似乎使用X-HTTP-方法,覆蓋,逆向工程&這個https://developers.google.com/gdata/docs/2.0/basics

      閃爍和Mailchimp使用方法的名稱,如在溶液中2

  • +0

    您可以使用DELETE發送正文有效內容(請參閱http://stackoverflow.com/a/5928241/89771)。 –

    +0

    但這裏說不同http://stackoverflow.com/questions/299628/is-an-entity-body-allowed-for-an-http-delete-request – Ahmad

    +0

    @AlixAxel:我也這麼認爲 - 寫了我的API辦法。但這是一個壞主意。最後一些代理/網關刪除了刪除請求的主體。我們正在使用WS02 API網關,並將其刪除,所以如果外部調用(在內部工作正常),我的實際API從不會看到該主體。對我來說,需要一個身體的原因是,同一個網關不喜歡:在URL參數和我的ID包括他們。 – Adam

    回答

    0

    我知道這是你的業務邏輯的一部分,但我會建議你重新考慮或可能嘗試使用另一種解決方案,而不是休息。

    通過執行像你提到的那些東西,你將打破所有的REST概念,並且仍然沒有在你的應用上做足夠好的事情。

    我認爲在您的案例中最好的解決方案會考慮您的業務邏輯。也許它可以在沒有休息REST的情況下完成。

    如果你認爲它不能完成,那麼我會推薦你​​列出的第一個解決方案。這感覺不錯。

    希望它有幫助。

    +0

    是的,你是對的。 – Ahmad

    0

    CAN NOT用DELETE請求發送體。它沒有道理!

    REST風格將

    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 
    
    0

    是URL內容項的識別信息被刪除?如果是這樣,

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

    幷包含該網址作爲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