Arka plan (soru daha aşağıda)
Bunu çözmeye çalışan RFC'leri ve SO sorularını ileri geri okudum, ancak hala jack'im yok.
Sanırım biz sadece "en iyi" cevaba oy veriyoruz ve bu kadar mı, yoksa?
Temelde buna indirgeniyor.
3.4. Sorgu Bileşeni
Sorgu bileşeni, kaynak tarafından yorumlanacak bir bilgi dizisidir.
query = *uric
Sorgu bileşeni içinde, ";", "/", "?", ":", "@", "&", "=", "+", "," Ve "$" karakterleri ayrılmıştır.
Beni şaşırtan ilk şey, * ürik'in böyle tanımlanması
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Ancak bu, aşağıdaki gibi paragraflarla biraz açıklığa kavuşturulmuştur
Yukarıdaki "ayrılmış" sözdizimi sınıfı, bir URI içinde izin verilen, ancak genel URI sözdiziminin belirli bir bileşeni içinde izin verilmeyebilen karakterleri ifade eder; Bölüm 3'te açıklanan bileşenlerin sınırlayıcıları olarak kullanılırlar.
"Ayrılmış" kümedeki karakterler tüm bağlamlarda ayrılmaz. Herhangi bir URI bileşeni içinde gerçekten ayrılmış olan karakter kümesi, bu bileşen tarafından tanımlanır. Genel olarak, karakter, çıkış karakterli US-ASCII kodlaması ile değiştirilirse, URI'nin anlambilimi değişirse, bir karakter ayrılır.
Bu son alıntı biraz geriye doğru geliyor, ancak ayrılmış karakter kümesinin bağlama bağlı olduğunu açıkça belirtiyor. Yine de 3.4, tüm ayrılmış karakterlerin bir sorgu bileşeni içinde ayrıldığını belirtir, ancak buradaki anlamsallığı değiştirecek tek şey, URI'ler bir sorgu dizesi kavramını tanımlamadığından, soru işaretinden (?) Kaçmaktır.
Bu noktada RFC'lerden tamamen vazgeçtim ama RFC 1738'i özellikle ilginç buldum.
Bir HTTP URL'si şu biçimi alır:
http://<host>:<port>/<path>?<searchpart>
<path> ve <searchpart> bileşenleri içinde, "/", ";", "?" saklıdır. "/" Karakteri, hiyerarşik bir yapı belirlemek için HTTP içinde kullanılabilir.
Bunu en azından RFC 1738'in RFC 2396'nın yerini aldığı HTTP URL'leri ile ilgili olarak yorumluyorum. URI sorgusu bir sorgu dizesi kavramına sahip olmadığından, rezerve edilmişin yorumlanması da benim alıştığım gibi sorgu dizelerini tanımlamama gerçekten izin vermiyor şimdiye kadar yapıyor.
Soru
Bunların hepsi, başka bir kaynağın talebiyle birlikte bir sayılar listesini iletmek istediğimde başladı. Pek düşünmedim ve virgülle ayrılmış değerler olarak geçtim. Virgülün kaçmasına rağmen beni şaşırttı. page.html?q=1,2,3
Kodlanan sorgu page.html?q=1%2C2%2C3
işe yarıyor, ancak çirkin ve beklemiyordu. İşte o zaman RFC'lerden geçmeye başladım.
İlk sorum basitçe, virgül kodlamak gerçekten gerekli mi?
Cevabım, RFC 2396'ya göre: evet, RFC 1738'e göre: hayır
Daha sonra listelerin istekler arasında aktarılmasıyla ilgili gönderiler buldum. CSV yaklaşımının kötü olduğu yerde. Bunun yerine bu ortaya çıktı (bunu daha önce görmedim).
page.html?q=1;q=2;q=3
İkinci sorum, bu geçerli bir URL mi?
Cevabım, RFC 2396'ya göre: hayır, RFC 1738'e göre: hayır (; saklıdır)
Sayı olduğu sürece csv'yi geçmekle ilgili herhangi bir sorunum yok, ancak evet, virgül başka bir şey için aniden gerekliyse değerleri ileri geri kodlamak ve çözmek zorunda kalma riskiyle karşılaşıyorsunuz. Neyse, noktalı virgül sorgu dizesini ASP.NET ile denedim ve sonuç beklediğim gibi değildi.
Default.aspx?a=1;a=2&b=1&a=3
Request.QueryString["a"] = "1;a=2,3"
Request.QueryString["b"] = "1"
Bunun bir csv yaklaşımından ne kadar büyük farklılaştığını göremiyorum, çünkü "a" diye sorduğumda içinde virgül olan bir dizge alıyorum. ASP.NET kesinlikle bir referans uygulaması değil ama beni henüz yarı yolda bırakmadı.
Ama en önemlisi - üçüncü sorum - bunun spesifikasyonu nerede? ve sen ne yapardın yoksa yapmaz mısın?