Kódujeme parametre do URL (sofistikovane)

Niekedy je potrebné zakódovať parametre do URL, ktoré budú odoslané na server (napr. cez HttpWebReques­t.GetResponse()). V .NETe môžeme použiť klasickú metódu z ASP HttpServerUti­lity.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 UrlParameterWri­ter 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.Visu­alStudio.FogBug­z.Tools{    pu­blic class UrlParameterEn­coder : UrlParameterWri­ter    {        ­public UrlParameterEn­coder()            : base ()        { }        public void Encode(TextWriter writer, string name, string value)        {            ­base.Encode(wri­ter, name, value);        }    ­}} 

URL parametre je dobré si uchovávať v NameValueCo­llection, 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/se­arch“);NameVa­lueCollection values = new NameValueCollec­tion(2);values­.Add(„search“, searchTerm);va­lues.Add(„sec­tion“, „all“);StringBu­ilder query = new StringBuilder();Tex­tWriter writer = new StringWriter(qu­ery);UrlParame­terEncoder encoder = new UrlParameterEn­coder();foreach (string key in values){    encoder.Encode(wri­ter, key, values[key]);}u­ri.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.ASCI­I.GetBytes(strin­g).