【小家java】 Restful風格的API設計中,怎麼實現批量刪除?
相關閱讀
每篇一句
面試高大上,面試造飛機,工作擰螺絲
因此不能以為自己工作覺得還OK,就覺得自己技術還不錯了
如題,指的是在restful風格的url設計中,怎麼實現批量刪除呢?
這裡指的刪除是真刪除,不是邏輯刪除。如果是邏輯刪除,其實就是update,使用put方法即可
如果是需要刪除一個條目,可以直接將需要刪除的條目的id放進url裡面,比如http://example.com/posts/2016,但是如果需要再一次請求裡面刪除多個條目,應該如何設計比較合理呢?我現在想到的是以下兩種方法:
- 將需要刪除的一系列id放進請求體裡面,但是似乎沒有這樣的標準(DELETE請求)。
先說說方法1,如果刪除的資料非常多,比如超過1000個id,那很可能就超過URL的長度限制了。
Url長度限制:
IE7.0 :url最大長度2083個字元,超過最大長度後仍然能提交,但是隻能傳過去2083個字元。
firefox 3.0.3 :url最大長度7764個字元,超過最大長度後無法提交。
Google Chrome 2.0.168 :url最大長度7713個字元,超過最大長度後無法提交
從上面可以看出,這是有風險的可能提交不了的。但是話說回來,你是什麼需求,需要一次性刪除1000條記錄,這是多麼危險的操作,怎麼可能通過API暴露出來呢?所以綜合考慮,我個人認為,使用url的方式傳遞刪除的值,是沒有任何問題的。畢竟我們99%的情況,都是非常少量多額刪除操作。
再說說方法2,其實我是不太建議的。因為我們刪除操作,肯定使用DELETE請求,但是奈何我們並不建議在DELETE請求裡放body體,原因在於:根據RFC標準文件,DELETE請求的body在語義上沒有任何意義。事實上一些閘道器、代理、防火牆在收到DELETE請求後,會把請求的body直接剝離掉。
所以,萬一你要放在body體裡傳參,請使用POST請求
這裡介紹一種比較優雅,但是比較麻煩點的方法:
分成2步完成,第一步傳送POST請求,集合所有要刪除的IDs然後返回一個header,然後在利用這個header呼叫DELETE請求。具體步驟如下:
傳送POST請求,集中所有的IDs (可以存到Redis或者普通資料庫)
成功後可以返回一個唯一的標頭檔案:
這樣就可以在不暴露IDs的情況下更加安全的刪除相關條目。
最後如果要獲得一個資源,一定要用GET方法麼?
在一些文章中,看到獲取資源的時候,一般用GET方法。我的問題是,我要獲取的資源是一個賬戶的資訊,需要實用token,我一般把token放在POST請求裡面,當然也可以將token放在連線中使用GET。
其實,restful只是一種理想的情。你是否完全遵循Restful設計原則了 如果完全遵循的話, 獲取賬戶資訊應當是GET請求, 但是token通常是會放在header中, 不在url中體現
針對我們的token這個事情,在我專案中會使用post請求根據使用者資訊獲取一個token,然後拿著token用get方法請求資源。**另外,我也會將token放到http請求頭中。**以上是個人工作經驗,希望對各位有幫助
最後
restful風格的url我們可以儘量去遵守,因為它對運維或者監控都非常友好。但是不要一根經,它只是理想情況,有的時候並不滿足我們的需求,我們可以變通的看問題。
知識交流
若群二維碼失效,請加微訊號(或者掃描下方二維碼):fsx641385712。
並且備註:“java入群” 字樣,會手動邀請入群