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

时间:2011-07-17 06:17:20

标签: java .net language-design

在.NET Framework的Reference of HttpRequest.HttpMethod中,请求类型以System.String类型声明。

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

在.NET的HttpWebRequestWebRequest类中也有类似的行为。

Java在HttpURLConnection#setRequestMethod(String)方法上采用了类似的方法。

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

你有什么想法吗?

4 个答案:

答案 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超出了这个范围。