Предыстория (вопрос ниже)
Я гуглил это взад и вперед, читая RFC и вопросы SO, пытаясь взломать это, но у меня все еще нет разъема.
Думаю, мы просто голосуем за «лучший» ответ и все, или?
В основном все сводится к этому.
3.4. Компонент запроса
Компонент запроса - это строка информации, которую должен интерпретировать ресурс.
query = *uric
Внутри компонента запроса символы «;», «/», «?», «:», «@», «&», «=», «+», «,» И «$» зарезервированы.
Первое, что меня смущает, это то, что * uric определяется так
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Однако это несколько поясняется такими параграфами, как
Вышеупомянутый «зарезервированный» синтаксический класс относится к тем символам, которые разрешены в URI, но не могут быть разрешены в конкретном компоненте универсального синтаксиса URI; они используются как разделители компонентов, описанных в разделе 3.
Символы в «зарезервированном» наборе зарезервированы не во всех контекстах. Набор символов, фактически зарезервированных в любом данном компоненте URI, определяется этим компонентом. Как правило, символ зарезервирован, если семантика URI изменяется, если символ заменяется его экранированной кодировкой US-ASCII.
Этот последний отрывок кажется несколько отсталым, но он ясно заявляет, что зарезервированный набор символов зависит от контекста. Тем не менее, в 3.4 говорится, что все зарезервированные символы зарезервированы в компоненте запроса, однако единственное, что может изменить семантику здесь, - это экранирование вопросительного знака (?), Поскольку URI не определяют концепцию строки запроса.
На этом этапе я полностью отказался от RFC, но нашел RFC 1738 особенно интересным.
URL-адрес HTTP принимает форму:
http://<host>:<port>/<path>?<searchpart>
Внутри компонентов <path> и <searchpart> "/", ";", "?" зарезервированы. Символ «/» может использоваться в HTTP для обозначения иерархической структуры.
Я интерпретирую это, по крайней мере, в отношении URL-адресов HTTP, которые RFC 1738 заменяет RFC 2396. Поскольку запрос URI не имеет понятия о строке запроса, также интерпретация зарезервированного не позволяет мне определять строки запроса, как я привык делаю к настоящему времени.
Вопрос
Все началось с того, что я хотел передать список чисел вместе с запросом другого ресурса. Я не особо задумывался об этом и просто передал его как значения, разделенные запятыми. К моему удивлению, запятая была убрана. page.html?q=1,2,3
Закодированный запрос превратился в page.html?q=1%2C2%2C3
него работает, но он уродливый и не ожидал этого. Именно тогда я начал просматривать RFC.
Мой первый вопрос: действительно ли необходимо кодировать запятые?
Мой ответ согласно RFC 2396: да, согласно RFC 1738: нет
Позже я нашел похожие сообщения о передаче списков между запросами. Где подход csv был плохим. Это появилось вместо этого (не видел этого раньше).
page.html?q=1;q=2;q=3
Мой второй вопрос, это действительный URL?
Мой ответ согласно RFC 2396: нет, согласно RFC 1738: нет (; зарезервировано)
У меня нет проблем с передачей csv, если это числа, но да, вы рискуете кодировать и декодировать значения взад и вперед, если запятая вдруг понадобится для чего-то другого. В любом случае я попробовал использовать строку запроса с запятой в ASP.NET, и результат оказался не таким, как я ожидал.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Я не понимаю, насколько это сильно отличается от подхода csv, поскольку, когда я прошу «a», я получаю строку с запятыми. ASP.NET, конечно, не эталонная реализация, но меня она еще не подвела.
Но самое главное - третий вопрос - а где для этого спецификация? и что бы вы сделали или не стали бы делать?