Секундомер как разделитель запросов URL

удалена мертвая ссылка Imageshack – амперсанд против точки с запятой

Хотя настоятельно рекомендуется ( источник W3C , через Википедию ), чтобы веб-серверы поддерживали точку с запятой в качестве разделителя элементов запроса URL (в дополнение к амперсанду), похоже, что это вообще не выполняется.

Например, сравните

http://www.google.com/search?q=nemo & oe = utf-8

http://www.google.com/search?q=nemo ; ОЕ = UTF-8

Результаты. (В последнем случае точка с запятой есть или была на момент написания этого текста , рассматривалась как обычный строковый символ, как если бы URL был: http://www.google.com/search?q=nemo% 3B oe = utf-8 )

Хотя первая библиотека анализа URL, которую я пробовал, ведет себя хорошо:

>>> from urlparse import urlparse, query_qs >>> url = 'http://www.google.com/search?q=nemo;oe=utf-8' >>> parse_qs(urlparse(url).query) {'q': ['nemo'], 'oe': ['utf-8']} 

Каков текущий статус приема точки с запятой в качестве разделителя и каковы потенциальные проблемы или интересные заметки? (с точки зрения сервера и клиента)

Рекомендация W3C от 1999 года устарела. Текущее состояние, согласно Рекомендации W3C 2014 , заключается в том, что точка с запятой теперь является незаконной как разделитель параметров:

Чтобы декодировать полезную нагрузку приложения / x-www-form-urlencoded, следует использовать следующий алгоритм. […] Результатом этого алгоритма является отсортированный список пар имя-значение. […]

  1. Пусть строки являются результатом строгого разделения полезной нагрузки строки на символы U + 0026 AMPERSAND (&).

Другими словами ?foo=bar;baz означает, что параметр foo будет иметь значение bar;baz ; тогда как ?foo=bar;baz=sna должен приводить к тому, что foo является bar;baz=sna (хотя технически незаконным, так как второй = должен быть экранирован до %3D ).

Пока ваш HTTP-сервер и ваше серверное приложение принимают точки с запятой в качестве разделителей, вам должно быть хорошо идти. Я не вижу недостатков. Как вы сказали, спецификация W3C на вашей стороне :

Мы рекомендуем, чтобы разработчики HTTP-сервера и, в частности, разработчики CGI поддерживали использование «;» вместо «&», чтобы сохранить авторам проблему экранирования символов «&» таким образом.

Я согласен с Бобом Аманом. Спецификация W3C предназначена для упрощения использования гиперссылок с привязкой с URL-адресами, которые выглядят как формы запросов GET (например, http://www.host.com/?x=1&y=2 ). В этом контексте амперсанд конфликтует с системой для ссылок на объекты символов, которые все начинаются с амперсанда (например, «). Поэтому W3C рекомендует веб-серверам разрешать использование точки с запятой в качестве разделителя полей вместо амперсанда, чтобы упростить запись этих URL-адресов. Но это решение требует, чтобы авторы помнили, что амперсанд должен быть заменен чем-то, и что a ; является равноправным полевым разделителем, хотя веб-браузеры универсально используют амперсанды в URL-адресе при отправке форм. Это, возможно, сложнее, если вспомнить о замене амперсанда на & в этих ссылках, как это было бы сделано в другом месте документа.

Хуже того, пока все веб-серверы не будут использовать точки с запятой в качестве разделителей полей, авторы URL-адресов могут использовать этот ярлык только для некоторых хостов и должны использовать & для других. Они также должны будут изменить свой код позже, если данный хост перестает допускать разделители с запятой. Это, безусловно, сложнее, чем просто использовать & , который будет работать на каждом сервере навсегда. Это, в свою очередь, устраняет любые стимулы для веб-серверов, позволяющих использовать точки с запятой в качестве разделителей полей. Зачем беспокоиться, когда все уже меняют амперсанд на & вместо ; ?

Короче говоря, HTML – большой беспорядок (из-за его снисходительности), а использование точек с запятой помогает упростить это LOT. Я оцениваю, что когда я определяю усложнения, которые я нашел, использование амперсандов в качестве разделителя делает весь процесс примерно в три раза сложнее, чем использование точек с запятой для разделителей!

Я программист .NET, и, насколько мне известно, .NET по своей сути не разрешает ‘;’ разделители, поэтому я написал свои собственные методы синтаксического анализа и обработки, потому что видел огромную ценность в использовании точек с запятой, а не уже проблемную систему использования амперсандов в качестве разделителей. К сожалению, очень уважаемые люди (например, @Bob Aman в другом ответе) не видят значения, почему использование с запятой намного превосходит и намного проще, чем использование амперсандов. Итак, теперь я разделяю несколько моментов, чтобы убедить других уважаемых разработчиков, которые еще не признают ценность использования точек с запятой:

Использование такой строки, как «? A = 1 & b = 2» на странице HTML, является ненадлежащим (без кодирования HTML сначала), но большую часть времени он работает. Однако это связано только с толерантностью большинства браузеров и что толерантность может привести к труднодоступным ошибкам, когда, например, значение пары значений ключа отправляется на URL-адрес страницы HTML без правильной кодировки (непосредственно как «? a = 1 & b = 2 ‘в источнике HTML). QueryString как «? Who = me + & + you» тоже проблематично.

Мы, люди, можем иметь предубеждения и можем не соглашаться с нашими предрассудками в течение всего дня, поэтому признание наших предубеждений очень важно. Например, я согласен, что я просто думаю, что разделяю с ‘;’ выглядит «чище». Я согласен с тем, что мое «чистое» мнение – это просто предвзятость. И еще один разработчик может иметь одинаково противоположный и одинаково допустимый уклон. Поэтому мой уклон в этом вопросе не более корректен, чем противоположный уклон.

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

С помощью ; поскольку разделитель QueryString делает его намного проще. Амперсандовые сепараторы более чем в два раза сложнее кодировать правильно, чем если бы использовались точки с запятой. (Я думаю), большинство реализаций неправильно кодируются, поэтому большинство реализаций не в два раза сложнее. Но затем отслеживание и исправление ошибок приводит к снижению производительности. Здесь я указываю на 2 отдельных шага кодирования, необходимых для правильного кодирования QueryString, когда & является разделителем:

  • Шаг 1: URL-адрес кодирует как ключи, так и значения строки запроса.
  • Шаг 2: объедините ключи и значения типа «a = 1 & b = 2» после того, как они будут закодированы с шага 1 URL.
  • Шаг 3. Затем HTML кодирует всю QueryString в исходном HTML-файле страницы.

Таким образом, специальная кодировка должна выполняться дважды для правильной (без ошибок) кодировки URL, а не только для этого, но кодировки представляют собой два разных разных типа кодирования. Первая – это кодировка URL, а вторая – кодировка HTML (для исходного кода HTML). Если какая-либо из них неверна, я могу найти вам ошибку. Но шаг 3 отличается для XML. Для XML вместо этого требуется кодировка символов XML-символов (что почти идентично). Я хочу сказать, что последняя кодировка зависит от контекста URL-адреса, будь то на веб-странице HTML или в документации XML.

Теперь с гораздо более простыми разделителями с запятой, процесс будет как один wud ожидать:

  • 1: URL-адрес кодирует ключи и значения,
  • 2: объединить значения вместе. (Без кодирования для шага 3.)

Я думаю, что большинство веб-разработчиков пропускают шаг 3, потому что браузеры настолько снисходительны. Но это приводит к ошибкам и более сложным ситуациям, когда вы пытаетесь уничтожить эти ошибки или пользователей, которые не могут делать что-либо, если эти ошибки не присутствуют, или писать отчеты об ошибках и т. Д.

Еще одно осложнение в реальном использовании заключается в написании разметки документации XML в моем исходном коде как на C #, так и на VB.NET. Так как & должно быть закодировано, это реальное сопротивление, в буквальном смысле, моей производительности. Этот дополнительный шаг 3 затрудняет чтение исходного кода. Таким образом, этот трудный для чтения дефицит применяется не только к HTML и XML, но и к другим приложениям, таким как код C # и VB.NET, потому что их документация использует XML-документацию. Таким образом, осложнение кодирования шага № 3 распространяется и на другие приложения.

Итак, в резюме, используя; поскольку разделитель прост, потому что (правильный) процесс при использовании точки с запятой состоит в том, как один wud обычно ожидает, что процесс будет: должен выполняться только один шаг кодирования.

Возможно, это было не слишком странно. Но вся путаница или трудность объясняется использованием символа разделения, который кодируется HTML. Таким образом, «&» является виновником. И точка с запятой снимает все это осложнение.

  • Как получить доступ к гостевому серверу из Интернета
  • Могу ли я запустить минималистский веб-сервер на моем маршрутизаторе без перезаписи прошивки с DD-WRT?
  • Bugzilla, нет логина для просмотра ошибок
  • Singleton через экземпляр JVM или приложения или экземпляр Tomcat
  • Как создать сервер HTTPS в Node.js?
  • Я хочу разместить мой сайт из дома, но мой публичный IP просто загружает мой экран администратора DSL-модема? Как исправить?
  • Включить js-файл в шаблон Go
  • Ошибка FTP FileZilla «Соединение отказано сервером»
  • Linux устанавливает сервер для статического ip и имени сервера
  • VM на хосте ESXi - Как сделать доступным извне?
  • Как правильно настроить мой веб-сервер в локальной сети?
  • Interesting Posts

    Как использовать свойство GlobalContext в имени приложения log4net?

    Загрузка многостраничного файла с использованием шаблона Spring Rest + Spring Web MVC

    Как влияет на идентификатор идентификатора поиска и «текущая схема»,

    Получать использование данных по каждому соединению

    Почему я не должен называть setVisible (true) перед добавлением компонентов?

    Ошибка в Parsing /page.xhtml: ошибка. Трассировка Объект «nbsp» ссылался, но не был объявлен

    Как изменить class CSS с помощью сценария Greasemonkey / Tampermonkey?

    Имеет ли обои, значки рабочего стола и автоматически спрятать панель задач впустую ресурсов процессора?

    Как подсчитать строки с помощью Hibernate?

    как избежать перекрестной политики домена в jQuery ajax для использования службы wcf?

    Какова реальная точность телефонных акселерометров при использовании для позиционирования?

    $ Logout bash: logout: не login shell: используйте exit '

    Доступ к изображениям из приложения «Картинки» в приложении для Android

    EntityManager закрыт

    XML По умолчанию пространства имен для имен неквалифицированных атрибутов?

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