为什么HttpRequest.HttpMethod是字符串而不是枚举?

在.NET Framework 的HttpRequest.HttpMethod参考中 ,请求类型使用System.String类型声明。

在RFC 2616中声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE ……)。

HttpWebRequest和.NET的WebRequest类中也有类似的行为。

Java在HttpURLConnection#setRequestMethod(String)方法上有类似的方法。

为什么这些语言设计者不考虑为这些HTTP方法实现枚举?

你有好主意吗?

您的RFC 2616链接的第一句话(强调添加):

HTTP / 1.1的常用方法集定义如下。 虽然这套可以扩大 ……

也就是说,HTTP中的方法可以是任何东西。 有“众所周知的”或常用的方法,其语义已被很好地理解(好吧,好的, 应该很好理解 – 我仍然遇到人们对GET / POST不清楚)。

但任何应用程序都可以实现其他方法 希望在客户端和服务器应用程序之间很好地理解其他方法的语义。

由于这些原因,枚举是不合适的,因为总有“其他”值不适合该枚举。


来自RFC 2616的更多引用:

实用信息系统需要比简单检索更多的function,包括搜索,前端更新和注释。 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 

规范明确允许使用更多方法,因此无法枚举所有方法的集合。

正如Damien所提到的,RFC2616只定义了常用方法。 与XML一样,HTTP是一种可以扩展为支持其他格式的协议。

例如,假设我想实现一个名为“Encrypt”的特殊方法。 如果HTTP库是枚举,它将失败并可能抛出exception。 当然,客户端必须知道这种特殊的请求类型,这就是为什么大多数扩展是通过头而不是命令完成的。

HTTP是一种可扩展的协议,但实际上很少有人扩展它。

考虑这个简单的例子:

 

既然“方法”只是文本,用户可以在那里放任何东西,那么HTTP处理程序必须能够处理它,对吗?

编辑:

事实certificate,HTML 4规范只允许GET和POST成为有效值,但HTTP超出了这个范围。

如果HTTP附带一个新方法,那么java和C#需要更新它们的枚举。 他们什么时候更新? 他们会发布补丁吗? 或将在下一版本中更新? 因此,定义一个他们不控制的值的枚举并不是一个明智的决定。