Является ли конечный амперсанд законным по URL-адресу?

URL-адрес, например

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

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

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

Например, API-интерфейс Java Servlet позволяет использовать Scala Spray (то есть он выдает ошибку).

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

Ответ 1

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

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


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

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

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

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

Возвращаясь назад, вы

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

И раньше еще

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

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

Ответ 2

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

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