众所周知,文件上传最常使用POST
方法来完成。那么,为什么该GET
方法不能用于文件上传呢?是否有针对 HTTPGET
上传的具体禁令?
2 回答
GET 请求可能包含实体主体
RFC 2616 不阻止将实体主体作为 GET 请求的一部分。这经常被误解,因为 PHP 以其名称不佳的 $_GET
superglobal 混淆了水域。$_GET
从技术上讲,它与 HTTPGET
请求方法无关——它只不过是来自请求 URI 查询字符串的 url 编码参数的键值列表。$_GET
即使请求是通过 POST/PUT/etc 发出的,您也可以访问该数组。很奇怪,对吧?不是一个很好的抽象,是吗?
为什么 GET 实体主体是个坏主意
那么规范对 GET 方法有什么看法......好吧:
特别是,已经建立了约定,即 GET 和 HEAD 方法不应该具有采取除检索之外的操作的意义。这些方法应该被认为是“安全的”。
所以 GET 的重要一点是确保任何 GET 请求都是安全的。尽管如此,禁令只是“不应该” ......从技术上讲,HTTP 仍然允许 GET 请求导致不严格基于“检索”的操作。
当然,从语义的角度来看,使用名为GET
“获取”资源之外的方法执行操作也没有多大意义。
当 GET 实体主体完全错误时
关于幂等性,规范说:
方法还可以具有“幂等性”的属性,因为(除了错误或过期问题)N > 0 个相同请求的副作用与单个请求相同。GET、HEAD、PUT 和 DELETE 方法共享此属性。
这意味着 GET 方法不能对同一资源的多个请求产生不同的副作用。因此,无论作为 GET 请求的一部分存在的实体主体如何,副作用都必须始终相同。用外行的话来说,这意味着如果你发送一个带有实体主体的 GET 100 次,服务器就不能创建 100 个新资源。无论是发送一次还是发送 100 次请求都必须具有相同的结果。这严重限制了 GET 方法发送实体主体的有用性。
当有疑问时,在评估方法的有效性及其产生的副作用时,总是回退到安全性/幂等性测试。
在 GET 方法的情况下
- 以名称/值对的形式将表单数据附加到 URL 中,并且 URL 的长度是有限的(3000 个字符)。
- 不能使用表单将文件内容放入 URL 参数中。所以使用 POST
- 在 Get 方法中,action 的值会附加一个 `?' 到它,然后附加表单数据集,使用“application/x-www-form-urlencoded”内容类型编码。用户代理然后遍历此 URI 的链接。在这种情况下,表单数据仅限于 ASCII 代码。
因此,在 GET 方法中无法上传文件