6

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

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

这显然是一个幂等操作的示例,因此,根据HTTP 规范,建议将其实现为 GET 操作。但是,您无法构建包含所有参数的 URL,因为它会太长。<form method="get"> 可以处理那么多参数吗?

我还听说 <form method="get"> 完全等同于在 URL 中放置参数?现在,对于某些浏览器或整个 HTTP 协议是这样吗?请求是否有最大长度?

4

8 回答 8

7

HTTP 规范没有设置限制,但浏览器和服务器会这样做。具体见这里

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

于 2008-11-05T17:26:01.267 回答
3

HTTP 规范没有明确要求将 GET 请求的参数放入 URI 。在 GET 请求中发送消息体是合法的,比如使用 POST 的表单。

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

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

替代文字 替代文字 替代文字 替代文字

于 2008-11-05T17:44:54.830 回答
2

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

于 2008-11-05T17:23:30.427 回答
1

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

浏览器确实有 URL 的最大长度。它从浏览器更改为浏览器,当然也从浏览器版本更改为浏览器版本。

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

高温高压

于 2008-11-05T17:27:52.837 回答
1

GET 和 url ?name=value&... 是一回事,因为浏览器只是在发送请求之前将 GET 表单转换为 URL。

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

这篇文章有一个很好的 URLS 当前最大长度列表

于 2008-11-05T17:28:32.913 回答
1

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

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

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

另一方面,由于可以通过 GET 请求和 POST 访问不安全的操作,因此存在许多漏洞。这会导致 XSRF 等漏洞,攻击者只需将恶意“src”URL 获取到合法站点上的 IMG 标记中即可。

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

于 2008-11-05T17:38:11.367 回答
0

我还听说 <form method="get"> 完全等同于在 URL 中放置参数?

没错,这里是对应的RFC部分

请求是否有最大长度?

规范说“ HTTP 协议没有对 URI 的长度施加任何先验限制。”

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

于 2008-11-05T17:27:50.077 回答
0

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

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

于 2008-11-05T17:37:10.993 回答