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

Java 为什么HttpRequest.HttpMethod是字符串而不是枚举?,java,.net,language-design,Java,.net,Language Design,在.NET Framework中,请求类型是用System.Stringtype声明的 在所有HTTP请求中都声明了方法(例如POST、GET、PUT、DELETE…) 在.NET的和WebRequest类中也有类似的行为 Java在方法上也有类似的方法 为什么这些语言设计者不考虑为这些HTTP方法实现枚举? 你有什么想法吗?如果HTTP提供了一种新方法,那么java和C需要更新它们的枚举。他们什么时候更新?他们会发布补丁吗?或者将在下一版本中更新?因此,在他们无法控制的值上定义枚举不是明智的决

在.NET Framework中,请求类型是用
System.String
type声明的

在所有HTTP请求中都声明了方法(例如POST、GET、PUT、DELETE…)

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

Java在方法上也有类似的方法

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


你有什么想法吗?

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

链接的第一句话(添加了强调):

HTTP/1.1的通用方法集定义如下。虽然这个集合可以扩展

也就是说,HTTP中的方法可以是任何东西。有一些“众所周知的”或通用的方法,它们的语义很容易理解(好吧,好吧,应该很容易理解——我仍然会遇到在GET/POST上不清楚的人)

但任何应用程序都可以实现其他方法。希望客户机和服务器应用程序能够很好地理解这些其他方法的语义

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


更多引用自:

实用的信息系统需要更多的功能,而不是简单的 检索,包括搜索、前端更新和注释HTTP 允许开放式方法集和指示 请求的目的

以及

Method标记指示要在上执行的方法 由请求URI标识的资源。该方法区分大小写


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

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

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

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

考虑这个简单的例子:

<form method="Foo" action="http://someurl"></form>

因为“方法”只是文本,用户可以在其中放置任何内容,所以HTTP处理程序必须能够处理它,对吗

编辑:


事实证明,HTML4规范只允许GET和POST为有效值,但HTTP超出了这一范围。

以何种方式?我不是在比较HTTP和枚举。它就像香蕉和高中生。你的答案不是解释性的。为了扩展答案,可以扩展方法,这样谁来维护枚举库???我仍然没有从你的评论中得到任何信息。如果HTTP附带了一个新方法,那么java和C需要更新他们的枚举。他们什么时候更新?他们会发布补丁吗?或者将在下一版本中更新?因此,在它们无法控制的值上定义枚举不是一个明智的决定……我同意,但当您查看System.Web.Mvc.HttpVerbs枚举时,我有点不知所措。好事还是坏事?另外,我认为将此枚举放在namespace System.Web.Mvc下是一个错误的决定。@liuhongbo-我能看到的
Mvc
命名空间中其他地方使用的每个地方,它们似乎都支持两个重载-一个接受来自此枚举的值,另一个接受字符串(或字符串数组)。这是一种不同的方法,但他们似乎仍然需要在该方法不在常用集合中时提供一个安全阀。作为这个答案的一个例子,补丁不在HttpMethod的方法列表中
<form method="Foo" action="http://someurl"></form>