Atnaujinta: Atviras kodas daro stebuklus, su Giedriaus pagalba turime atnaujintą klasės variantą!

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.

Patiko (0)

Rodyk draugams