使用 get 方法而不是通过单击按钮执行操作是否存在真正的问题

Is there a real problem with using i.e. get method instead of put in an action through clicking on a button

例如,我有竖起大拇指的按钮,或者我想重新发送特定的邮件,或者我通过单击按钮更改特定的枚举状态(例如 published/unpublished)

现在关于 rails 实施,我可以使用 putgetpatch 使其工作,因为我只需要发送一个特定的 ID。

在我看来,使用 patchpostput 似乎是最佳实践,无论一个或多个属性将在我的对象上发生变化。所以这似乎主要是这里的约定。

在服务器端,我将不得不添加一些策略以仅允许特定用户这样做,但是除了添加策略之外,这里不使用传统的 http 方法是否存在任何可能的问题?

使用 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 标题为“这个新人可能还不错”。然后他点击后退按钮尝试创建另一个 Post。奇怪的是它只是循环回到索引页。他再次尝试 - 唯一发生的事情是页面开始充满“这个新人可能还不是那么糟糕”,他越来越不相信这是真的。

如果您使用 POST、PATCH、PUT 或 DELETE,浏览器会警告他即将重新发送表单。这就是为什么 GET 不应该改变服务器上的任何东西(除了你的网页浏览统计数据)。

它也为任何恶意行为者打开了大门,让用户通过简单地点击 link 来创建、删除或修改资源。恶意行为者甚至不必努力创建网络钓鱼站点并绕过 Rails 提供的 anti-CSRF 保护。

除了Rails的约定之外,客户端或服务器如何处理POST、PATCH、PUT或DELETE之间绝对没有区别。

但是由于 Rails 是一个高度约定俗成的框架,它遵循特定的 REST 风格,如果您想提高工作效率而不是 新事物,那么遵循这些约定确实适合您家伙.

当涉及到超出经典 CRUD 动词的操作时,真正取决于您的最佳判断和意图才是真正重要的。动作有什么作用?它是否在更新某些东西(PATCH)?它实际上是一个单独的资源吗? (POST /mails/1/mailouts)。如您所见,没有简单的答案。如果您不确定,请清楚并记录您在做什么。