Передумови (питання далі)
Я гуглив це назад і вперед, читаючи RFC і ТАК, намагаючись зламати це, але в мене все ще немає джека.
Тож я гадаю, що ми просто голосуємо за "найкращу" відповідь, і це все, чи?
В основному це зводиться до цього.
3.4. Компонент запиту
Компонент запиту - це рядок інформації, яку слід інтерпретувати ресурсом.
query = *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 для позначення ієрархічної структури.
Я інтерпретую це принаймні щодо 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, безумовно, не є еталонною реалізацією, але вона мене ще не підвела.
Але найголовніше - моє третє питання - де специфікація для цього? і що б ви зробили або з цього питання не зробили?