diff --git a/src/Website.Tests/Data/ApiClientTests.cs b/src/Website.Tests/Data/ApiClientTests.cs index 58108ed..df755be 100644 --- a/src/Website.Tests/Data/ApiClientTests.cs +++ b/src/Website.Tests/Data/ApiClientTests.cs @@ -31,13 +31,13 @@ namespace Website.Tests.Data { .Build(); var cache = Substitute.For(); - cache.TryGetValue("TestApiClient:Get", out _).Returns(false); + cache.TryGetValue("TestApiClient:Get/test", out _).Returns(false); var expected = new TestObject {TestProperty = 1}; var client = new TestApiClient(httpClient, cache); (await client.Get("test")).Should().BeEquivalentTo(expected); - cache.Received(1).CreateEntry("TestApiClient:Get"); + cache.Received(1).CreateEntry("TestApiClient:Get/test"); } [Fact] @@ -51,13 +51,13 @@ namespace Website.Tests.Data { .Build(); var cache = Substitute.For(); - cache.TryGetValue("TestApiClient:Get?query1=1&query2=2", out _).Returns(false); + cache.TryGetValue("TestApiClient:Get/test?query1=1&query2=2", out _).Returns(false); var expected = new TestObject {TestProperty = 1}; var client = new TestApiClient(httpClient, cache); (await client.Get("test", new {query1 = 1, query2 = 2})).Should().BeEquivalentTo(expected); - cache.Received(1).CreateEntry("TestApiClient:Get?query1=1&query2=2"); + cache.Received(1).CreateEntry("TestApiClient:Get/test?query1=1&query2=2"); } [Fact] diff --git a/src/Website/Data/ApiClient.cs b/src/Website/Data/ApiClient.cs index 5b9eb2f..0759077 100644 --- a/src/Website/Data/ApiClient.cs +++ b/src/Website/Data/ApiClient.cs @@ -27,13 +27,12 @@ namespace Website.Data { return props.ToDictionary(info => info.Name, info => info.GetValue(query, null).ToString()); } - private async Task DoCachedCall(HttpMethod method, string callerName, IDictionary query, Func> call) { + private async Task DoCachedCall(HttpMethod method, string callerName, string url, Func> call) { if (method == HttpMethod.Post) return await call(); var baseKey = GetType().Name + ":" + callerName; - var queryString = query != null ? "?" + string.Join('&', query.Select(pair => pair.Key + "=" + pair.Value)) : string.Empty; - var key = baseKey + queryString; + var key = baseKey + "/" + url; return await _cache.GetOrCreate(key, async entry => { entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(_cacheDurations[baseKey]); @@ -42,14 +41,10 @@ namespace Website.Data { } private async Task Send(HttpMethod method, string url, object query, string callerName, HttpContent content = null) { - IDictionary queryParameters = null; + if (query != null) + url = QueryHelpers.AddQueryString(url, ParseQueryParameters(query)); - if (query != null) { - queryParameters = ParseQueryParameters(query); - url = QueryHelpers.AddQueryString(url, queryParameters); - } - - return await DoCachedCall(method, callerName, queryParameters, async () => { + return await DoCachedCall(method, callerName, url, async () => { using var httpRequest = new HttpRequestMessage(method, url) { Content = content }; var response = await _client.SendAsync(httpRequest);