Является ли параметр запроса url действительным, если он не имеет значения?

Является ли URL как http://example.com/foo?bar действительным?

Я ищу ссылку на что-то официальное, которое говорит так или иначе. Простой ответ "да/нет" или анекдотические доказательства не сократят его.

Ответ 1

  • Допустимо для URI RFC
  • Вероятно приемлемо для вашей серверной платформы/кода

URI RFC не задает формат строки запроса. Хотя известно, что в строке запроса часто несут пары имя-значение, это не обязательно (например, в ней часто содержится другой URI).

3.4. Запрос

Компонент запроса содержит неиерархические данные, которые вместе с    данные в компоненте пути (раздел 3.3) служат для идентификации    ресурс в рамках схемы URI и полномочий именования    (если есть)....

... Однако, поскольку компоненты запроса    часто используются для переноса идентифицирующей информации в форме    пары "ключ = значение" и одно часто используемое значение - это ссылка на    другой URI,...

HTML устанавливает, что форма, переданная через HTTP GET, должна кодировать значения формы в виде пар имя-значение в форме "? key1 = value1 & key2 = value2..." (правильно закодировано). Разбор строки запроса соответствует серверному коду (например, механизму сервлетов Java).

Вы не определяете, какую серверную структуру вы используете, если таковая имеется, но возможно, что ваша серверная инфраструктура может предполагать, что строка запроса всегда будет содержать пары имя-значение, и она может захлестнуть строку запроса который не находится в этом формате (например, ?bar). Если ваш собственный пользовательский код обрабатывает строку запроса, вам просто нужно убедиться, что вы обрабатываете этот формат строки запроса. Если это фреймворк, вам нужно проконсультироваться с вашей документацией или просто протестировать его, чтобы посмотреть, как он обрабатывается.

Ответ 2

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

Ответ 3

"Схема" http "используется для поиска сетевых ресурсов по протоколу HTTP. В этом разделе описываются синтаксис и семантика для URL-адресов для http". http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

Итак, да, что-то действительно после вопросительного знака. Ваш сервер может интерпретироваться по-разному, но anecdotally, вы можете видеть, что некоторые языки рассматривают это как логическое значение, которое является истинным, если указано.

Ответ 4

Да, это действительно.

Если вы просто хотите проверить, существует ли параметр или нет, это один из способов сделать это.

Ответ 6

isindex из HTML5 разрешает отправку формы для создания такого URL-адреса, предоставляя дополнительные доказательства того, что он действителен для HTML. Например:.

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

генерирует URL-адрес типа:

?bar

Стандарт: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindex, однако, устарел, как указано в: fooobar.com/questions/1677/...

Ответ 7

Спецификация URI

Единственная соответствующая часть спецификации URI - знать все, что находится между первым ? и первым #, соответствует определению спецификации запроса. Он может включать любые символы, такие как [:/.?]. Это означает, что строка запроса, такая как ?bar или ?ten+green+apples, действительна.

Найдите RFC 3986 здесь

Спецификация HTML

isindex не имеет смысла HTML5.

Он предоставил устаревший для использования в качестве первого элемента только в форме и отправляет без имени.

Если имя записи является "isindex", его тип "text", и это первая запись в наборе данных формы, затем добавьте значение к результату и пропустите остальные подшаги для этой записи, перемещаясь к следующей записи, если таковая имеется, или к следующему шагу в общем алгоритме.

Флаг isindex предназначен только для использования устаревшим способом. Формы в соответствующих HTML-документах не будут генерировать полезную нагрузку, которая должна быть декодирована с помощью этого набора флагов.

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

Поддержка в библиотеках

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

Perl URI.pm (специальная поддержка)

Некоторые библиотеки, такие как Perl URI предоставляют методы анализа таких структур

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url (без специальной поддержки)

В качестве еще более частого примера node.js принимает обычный маршрут и упрощает синтаксический анализ как

  • Строка
  • или объект ключей и значений (с помощью parseQueryString)

Большинство других URI-синтаксических API-интерфейсов следуют чему-то подобному.

Ответ 8

Как и все другие описанные ответы, он отлично подходит для проверки, особенно для булевых произведений

Вот простая функция для получения строки запроса по имени:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

и теперь вы хотите проверить, существует ли строка запроса, которую вы ищете, или нет, вы можете сделать простую вещь, например:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

exampleQueryString будет false, если функция не может найти строку запроса, иначе будет true.