Является ли параметр запроса URL действительным, если он не имеет значения? - PullRequest
115 голосов
/ 29 декабря 2010

URL-адрес, такой как http://example.com/foo?bar, действителен?

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

Ответы [ 8 ]

86 голосов
/ 29 декабря 2010
  • Действительно для URI RFC
  • Вероятно, приемлемо для вашей серверной инфраструктуры / кода

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

3.4.Запрос

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

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

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

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

68 голосов
/ 29 декабря 2010

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

7 голосов
/ 29 декабря 2010

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

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

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

5 голосов
/ 29 декабря 2010

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

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

3 голосов
/ 17 января 2017

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

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

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

HTML Spec

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

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

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

Флаг 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.

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

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

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

Большинство других API-интерфейсов URI-анализа, выполняющих что-то похожее на это.

2 голосов

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

<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 однако не рекомендуется, как указано в: https://stackoverflow.com/a/41689431/895245

2 голосов
/ 29 декабря 2010
0 голосов
/ 21 февраля 2017

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

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...