Фон (вопрос ниже)
Я искал это взад и вперед, читая 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>
Внутри < путь > и <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: no
Позже я нашел связанные сообщения о прохождении списков между запросами. Где подход csv был сбалансирован как плохой. Вместо этого появилось (не видели этого раньше).
page.html?q=1;q=2;q=3
Мой второй вопрос, является ли это допустимым URL?
Мой ответ, согласно RFC 2396: нет, согласно RFC 1738: no (; зарезервировано)
У меня нет проблем с передачей 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, конечно, не является эталонной реализацией, но пока не подвела меня.
Но самое главное - мой третий вопрос - где спецификация для этого? и что бы вы сделали или в этом случае не делали?