Закончен ли конечный амперсанд в URL? - PullRequest
19 голосов
/ 12 июля 2011

URL-адрес, такой как

http://localhost/path?a=b&c=d

, в порядке - но каков статус того же URL-адреса с конечным амперсандом?

http://localhost/path?a=b&c=d&

Например, API сервлетов Java позволяет это там, где Scala's Spray не выполняет (т.е. выдает ошибку).

Я пытался найти ответ в спецификации синтаксиса URI , но не уверен, как анализироватьих грамматика.

Ответы [ 2 ]

23 голосов
/ 12 июля 2011

Спецификация синтаксиса URI предназначена для общих URI.Это позволяет что-либо в запросе .Я не знаю ни одной спецификации, которая на самом деле определяет разделенные амперсандом пары ключ / значение.Я считаю, что это просто соглашение.Я знаю, что PHP, например, предлагает опцию для использования другого разделителя.Но теперь все используют разделенные амперсандом вещи, когда им нужны пары ключ-значение.Вы все еще время от времени сталкиваетесь с вещами, которые используют его только для простой строки, например, http://example.com/?example. Это совершенно верно.

Основной ответ, однако, заключается в том, что & допустимо в любом месте запросастрока, включая в конце.


Разоблачение синтаксиса RFC или Почему & допустим в любом месте строки запроса:

Во-первых, у вас есть

query       = *( pchar / "/" / "?" )

(Таким образом, строка запроса состоит из любого числа pchar и буквенных слешей и вопросительных знаков.)

Возвращаясь, у вас есть

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"

И еще раньше

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="

Итак, литерал & находится в sub-delims, что в pchar, поэтому он действителен в query

6 голосов
/ 12 июля 2011

Я думаю, что есть неписанное правило, что все RFC должны быть почти невозможны для понимания. Вы не первый человек, который не может разобрать грамматику и, по моему скромному мнению, спрей тоже не удался.

В последнем амперсанде нет ничего плохого. Это юридический символ в URI, используемый для разделения параметров. Конечный амперсанд может быть бессмысленным, но он не является недействительным. Спрей должен (опять же, только на мой взгляд) просто игнорировать его.

...