例如,我有豎起大拇指的按鈕,或者我想重新發送特定的郵件,或者我通過單擊按鈕來更改特定的列舉狀態(例如已發布/未發布)
現在關于 rails 實作,我可以使用put,get或使其作業patch,因為我只需要發送一個特定的id。
在我看來,最好的做法是使用patch,post或者put我的物件上的一個或幾個屬性會發生變化。所以這似乎主要是這里的約定。
在服務器端,我將不得不添加一些策略以只允許特定用戶這樣做,但除了添加策略之外,這里不使用傳統的 http 方法是否有任何可能的問題?
uj5u.com熱心網友回復:
使用 GET 的一個非常實際的問題是它應該是一種冪等方法。假設新人創建了表單:
get '/things/create', to: "things#create"
<%= form_with(model: @post, url: '/posts/create', method: :get) do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<%= f.submit %>
<% end %>
class PostsController < ApplicationController
def index
@posts = Post.all
end
def create
@post = Post.new(title: params[:post][:title])
@post.save
redirect_to action: :index
end
end
然后他在瀏覽器中試用它并且對它非常滿意。任務完成。
然后他的老板試圖對其進行測驗。他創建了一篇題為“無論如何這個新人可能不會那么壞”的帖子。然后他點擊后退按鈕嘗試創建另一個帖子。奇怪的是它只是回圈回到索引頁面。他再次嘗試 - 唯一發生的事情是頁面開始填滿“無論如何這個新人可能不會那么壞”并且他越來越不相信它實際上是真的。
如果您使用 POST、PATCH、PUT 或 DELETE,瀏覽器會警告他他將要重新發送表單。這就是為什么 GET 永遠不應該改變服務器上的任何東西(除了你的瀏覽量統計資料)。
它還允許任何惡意行為者通過欺騙用戶點擊鏈接來讓用戶創建、洗掉或修改資源。惡意行為者甚至不必努力創建網路釣魚站點并繞過 Rails 提供的反 CSRF 保護。
除了 Rails 的約定之外,客戶端或服務器對 POST、PATCH、PUT 或 DELETE 的處理方式完全沒有區別。
但是由于 Rails 是一個高度約定驅動的框架,它遵循特定的 REST 風格,如果您想提高作業效率而不是成為那個新人,那么遵循這些約定確實適合您。
當涉及到超越經典 CRUD 動詞的動作時,真正取決于您的最佳判斷力和意圖才是真正重要的。動作有什么作用?是否正在更新某些內容(PATCH)?它實際上是一個單獨的資源嗎?( POST /mails/1/mailouts). 如您所見,沒有簡單的答案。如果您不確定,請清楚并記錄您在做什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358377.html
