Latar belakang (pertanyaan di bawah)
Saya telah Googling ini bolak-balik membaca pertanyaan RFC dan SO mencoba memecahkan ini, tetapi saya masih belum mendapatkan jack.
Jadi saya kira kita hanya memilih jawaban "terbaik" dan hanya itu, atau?
Pada dasarnya intinya adalah ini.
3.4. Komponen Kueri
Komponen kueri adalah rangkaian informasi yang akan ditafsirkan oleh sumber daya.
query = *uric
Dalam komponen kueri, karakter ";", "/", "?", ":", "@", "&", "=", "+", ",", Dan "$" dicadangkan.
Hal pertama yang mengejutkan saya adalah bahwa * uric didefinisikan seperti ini
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Namun ini agak diklarifikasi oleh paragraf seperti
Kelas sintaks "yang dicadangkan" di atas merujuk ke karakter yang diizinkan dalam URI, tetapi mungkin tidak diizinkan dalam komponen tertentu dari sintaks URI generik; mereka digunakan sebagai pembatas dari komponen yang dijelaskan di Bagian 3.
Karakter dalam kumpulan "cadangan" tidak dicadangkan di semua konteks. Kumpulan karakter yang benar-benar dicadangkan dalam komponen URI tertentu ditentukan oleh komponen itu. Secara umum, karakter dicadangkan jika semantik URI berubah jika karakter diganti dengan enkode US-ASCII yang lolos.
Kutipan terakhir ini terasa agak mundur, tetapi dengan jelas menyatakan bahwa kumpulan karakter yang dicadangkan bergantung pada konteks. Namun 3.4 menyatakan bahwa semua karakter yang dicadangkan dicadangkan dalam komponen kueri, namun, satu-satunya hal yang akan mengubah semantik di sini adalah keluar dari tanda tanya (?) Karena URI tidak mendefinisikan konsep string kueri.
Pada titik ini saya sudah menyerah pada RFC sepenuhnya tetapi menemukan RFC 1738 sangat menarik.
URL HTTP mengambil bentuk:
http://<host>:<port>/<path>?<searchpart>
Dalam komponen <path> dan <searchpart>, "/", ";", "?" dicadangkan. Karakter "/" dapat digunakan dalam HTTP untuk menunjukkan struktur hierarki.
Saya menafsirkan ini setidaknya berkenaan dengan URL HTTP yang RFC 1738 menggantikan RFC 2396. Karena kueri URI tidak memiliki gagasan tentang string kueri, juga interpretasi yang dipesan tidak benar-benar memungkinkan saya untuk mendefinisikan string kueri seperti yang biasa saya lakukan lakukan sekarang.
Pertanyaan
Ini semua dimulai ketika saya ingin meneruskan daftar nomor bersama dengan permintaan sumber daya lain. Saya tidak terlalu memikirkannya, dan hanya meneruskannya sebagai nilai yang dipisahkan koma. Yang mengejutkan saya meskipun koma itu lolos. Kueri yang page.html?q=1,2,3
dikodekan berubah menjadi page.html?q=1%2C2%2C3
berfungsi, tetapi itu jelek dan tidak menduganya. Saat itulah saya mulai melalui RFC.
Pertanyaan pertama saya adalah, apakah mengkodekan koma benar-benar diperlukan?
Jawaban saya, menurut RFC 2396: ya, menurut RFC 1738: tidak
Kemudian saya menemukan posting terkait tentang lewatnya daftar di antara permintaan. Dimana pendekatan csv dianggap buruk. Ini muncul sebagai gantinya, (belum pernah melihat ini sebelumnya).
page.html?q=1;q=2;q=3
Pertanyaan kedua saya, apakah ini URL yang valid?
Jawaban saya, menurut RFC 2396: tidak, menurut RFC 1738: tidak (; dicadangkan)
Saya tidak memiliki masalah dengan meneruskan csv selama itu angka, tetapi ya Anda mengalami risiko harus menyandikan dan mendekode nilai bolak-balik jika koma tiba-tiba diperlukan untuk sesuatu yang lain. Pokoknya saya mencoba hal string kueri titik koma dengan ASP.NET dan hasilnya tidak seperti yang saya harapkan.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Saya gagal untuk melihat bagaimana ini sangat berbeda dari pendekatan csv seperti ketika saya meminta "a" saya mendapatkan string dengan koma di dalamnya. ASP.NET jelas bukan implementasi referensi tetapi belum mengecewakan saya.
Tetapi yang paling penting - pertanyaan ketiga saya - di mana spesifikasi untuk ini? dan apa yang akan Anda lakukan atau yang tidak akan Anda lakukan?