UrlBuilder – paprasta klasė skirta URL formavimui

Parašė Sergejus | 2012-02-08 23:15

Darbas su HTTP API dažnai iš programuotojų reikalauja URL formavimo. Keista, bet .NET Framework iki šiol neturi standartinės klasės šiai užduočiai spręsti. Egzistuoja artima pagal paskirtį UriBuilder klasė, bet ji nėra optimizuota darbui su URL. Bekuriant DotNetGroup 3.0 gimė labai paprasta URL formavimui skirta klasė UrlBuilder:

public class UrlBuilder
{
    private readonly Uri baseUrl;
    private readonly IList<string> relativeUrlParts;
    private readonly IList<string> queryStringParameters;

    public UrlBuilder(string baseUrl)
    {
        if (baseUrl == null)
        {
            throw new ArgumentNullException("baseUrl");
        }

        if (!Uri.IsWellFormedUriString(baseUrl, UriKind.Absolute))
        {
            throw new ArgumentException("Base URL format is not valid", "baseUrl");
        }

        this.baseUrl = new Uri(baseUrl);
        this.relativeUrlParts = new List<string>();
        this.queryStringParameters = new List<string>();
    }

    public void AddPart(object value)
    {
        this.relativeUrlParts.Add(value.ToString());
    }

    public void AddParameter(string name, object value)
    {
        this.queryStringParameters.Add(name + "=" + value);
    }

    public string Build()
    {
        var relativeUrl = new Uri(string.Join("/", this.relativeUrlParts), UriKind.Relative);
        var queryString = string.Join("&", this.queryStringParameters);

        var uriBuilder = new UriBuilder(new Uri(this.baseUrl, relativeUrl))
        {
            Query = queryString
        };

        return uriBuilder.Uri.AbsoluteUri;
    }
}

Kaip matote, rezultate gavosi visai patogi pagalbinė klasė URL formavimui:

[TestFixture]
public class UrlBuilderTests
{
    private const string BaseUrl = "http://api.dotnetgroup.dev";

    [Test]
    public void Given_No_Arguments_Base_Url_With_Trailing_Slash_Is_Returned()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/";

        var urlBuilder = new UrlBuilder(BaseUrl);

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }

    [Test]
    public void Given_Type_Argument_Correct_Url_Is_Generated()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/?type=rss";

        var urlBuilder = new UrlBuilder(BaseUrl);
        urlBuilder.AddParameter("type", "rss");

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }

    [Test]
    public void Given_Date_From_And_Limit_Correct_Url_Is_Generated()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/?from=2012-01-01%2010:00:00&limit=10";

        var urlBuilder = new UrlBuilder(BaseUrl);
        urlBuilder.AddParameter("from", "2012-01-01 10:00:00");
        urlBuilder.AddParameter("limit", 10);

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }

    [Test]
    public void Given_Get_And_Id_Parts_Correct_Url_Is_Generated()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/get/1";

        var urlBuilder = new UrlBuilder(BaseUrl);
        urlBuilder.AddPart("get");
        urlBuilder.AddPart(1);

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }
}

P.S. Šios klasės išeities kodas taipogi prieinamas DotNetGroup 3.0 GitHub repozitorijoje.

Rodyk draugams

ITishnikai #11 – IT darbo interviu

Parašė Sergejus | 2012-02-05 16:09

Naujame ITishnikai epizode mes kalbame apie IT darbo interviu ir CV sudarymą su personalo vadove Agne Klasavičiene. Laida prieinama mūsų Facebook puslapyje bei parsiuntimui. Labai laukiam jūsų atsiliepimų bei komentarų!

Minėtos nuorodos:

Rodyk draugams

Jubiliejinis ITishnikai #10 epizodas

Parašė Sergejus | 2012-01-23 20:27

Jubiliejinis, jau 10-as ITishnikai epizodas prieinamas mūsų Facebook puslapyje bei parsiuntimui. Šį kartą svečiuose – Tautvydas Dagys iš Microsoft Lietuva. Labai laukiam jūsų atsiliepimų bei komentarų!

