混合使用GET和POST是不好的做法? (注意这是用PHP)
e.g。
<form action="delete.php?l=en&r=homepage" method="post">
<!-- post fields here -->
</form>
答案 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>