【发布时间】:2015-12-08 09:13:51
【问题描述】:
GET用于检索远程数据,POST用于插入/更新远程数据
但是当我们使用<form> 发送数据时,我们可以在action 中输入POST 或GET,在这两种情况下都会发送数据。在这种情况下,数据将不会被检索或插入,只会被发送到服务器。
<form>中的这些GET和POST方法和上面描述的GET和POST不一样吗?
【问题讨论】:
GET用于检索远程数据,POST用于插入/更新远程数据
但是当我们使用<form> 发送数据时,我们可以在action 中输入POST 或GET,在这两种情况下都会发送数据。在这种情况下,数据将不会被检索或插入,只会被发送到服务器。
<form>中的这些GET和POST方法和上面描述的GET和POST不一样吗?
【问题讨论】:
表单操作会告诉您的浏览器如何发送表单数据。
在 GEt 的情况下,表单数据将作为查询字符串参数出现,在 POST 的情况下作为 multipart/form-data 正文。当然,这也会改变查询的方法(如GET 或POST)。
这是针对协议的客户端部分。
现在,在服务器端,GET 和POST 不应该以相同的方式运行。
GET 是幂等的POST 不是这意味着服务器(或服务器链,您可以在链中具有反向代理缓存)必须期望 POST 正在对应用程序数据执行某些操作,因此应用程序或状态是POST 之后就不一样了(也许你现在有一个会话,或者你刚刚删除了一些东西,或者添加了一些东西)。结束这意味着您不能毫无风险地重复 POST 两次。事实上,任何人都不应该重播 POST,这是一个动作。
如果您的表单发布为GET,那就另当别论了。您只需要一个 url(其中包含您的表单数据在 url 的查询字符串中),您会得到一个结果,但是多次重播相同的 url 不应该是一个问题,我们也可以缓存结果并为请求相同 url 的人重用此缓存结果(因此在表单中具有相同的元素,现在在 url 中)。
因此,如果方法是 GET,您的应用程序不得执行数据更改。不删除某些内容,不创建某些内容等。
那么,为什么要以 GET 形式发送表单?也许只是为了获得过滤后的页面结果,每个人都应该使用相同的过滤器获得相同的页面结果。但肯定不要发布注册表单(或管理员级别的删除此用户操作)。
【讨论】: