【问题标题】:Mixing GET with POST - is it a bad practice?将 GET 与 POST 混合使用 - 这是一种不好的做法吗?
【发布时间】:2009-10-20 04:21:25
【问题描述】:

混合使用 GET 和 POST 是一种不好的做法吗? (注意这是在 PHP 中)

例如

<form action="delete.php?l=en&r=homepage" method="post">
 <!-- post fields here -->
</form>

【问题讨论】:

  • 如果你问这是否是不好的做法可能更有意义
  • @d03boy - 是的,我是这么想的。会改变
  • 据此dev.ckeditor.com/ticket/727 混合 GET 和 POST 甚至可能会失败,尽管我还没有看到它。所以我想知道,它会失败吗?

标签: http post get header


【解决方案1】:

实际上,这将向服务器发送一个 POST 请求请求,因此从技术上讲,您不会将两者混合在一起:您正在使用带有 url 参数的 POST。只要您不将 URL 用于应该在表单中作为隐藏字段的参数,这从根本上没有错。

有一些简单的规则:你使用 GET(可能带有 URL 参数)来处理不改变服务器的常量,而使用 POST 来修改服务器。如果您的 url 参数包含您要删除的内容的 ID,那么这是不好的做法。

几年后编辑

我被要求提供来源,所以这里是 HTTP 规范的相关部分

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

已经确立了 GET 和 HEAD 方法不应该具有采取除检索之外的操作的意义的约定。 这些方法应该被认为是“安全的”。这允许用户代理以特殊方式表示其他方法,例如 POST、PUT 和 DELETE,以便 用户意识到可能不安全的操作 正在被请求。

你去吧,GET不应该改变任何东西,POST是改变服务器的东西(不安全的操作)。我应该可以多次调用 GET 。它不仅仅是幂等的:它应该(尽可能)没有副作用!使用 GET 请求如果涉及缓存,甚至可能无法到达服务器。

是的:你有一个表单,想知道你使用的是 GET 还是 POST?然后更改服务器=> POST,不要更改服务器=> GET。 由于可以使用任何动词(get 或 post)访问 URL,因此不要将更改服务器的数据放在 URL 中,因为有人可能会复制该 URL,执行 GET 并在您不知情的情况下更改您的服务器. 想象一下,如果有人在 facebook 上复制了该 URL 并且 10 000 人开始删除随机内容会发生什么?不好。最近的框架(node、ruby)更好地隔离了这一点,但不是基本的 PHP,因此它是该语言的一个很好的经验法则。

【讨论】:

  • 这太简单了。一方面,只有当操作是幂等的时候才应该使用 GET。
  • 我想查看该声明的任何支持资源。
  • 我添加了来源。让回复不那么简洁,但我相信更好的解释。
【解决方案2】:

它仍然是一个 POST,您只是在 URL 中包含一个查询字符串。我看不出这有什么问题。通过使用隐藏的输入字段将这些变量包含在发布数据中可能会更干净。另外,在服务器上,您可能不希望 l (语言?)的值与您的帖子数据一起使用。如果它总是在查询字符串中,您可以在其他地方使用相同的代码来确定语言,而不是为 POST 请求设置特殊情况。

【讨论】:

  • 这是一个比 John Kugelman 更好的答案。我相信包括标识 program 或 environment 的参数是可以的(例如 ?action=deleteUser&language=en),甚至是好的做法,包括你想要的东西的 ID采取行动是不好的做法(例如?userId=123)。这属于隐藏字段。
【解决方案3】:

不,这很好。我在我公司的网站上就是这样做的,例如在用户管理页面上。正常的网址是:

/admin/user?name=jkugelman

然后删除我发布到同一页面的用户,除了我发布变量而不是执行 GET,因为删除是有状态的操作,应该使用 POST 完成。它看起来像这样:

<!-- Post back to self -->
<form action="/admin/user?name=jkugelman">
    <input type="submit" name="delete" value="Delete"
           onchange="return confirm('Are you sure?')" />
</form>

【讨论】:

  • 好吧,如果只有 HTML 允许,理想情况下,删除将通过 DELETE 操作完成。
  • 如果你问我,我认为这是一个非常糟糕的实现。我会将用户名放在隐藏字段中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多