Niekedy je potrebné zakódovať parametre do URL, ktoré budú odoslané na
server (napr. cez HttpWebRequest.GetResponse()). V .NETe
môžeme použiť klasickú metódu z ASP
HttpServerUtility.UrlEncode() na zakódovanie jednotlivých
parametrov. Existuje však oveľa lepší spôsob, ako kódovať parametre.
Vďaka objektovému modelu sa nám naskytne veľmi elegantné riešenie.
Triedu UrlParameterWriter si rozšírime tak, aby sme mali
prístup k jej chránenej (protected) metóde
Encode(TextWriter, string, object). Táto do výstupného
bufferu vloží zakódovaný názov parametru a jeho hodnotu, pričom sama
podľa potreby pridáva oddeľovacie znaky ako = a &.
Naša trieda teda bude dediť
namespace
izsaknet.VisualStudio.FogBugz.Tools{ public class
UrlParameterEncoder : UrlParameterWriter { public
UrlParameterEncoder() : base () { } public void
Encode(TextWriter writer, string name, string
value) { base.Encode(writer, name,
value); } }}
URL parametre je dobré si uchovávať
v NameValueCollection, ktorá uchováva páry
kľúč/hodnota (typu string). Na celé zloženie URL
použijeme objekt UriBuilder.
UriBuilder uri = new
UriBuilder(„http://www.izsak.net/search“);NameValueCollection values = new NameValueCollection(2);values.Add(„search“, searchTerm);values.Add(„section“, „all“);StringBuilder query = new StringBuilder();TextWriter writer = new StringWriter(query);UrlParameterEncoder encoder = new UrlParameterEncoder();foreach (string
key in values){
encoder.Encode(writer, key, values[key]);}uri.Query =
query.ToString();
Kód asi nepotrebuje veľa vysvetľovania, vytvoríme nový objekt so
základnou URL adresou na nejaký dokument. Potom si naplníme pole hodnotami.
Za zmienku stojí vytvorenie textového bufferu a writeru. Metóda Encode() bude
zapisovať parametre do TextWriteru a ten do bufferu textu. Spojené parametre
zo StringBuilder-u vložíme do UriBuilder cez jeho Query
vlastnosť.
Niektoré veci v .NETe si vyžadujú viacej úsilia, ako len inštancovanie
triedy a jej použitie. Treba trošku použiť hlavu a derivovať triedy
. Toto celé sa dá pekne
zaobaliť do triedy ktorá by reprezentovala webový formulár a uchovávala si
hodnoty pre GET a POST v dvoch kolekciách a používali by takúto
serializáciu parametrov. Pri POST ešte treba výsledný string skonvertovať
na pole bajtov (byte[]) napr. pomocou
Encoding.ASCII.GetBytes(string).