Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dotnet-querystrings/BuildQueryString/BooksAPI/BooksAPI.csproj
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.2.3" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public async Task<string> GetWithQueryParamsUsingParseQueryStringMethod(string a

public async Task<string> GetWithQueryParamsUsingAddQueryStringMethod(string author, string language)
{
var query = new Dictionary<string, string>
var query = new Dictionary<string, string?>
{
{ "author", author },
{ "language", language }
Expand All @@ -83,7 +83,7 @@ public async Task<string> GetWithQueryParamsUsingQueryBuilderClass(string author

public async Task<string> GetWithQueryParamsUsingCreateMethod(string author, string language)
{
var query = new Dictionary<string, string>
var query = new Dictionary<string, string?>
{
{ "author", author },
{ "language", language }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.11" />
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

</Project>
46 changes: 19 additions & 27 deletions dotnet-querystrings/BuildQueryString/BuildQueryString/Program.cs
Original file line number Diff line number Diff line change
@@ -1,35 +1,27 @@
using Microsoft.Extensions.DependencyInjection;
using BuildQueryString;
using Microsoft.Extensions.DependencyInjection;

namespace BuildQueryString
{
public class Program
{
static async Task Main(string[] args)
{
var serviceProvider = new ServiceCollection()
.AddTransient<IHttpClientWrapper, HttpClientWrapper>()
.AddTransient<BooksApiService>()
.BuildServiceProvider();
var serviceProvider = new ServiceCollection()
.AddTransient<IHttpClientWrapper, HttpClientWrapper>()
.AddTransient<BooksApiService>()
.BuildServiceProvider();

var booksService = serviceProvider.GetRequiredService<BooksApiService>();
var booksService = serviceProvider.GetRequiredService<BooksApiService>();

Console.WriteLine("\n***************** Build the Query String Using StringConcatenation ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingStringConcatenation("George Orwell", "english"));
Console.WriteLine("\n***************** Build the Query String Using StringConcatenation ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingStringConcatenation("George Orwell", "english"));

Console.WriteLine("\n***************** Build the Query String Using UriBuilder Class ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingUriBuilder("Jane Austen", "english"));
Console.WriteLine("\n***************** Build the Query String Using UriBuilder Class ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingUriBuilder("Jane Austen", "english"));

Console.WriteLine("\n***************** Build the Query String Using ParseQueryString Method ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingParseQueryStringMethod("Agatha Christie", "english"));
Console.WriteLine("\n***************** Build the Query String Using ParseQueryString Method ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingParseQueryStringMethod("Agatha Christie", "english"));

Console.WriteLine("\n***************** Build the Query String Using AddQueryString Method ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingAddQueryStringMethod("Haruki Murakami", "japanese"));
Console.WriteLine("\n***************** Build the Query String Using AddQueryString Method ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingAddQueryStringMethod("Haruki Murakami", "japanese"));

Console.WriteLine("\n***************** Build the Query String Using QueryBuilder Class ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingQueryBuilderClass("Gabriel Garcia", "spanish"));
Console.WriteLine("\n***************** Build the Query String Using QueryBuilder Class ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingQueryBuilderClass("Gabriel Garcia", "spanish"));

Console.WriteLine("\n***************** Build the Query String Using QueryString Create Method ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingCreateMethod("Leo Tolstoy", "russian"));
}
}
}
Console.WriteLine("\n***************** Build the Query String Using QueryString Create Method ***************\n");
Console.WriteLine(await booksService.GetWithQueryParamsUsingCreateMethod("Leo Tolstoy", "russian"));
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,20 @@ public static string BuildUrlWithQueryStringUsingUriBuilder(string basePath, Dic
return fullApiUrl;
}

public static string BuildUrlWithQueryStringUsingUriBuilderSafely(
string basePath, Dictionary<string, string?> queryParams)
{
var uriBuilder = new UriBuilder(basePath)
{
Query = QueryString.Create(queryParams).Value
};

var fullApiUrl = uriBuilder.Uri.AbsoluteUri;
Console.WriteLine($"Full API Url: {fullApiUrl}");

return fullApiUrl;
}

public static string BuildUrlWithQueryStringUsingParseQueryStringMethod(
string basePath, Dictionary<string, string> queryParams)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,11 +10,11 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="Moq" Version="4.20.69" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="MSTest.TestAdapter" Version="4.3.3" />
<PackageReference Include="MSTest.TestFramework" Version="4.3.3" />
<PackageReference Include="coverlet.collector" Version="10.0.1" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using BuildQueryString;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BuildQueryStringTests
Expand Down Expand Up @@ -48,6 +49,28 @@ public void GivenBasePathAndQueryParams_WhenBuildUrlWithQueryStringUsingUriBuild
Assert.AreEqual(expectedApiUrl, result);
}

[TestMethod]
public void GivenValuesWithQueryDelimiters_WhenBuildUrlWithQueryStringUsingUriBuilderSafely_ThenValuesRoundTrip()
{
// Arrange
var dict = new Dictionary<string, string?>
{
{ "author", "Tom & Jerry" },
{ "tag", "C#" }
};
var expectedApiUrl = "https://localhost:7220/api/Books?author=Tom%20%26%20Jerry&tag=C%23";

// Act
var result = QueryStringHelper.BuildUrlWithQueryStringUsingUriBuilderSafely(basePath, dict);

//Assert
Assert.AreEqual(expectedApiUrl, result);

var parsed = QueryHelpers.ParseQuery(new Uri(result).Query);
Assert.AreEqual("Tom & Jerry", parsed["author"].ToString());
Assert.AreEqual("C#", parsed["tag"].ToString());
}

[TestMethod]
public void GivenBasePathAndQueryParams_WhenBuildUrlWithQueryStringUsingParseQueryStringMethod_ThenCorrectApiUrlIsBuilt()
{
Expand All @@ -74,7 +97,7 @@ public void GivenBasePathAndQueryParams_WhenBuildUrlWithQueryStringUsingAddQuery
// Arrange
var author = "Haruki Murakami";
var language = "japanese";
var dict = new Dictionary<string, string>
var dict = new Dictionary<string, string?>
{
{ "author", author },
{ "language", language }
Expand Down Expand Up @@ -114,7 +137,7 @@ public void GivenBasePathAndQueryParams_WhenBuildurlWithQueryStringUsingCreateMe
// Arrange
var author = "Leo Tolstoy";
var language = "russian";
var dict = new Dictionary<string, string>
var dict = new Dictionary<string, string?>
{
{ "author", author },
{ "language", language }
Expand Down
Loading