将GET与POST混合 - 这是一种不好的做法吗?

时间:2009-10-20 04:21:26

标签: http post get header

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

e.g。

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

3 个答案:

答案 0 :(得分:45)

实际上,这会向服务器发送一个POST请求请求,所以从技术上讲,你不是将两者混合在一起:你正在使用POST和url参数。这没有任何根本性的错误,只要你不使用你的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?然后改变server =&gt; POST,不要更改server =&gt;得到。 由于可以使用任何动词(获取或发布)访问URL,因此不要将更改服务器的数据放入URL中,因为有人可能会复制该URL,执行GET并在不知情的情况下更改服务器。想象一下如果有人在Facebook上复制了这个URL并且有10 000人开始删除随机内容会发生什么?不好。最近的框架(node,ruby)更好地隔离了它,但不是基本的PHP,因此对于该语言来说这是一个很好的经验法则。

答案 1 :(得分:5)

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

答案 2 :(得分:5)

不,这很好。我在我公司的网站上做到这一点,例如在用户管理页面上。普通网址是:

/admin/user?name=jkugelman

然后删除我发布到同一页面的用户,除了我POST一个变量而不是执行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>