Почему HttpRequest.HttpMethod - это строка вместо Enum?

В Ссылка HttpRequest.HttpMethod.NET Framework тип запроса объявлен с типом System.String.

В RFC 2616 объявлены все методы HTTP-запроса (например, POST, GET, PUT, DELETE...).

Аналогичное поведение наблюдается и в HttpWebRequest и WebRequest классах .NET.

Java имеет аналогичный подход в HttpURLConnection#setRequestMethod(String).

Почему эти разработчики языка не рассматривают возможность использования перечисления для этих HTTP-методов?

У вас есть идея?

Ответ 1

Первые предложения вашей RFC 2616 (выделено мной):

Ниже приведен набор общих методов для HTTP/1.1. Хотя этот набор можно расширить...

То есть, метод в HTTP может быть любым. Есть "хорошо известные" или распространенные методы, семантика которых хорошо понята (ну, ладно, должно быть хорошо понято - я все еще сталкиваюсь с людьми, неясными в GET/POST).

Но любое приложение может реализовать другие методы. Надеемся, семантика этих других методов будет хорошо понята между клиентскими и серверными приложениями.

По этим причинам перечисление будет неуместным, так как всегда могут быть "другие" значения, которые не соответствуют этому перечислению.


Больше цитат из RFC 2616:

Практические информационные системы требуют большей функциональности, чем просто    поиск, включая поиск, обновление интерфейса и аннотацию. HTTP    позволяет использовать открытый класс методов и заголовки, которые указывают на    цель запроса

и

Маркер метода указывает способ, который должен выполняться на    ресурс, идентифицированный 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

Ответ 2

Спецификация явно позволяет использовать больше методов, поэтому набор всех методов не может быть перечислен.

Ответ 3

если HTTP приходит с новым методом, тогда Java и С# должны обновить их перечисление. Когда они будут обновлять его? Выпустит ли патч? или будет обновляться в следующей версии? Поэтому определение перечня значений, которые они не контролируют, не является разумным решением.

Ответ 4

Как упоминает Damien, RFC2616 определяет только общие методы. HTTP, как и XML, является протоколом, который может быть расширен для поддержки других форматов.

Например, предположим, что я хотел реализовать специальный метод под названием "Шифрование". Если в библиотеке HTTP перечислены перечисления, это приведет к сбою и, вероятно, вызовет исключение. Конечно, клиент должен знать об этом специальном типе запроса, поэтому большинство расширений выполняются через заголовки, а не команды.

HTTP - это расширяемый протокол, но мало кто на самом деле его расширяет.

Рассмотрим этот простой пример:

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

Так как "метод" - это просто текст, и пользователь может что-то там положить, обработчик HTTP должен иметь возможность обрабатывать его, правильно?

EDIT:

Как выясняется, спецификация HTML 4 позволяет только GET и POST быть допустимыми значениями, но HTTP выходит за рамки этого.