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

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

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

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

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

    3.4. запрос

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Последний раз, когда isindex был поддержан, был HTML3 . Использование HTML5 – это упрощение обратной совместимости.

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

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

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

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

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

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

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

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

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

    • PHP parse_url следует как аналогичная реализация, но возвращает строку для запроса. Для парсинга в объект k=>v требуется parse_string()

    Это действительно: см. Wikipedia , RFC 1738 (3.3. HTTP) , RFC 3986 (3. Компоненты синтаксиса) .

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

     

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

     ?bar 

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

    isindex , однако, устарел, как указано в: https://stackoverflow.com/a/41689431/895245

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

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

     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 .

    Давайте будем гением компьютера.