Minėtos nuorodos:

Rodyk draugams

.gitignore skirtas .NET

Parašė Sergejus | 2012-01-17 00:30

Kadangi DotNetGroup 3.0 platformos kūrimui naudojama Git versijavimo sistema, nusprendžiau pasidalinti savo .gitignore failu, skirtu .NET projektams. Failą patalpinau GitHub Gist, tad siūlykite savo papildymus!

#ignore thumbnails created by windows
Thumbs.db
#ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.lib
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
[Tt]est[Rr]esult*
*.dotCover
*.ReSharper
packages

Rodyk draugams

Asinchroninis Web komunikavimas naudojant Web soketus

Parašė Sergejus | 2012-01-07 13:46

Įvadas į Web soketus

Paskutiniu metu „ant bangos“ asinchroninis komunikavimas Web‘e. Tam egzistuoja skirtingi būdai ir vienas iš jų įeina į HTML5 standartų šeimą – WebSocket API. WebSocket – tai abipusis komunikavimo kanalas grindžiamas TCP soketais. Ryšio užmezgimui naudojamos Web naršyklės ir Web serveriai, todėl komunikavimas dažniausiai vyksta tuo pačiu 80 TCP portu.

WebSocket technologija jau kuriama kurį laiką ir egzistuoja skirtingos jos versijos:

  • Hixie-Draft-76/Hybi-00 (palaiko Safari 5, Chrome < 14, Firefox 4)
  • Hybi-07 (palaiko Firefox 6)
  • Hybi-10 (palaiko Chrome 14-16, Firefox 7)
  • Hybi-13 (palaiko Chrome 17+)

Jau yra paskelbta, kad Internet Explorer 10 irgi palaikys šią technologiją.

WebSocket technologijoja pasižymi API paprastumu, teegzistuoja 4 pagrindiniai metodai:

  • OnOpen - kai ryšis atidaromas
  • OnClose – kai ryšis uždaromas
  • OnMessage – kai gaunamas pranešimas iš kliento
  • Send – pranešimo išsiuntimas klientui

Gera žinia .NET programuotojams, Build konferencijos metu buvo anonsuota, kad Web soketų palaikymas bus įgyvendintas Internet Information Services 8 bei .NET Framework 4.5. Bet jeigu norite pradėti eksperimentuoti su WebSocket technologija jau dabar, siūlau išbandyti atvirojo kodo Web soketų serverį Fleck (prieinamas ir iš NuGet). Fleck parašytas su C# ir palaiko visas pagrindines WebSoket versijas bei turi labai paprastą programavimo API.

WebSocket serverio sukūrimas su Fleck

Žemiau pateiktas pilnai veikiančio WebSocket serverio pavyzdys:

class Server
{
    static void Main()
    {
        var allSockets = new List<IWebSocketConnection>();
        var server = new WebSocketServer("ws://localhost:8181");
        server.Start(socket =>
            {
                socket.OnOpen = () =>
                    {
                        Console.WriteLine("Open!");
                        allSockets.Add(socket);
                    };
                socket.OnClose = () =>
                    {
                        Console.WriteLine("Close!");
                        allSockets.Remove(socket);
                    };
                socket.OnMessage = message =>
                    {
                        Console.WriteLine(message);
                        allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                    };
            });

        var input = Console.ReadLine();
        while (input != "exit")
        {
            foreach (var socket in allSockets.ToList())
            {
                socket.Send(input);
            }
            input = Console.ReadLine();
        }

    }
}

WebSocket kliento sukūrimas su WebSocket API

Komunikavimas su WebSocket serveriu įmanomas arba iš kito serverio, arba tiesiai iš naršyklės JavaScript ir WebSocket API pagalba. Žemiau pateiktas pilnai veikiančio WebSocket kliento pavyzdys:

