Почему HttpRequest.HttpMethod - это строка вместо Enum? - PullRequest
23 голосов
/ 17 июля 2011

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

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

Существует также похожее поведение в HttpWebRequest и WebRequest классах .NET.

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

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

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

Ответы [ 4 ]

35 голосов
/ 17 июля 2011

Первые предложения вашей 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
3 голосов
/ 17 июля 2011

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

2 голосов
/ 17 июля 2011

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

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

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

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

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

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

EDIT:

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

2 голосов
/ 17 июля 2011

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

...