URL中的参数和<form method =“get”>?</form>之间是否有任何区别?

时间:2008-11-05 17:20:13

标签: http url limits

现在,我知道URL中的参数和POST参数之间的区别:如果URL太长,某些浏览器可能会出错,因此即使您的应用程序在URL中填充数百个参数也不是一个好主意可以回应GET请求。

为了便于讨论,我们假设以下Web应用程序:用户可以输入一系列(可能是数百个)X,Y坐标。服务器将它们绘制在一个图表中,该图表作为图像返回。

这显然是idempotent operation的示例,因此,根据HTTP spec,建议将其作为GET操作实现。但是,您无法使用所有参数构建URL,因为它太长了。可以&lt; form method =“get”&gt;处理那么多参数?

我也听说过&lt; form method =“get”&gt;完全等同于在URL中放置参数?现在,某些浏览器或整个HTTP协议都是如此吗?请求有最大长度吗?

8 个答案:

答案 0 :(得分:7)

HTTP规范没有设置限制,但浏览器和服务器都有。有关详细信息,请参阅here

如果表单的方法设置为GET,浏览器将创建一个长URL,因此适用上述限制。

答案 1 :(得分:3)

HTTP specification并未明确要求将GET请求的参数放入URI中。使用POST do在表格中发送消息正文是合法的。

然而,浏览器以这种方式实现GET表单的原因非常充分:缓存。 预计GET请求将在服务器上处理而没有副作用。因此,可以缓存对GET请求的响应。如果你开始在GET请求上使用消息体,这个性能改进选项会立即丢失。

如果您打算设计图表API,可能需要查看Google。他们已经向公众提供了一个非常好的。即使它只是学习如何将尽可能多的信息打包到URI参数中,也值得一看。

alt text alt text alt text alt text

答案 2 :(得分:2)

您的浏览器实际上做的是从表单输入构建一个非常长的URL。因此,URL和表单Method =“GET”之间没有区别。任何一个都会导致加载相同的URL。

答案 3 :(得分:1)

form method = get WILL将所有表单的输入放入URL中。

浏览器确实具有URL的最大长度。它从浏览器变为浏览器,并且肯定会从浏览器版本变为浏览器版本。

如果可以的话,我会建议您为表单使用POST。

HTH

答案 4 :(得分:1)

GET和url?name = value&amp; ...是相同的,因为浏览器只是在发送请求之前将GET表单转换为URL。

URL的最大长度是在浏览器和服务器级别确定的,因此,对于给定的浏览器/服务器,它是两者中较小的一个。

This post有一个很好的URLS

当前最大长度列表

答案 5 :(得分:1)

不,服务器无法看到在URL中放置参数和使用带有GET方法的FORM之间的区别。因此,如果带参数的给定URL太长,使用带有GET方法的FORM将无济于事。

POST或GET应该主要选择它们的语义。 GET用于“安全”行动。也就是说,不应对用户对GET请求执行的操作负责。 POST方法用于对用户负责的操作。

例如,当搜索功能使用POST时,这非常令人沮丧。用户不希望简单的查询改变任何重要的系统状态 - 他们希望搜索是一个“安全”的操作。

另一方面,存在许多漏洞,因为通过GET请求以及POST可以访问不安全的操作。这会导致像XSRF这样的漏洞,攻击者只需要将恶意的“src”URL转换为合法站点上的IMG标记。

对于您的用例,Ajax实际上可能是一个合适的解决方案。您可以为所选的每个点发出GET请求,并将它们存储在服务器的会话中。当用户完成输入点数后,最终的GET请求将检索完成的产品。

答案 6 :(得分:0)

  

我也听说过&lt; form method =“get”&gt;完全等同于在URL中放置参数?

这是真的,这是相应的RFC section

  

请求的最大长度是多少?

spec表示“HTTP协议不会对URI的长度设置任何先验限制。”

但Internet Explorer 6的限制为2,083个字符。 其他浏览器允许更多字符,但如果你走这条路线,你基本上必须设计ie6

答案 7 :(得分:0)

这不是你的关于get和post的问题的答案,但在你所描述的情况下,将更复杂的数据存储在服务器上并将其与会话ID或用户帐户相关联通常更容易而不是每次都把它放入URL。然后,您可以在cookie中使用该会话的标识符,也可以使用url参数来检索图像。

这也可以帮助您缓存所请求的图像,这样您就不必每次用户想要再次查看特定图表时都要重新生成它们。