Фон (вопрос ниже)
Я гуглял это взад и вперед, читая RFC и ТАК вопросы, пытаясь взломать это, но у меня все еще нет джека.
Так что, я думаю, мы просто проголосуем за "лучший" ответ и все, или?
В основном это сводится к этому.
3,4. Компонент запроса
Компонент запроса - это строка информации, которая должна интерпретироваться ресурсом.
query = *uric
В компоненте запроса символы ";", "/", "?", ":", "@", "&", "=", "+", "," И "$" зарезервированы.
Первое, что меня поражает, это то, что * моча определяется так
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Это, однако, несколько разъясняется такими параграфами, как
Вышеуказанный класс «зарезервированного» синтаксиса относится к тем символам, которые разрешены в URI, но которые не могут быть разрешены в конкретном компоненте общего синтаксиса URI; они используются в качестве разделителей компонентов, описанных в разделе 3.
Символы в «зарезервированном» наборе не зарезервированы во всех контекстах. Набор символов, фактически зарезервированных в любом данном компоненте URI, определяется этим компонентом. Как правило, символ зарезервирован, если семантика URI изменяется, если символ заменяется его экранированной кодировкой US-ASCII.
Этот последний отрывок выглядит несколько задом наперед, но в нем четко говорится, что зарезервированный набор символов зависит от контекста. Тем не менее, 3.4 утверждает, что все зарезервированные символы зарезервированы в компоненте запроса, однако единственное, что могло бы изменить семантику здесь, это избежать знака вопроса (?), Поскольку URI не определяют концепцию строки запроса.
На данный момент я полностью отказался от RFC, но нашел RFC 1738 особенно интересным.
HTTP-URL принимает форму:
http://<host>:<port>/<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, конечно, не является эталонной реализацией, но пока не подводит меня.
Но самое главное - мой третий вопрос - где спецификация для этого? и что бы вы делали или в этом отношении не делали?