在.NET Framework的Reference of HttpRequest.HttpMethod
中,请求类型以System.String
类型声明。
在RFC 2616中声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE ......)。
在.NET的HttpWebRequest
和WebRequest
类中也有类似的行为。
Java在HttpURLConnection#setRequestMethod(String)
方法上采用了类似的方法。
为什么这些语言设计者不考虑为这些HTTP方法实现枚举?
你有什么想法吗?
答案 0 :(得分:34)
RFC 2616链接的第一句话(强调添加):
下面定义了HTTP / 1.1的常用方法集。虽然可以扩展此集合 ...
也就是说,HTTP中的方法可以是任何东西。有“众所周知的”或常用的方法,其语义已被很好地理解(好吧,好吧,应该很好理解 - 我仍然遇到人们在GET / POST上不清楚。)
但是任何应用程序都可以实现其他方法。希望客户端和服务器应用程序之间能够很好地理解其他方法的语义。
由于这些原因,枚举是不合适的,因为总会有“其他”值不适合该枚举。
来自RFC 2616的更多报价:
实用信息系统需要的功能多于简单功能 检索,包括搜索,前端更新和注释。的 HTTP 允许一组开放式的方法和标题表示 请求的目的
和
Method标记表示要对其执行的方法 Request-URI标识的资源。该方法区分大小写。
Method = "OPTIONS" ; Section 9.2
| "GET" ; Section 9.3
| "HEAD" ; Section 9.4
| "POST" ; Section 9.5
| "PUT" ; Section 9.6
| "DELETE" ; Section 9.7
| "TRACE" ; Section 9.8
| "CONNECT" ; Section 9.9
| extension-method
extension-method = token
答案 1 :(得分:3)
规范明确允许使用更多方法,因此无法枚举所有方法的集合。
答案 2 :(得分:2)
如果HTTP附带一个新方法,那么java和C#需要更新它们的枚举。他们什么时候更新?他们会发布补丁吗?或将在下一版本中更新?因此,定义一个他们不控制的值的枚举并不是一个明智的决定。
答案 3 :(得分:2)
正如Damien所提到的,RFC2616只定义了常用的方法。与XML一样,HTTP是一种可以扩展为支持其他格式的协议。
例如,假设我想实现一个名为“Encrypt”的特殊方法。如果HTTP库是枚举,它将失败并可能抛出异常。当然,客户端必须知道这种特殊的请求类型,这就是为什么大多数扩展是通过头而不是命令完成的。
HTTP是一种可扩展的协议,但实际上很少有人扩展它。
考虑这个简单的例子:
<form method="Foo" action="http://someurl"></form>
由于“方法”只是文本,并且用户可以在那里放任何东西,那么HTTP处理程序必须能够处理它,对吗?
编辑:
事实证明,HTML 4规范只允许GET和POST成为有效值,但HTTP超出了这个范围。