<!DOCTYPE>
<html>
<head>
    <title>websocket client</title>
    <script type="text/javascript">
        var start = function () {
            var inc = document.getElementById('incomming');
            var wsImpl = window.WebSocket || window.MozWebSocket;
            var form = document.getElementById('sendForm');
            var input = document.getElementById('sendText');

            inc.innerHTML += "connecting to server ..<br/>";

            // create a new web socket and connect
            window.ws = new wsImpl('ws://localhost:8181', 'my-protocol');

            // when data is coming from the server, this method is called
            ws.onmessage = function (evt) {
                inc.innerHTML += evt.data + '<br/>';
            };

            // when the connection is established, this method is called
            ws.onopen = function () {
                inc.innerHTML += '.. connection open<br/>';
            };

            // when the connection is closed, this method is called
            ws.onclose = function () {
                inc.innerHTML += '.. connection closed<br/>';
            }

			form.addEventListener('submit', function(e){
				e.preventDefault();
				var val = input.value;
				ws.send(val);
				input.value = "";
			});

        }
        window.onload = start;
    </script>
</head>
<body>
	<form id="sendForm">
		<input id="sendText" placeholder="Text to send" />
	</form>
    <pre id="incomming"></pre>
</body>
</html>

Apibendrinimas

Sudėtingėjant Web aplikacijoms vis dažniau atsiranda asinchroninio komunikavimo poreikis tarp klientų ir serverio. Nepaisant fakto, kad Web soketų palaikymas dar nėra masinis, viskas einama link to. Jau dabar egzistuoja pagalbiniai Flash ir Silverlight moduliai, kurie leidžia emuliuoti WebSocket panaudojimą senesnėse naršyklėse. WebSocket – tai daug žadanti ir didelį bendruomenės palaikymą turinti technologija, kuria labai rekomenduoju pradėti domėtis jau šiandien.

Rodyk draugams

Paskutiniai šiais metais ITishnikai #9

Parašė Sergejus | 2011-12-31 19:04

2011 metų renginių ir išleistų produktų apžvalga paskutinėje šių metų ITishnikų laidoje! Naujas epizodas Facebook puslapyje bei parsiuntimui. Labai laukiam jūsų atsiliepimų bei komentarų!

Minėtos nuorodos:

Rodyk draugams

5 mano populiariausi straipsniai 2011-ais metais

Parašė Sergejus | 2011-12-28 21:38

Refleksijos pagalbiniai metodai – jau kelis metus iš eilės stabiliai populiarus straipsnis

Modulių testų rekomendacijos – 13 modulių testų rašymo taisyklių – ypatingai daug dėmesio ir komentarų sulaukęs straipsnis apie modulių testavimą

Quiz – labai didelę sėkmę sulaukęs mano galvosūkis

Pseudo GUID generavimas iš JavaScript – netrivialus būdas generuoti pseudo GUID iš JavaScript

Web aplikacijų veikimo statistikos rinkimas ir analizė – išsamus straipsnis apie programinę logų analizę LogParser pagalba

Rodyk draugams

Savaitės video - When strange things happen in .Net programs

Parašė Sergejus | 2011-12-23 00:20

Šį kartą jūsų dėmesiui siūlau labai įdomų Romualdo Stonkaus pristatymą When strange things happen in .Net programs.

Rodyk draugams

ITishnikai #8 jau online!

Parašė Sergejus | 2011-12-17 23:44

Naujas epizodas jau prieinamas mūsų Facebook puslapyje bei parsiuntimui. Labai laukiam jūsų atsiliepimų bei komentarų!

Minėtos nuorodos:

Rodyk draugams

Savaitės video - Optimizing ASP.NET Application performance: tough but necessary

Parašė Sergejus | 2011-12-12 20:21

Šį kartą jūsų dėmesiui siūlau vieną praktiškiausių savo pristatymų iš TechDay 2011 - Optimizing ASP.NET Application performance: tough but necessary.


Rodyk draugams