From 305d917d1c1810659a1311e483b2861fa0d201f1 Mon Sep 17 00:00:00 2001 From: Alexander Rose Date: Sat, 21 Mar 2020 00:01:44 +0100 Subject: [PATCH 1/5] remove default serializer --- README.md | 2 +- examples/GraphQL.Client.Example/Program.cs | 3 ++- src/GraphQL.Client/GraphQL.Client.csproj | 1 - src/GraphQL.Client/GraphQLHttpClient.cs | 22 ++++++++++--------- .../GraphQLHttpClientOptions.cs | 6 ----- src/GraphQL.Client/HttpClientExtensions.cs | 20 ----------------- .../Websocket/GraphQLHttpWebSocket.cs | 8 +++---- .../WebApplicationFactoryExtensions.cs | 19 ---------------- .../GraphQL.Integration.Tests.csproj | 4 ++++ .../Helpers/WebHostHelpers.cs | 6 ++--- 10 files changed, 26 insertions(+), 65 deletions(-) delete mode 100644 src/GraphQL.Client/HttpClientExtensions.cs delete mode 100644 tests/GraphQL.Integration.Tests/Extensions/WebApplicationFactoryExtensions.cs diff --git a/README.md b/README.md index 02f6dee7..60fd2bd1 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Be careful when using `byte[]` in your variables object, as most JSON serializer ### Execute Query/Mutation: ```csharp -var graphQLClient = new GraphQLHttpClient("https://swapi.apis.guru/"); +var graphQLClient = new GraphQLHttpClient("https://swapi.apis.guru/", new NewtonsoftJsonSerializer()); public class PersonAndFilmsResponse { public PersonContent Person { get; set; } diff --git a/examples/GraphQL.Client.Example/Program.cs b/examples/GraphQL.Client.Example/Program.cs index 5dd2b1d6..2ef597ec 100644 --- a/examples/GraphQL.Client.Example/Program.cs +++ b/examples/GraphQL.Client.Example/Program.cs @@ -3,6 +3,7 @@ using System.Text.Json; using System.Threading.Tasks; using GraphQL.Client.Http; +using GraphQL.Client.Serializer.Newtonsoft; namespace GraphQL.Client.Example { @@ -13,7 +14,7 @@ public class Program public static async Task Main(string[] args) { _ = args; - using var graphQLClient = new GraphQLHttpClient("https://swapi.apis.guru/"); + using var graphQLClient = new GraphQLHttpClient("https://swapi.apis.guru/", new NewtonsoftJsonSerializer()); var personAndFilmsRequest = new GraphQLRequest { diff --git a/src/GraphQL.Client/GraphQL.Client.csproj b/src/GraphQL.Client/GraphQL.Client.csproj index 3b11e942..d1d723f9 100644 --- a/src/GraphQL.Client/GraphQL.Client.csproj +++ b/src/GraphQL.Client/GraphQL.Client.csproj @@ -36,7 +36,6 @@ - diff --git a/src/GraphQL.Client/GraphQLHttpClient.cs b/src/GraphQL.Client/GraphQLHttpClient.cs index a6a7a763..74ec0b46 100644 --- a/src/GraphQL.Client/GraphQLHttpClient.cs +++ b/src/GraphQL.Client/GraphQLHttpClient.cs @@ -19,7 +19,11 @@ public class GraphQLHttpClient : IGraphQLClient private readonly GraphQLHttpWebSocket _graphQlHttpWebSocket; private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource(); private readonly ConcurrentDictionary, object> _subscriptionStreams = new ConcurrentDictionary, object>(); - private IGraphQLWebsocketJsonSerializer JsonSerializer => Options.JsonSerializer; + + /// + /// the json serializer + /// + public IGraphQLWebsocketJsonSerializer JsonSerializer { get; } /// /// the instance of which is used internally @@ -44,20 +48,18 @@ public class GraphQLHttpClient : IGraphQLClient #region Constructors - public GraphQLHttpClient(string endPoint) : this(new Uri(endPoint)) { } - - public GraphQLHttpClient(Uri endPoint) : this(o => o.EndPoint = endPoint) { } - - public GraphQLHttpClient(Action configure) : this(configure.New()) { } + public GraphQLHttpClient(string endPoint, IGraphQLWebsocketJsonSerializer serializer) : this(new Uri(endPoint), serializer) { } - public GraphQLHttpClient(GraphQLHttpClientOptions options) : this(options, new HttpClient(options.HttpMessageHandler)) { } + public GraphQLHttpClient(Uri endPoint, IGraphQLWebsocketJsonSerializer serializer) : this(o => o.EndPoint = endPoint, serializer) { } - public GraphQLHttpClient(GraphQLHttpClientOptions options, HttpClient httpClient) : this(options, httpClient, new NewtonsoftJsonSerializer()) { } + public GraphQLHttpClient(Action configure, IGraphQLWebsocketJsonSerializer serializer) : this(configure.New(), serializer) { } - public GraphQLHttpClient(GraphQLHttpClientOptions options, HttpClient httpClient, IGraphQLWebsocketJsonSerializer serializer) + public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJsonSerializer serializer) : this(options, serializer, new HttpClient(options.HttpMessageHandler)) { } + + public GraphQLHttpClient(GraphQLHttpClientOptions options, IGraphQLWebsocketJsonSerializer serializer, HttpClient httpClient) { Options = options ?? throw new ArgumentNullException(nameof(options)); - Options.JsonSerializer = serializer ?? throw new ArgumentNullException(nameof(serializer)); + JsonSerializer = serializer ?? throw new ArgumentNullException(nameof(serializer)); HttpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); _graphQlHttpWebSocket = new GraphQLHttpWebSocket(GetWebSocketUri(), this); } diff --git a/src/GraphQL.Client/GraphQLHttpClientOptions.cs b/src/GraphQL.Client/GraphQLHttpClientOptions.cs index 915ad967..6b93cb7b 100644 --- a/src/GraphQL.Client/GraphQLHttpClientOptions.cs +++ b/src/GraphQL.Client/GraphQLHttpClientOptions.cs @@ -2,7 +2,6 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; -using GraphQL.Client.Abstractions.Websocket; namespace GraphQL.Client.Http { @@ -18,11 +17,6 @@ public class GraphQLHttpClientOptions /// public Uri EndPoint { get; set; } - /// - /// the json serializer - /// - public IGraphQLWebsocketJsonSerializer JsonSerializer { get; set; } - /// /// The that is going to be used /// diff --git a/src/GraphQL.Client/HttpClientExtensions.cs b/src/GraphQL.Client/HttpClientExtensions.cs deleted file mode 100644 index 06315817..00000000 --- a/src/GraphQL.Client/HttpClientExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Net.Http; - -namespace GraphQL.Client.Http -{ - - public static class HttpClientExtensions - { - - public static GraphQLHttpClient AsGraphQLClient(this HttpClient httpClient, string endPoint) => - httpClient.AsGraphQLClient(new Uri(endPoint)); - - public static GraphQLHttpClient AsGraphQLClient(this HttpClient httpClient, Uri endPoint) => - new GraphQLHttpClient(new GraphQLHttpClientOptions { EndPoint = endPoint }, httpClient); - - public static GraphQLHttpClient AsGraphQLClient(this HttpClient httpClient, GraphQLHttpClientOptions graphQLHttpClientOptions) => - new GraphQLHttpClient(graphQLHttpClientOptions, httpClient); - } - -} diff --git a/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs b/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs index 50351075..f0156030 100644 --- a/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs +++ b/src/GraphQL.Client/Websocket/GraphQLHttpWebSocket.cs @@ -139,7 +139,7 @@ public IObservable> CreateSubscriptionStream( + _client.JsonSerializer.DeserializeToWebsocketResponse( response.MessageBytes); o.OnNext(typedResponse.Payload); @@ -296,7 +296,7 @@ public Task> SendRequest(GraphQLRequest re { Debug.WriteLine($"received response for request {websocketRequest.Id}"); var typedResponse = - _client.Options.JsonSerializer.DeserializeToWebsocketResponse( + _client.JsonSerializer.DeserializeToWebsocketResponse( response.MessageBytes); return typedResponse.Payload; }); @@ -353,7 +353,7 @@ private async Task SendWebSocketRequestAsync(GraphQLWebSocketRequest request) } await InitializeWebSocket(); - var requestBytes = Options.JsonSerializer.SerializeToBytes(request); + var requestBytes = _client.JsonSerializer.SerializeToBytes(request); await _clientWebSocket.SendAsync( new ArraySegment(requestBytes), WebSocketMessageType.Text, @@ -554,7 +554,7 @@ private async Task ReceiveWebsocketMessagesAsync() if (webSocketReceiveResult.MessageType == WebSocketMessageType.Text) { - var response = await Options.JsonSerializer.DeserializeToWebsocketResponseWrapperAsync(ms); + var response = await _client.JsonSerializer.DeserializeToWebsocketResponseWrapperAsync(ms); response.MessageBytes = ms.ToArray(); Debug.WriteLine($"{response.MessageBytes.Length} bytes received for id {response.Id} on websocket {_clientWebSocket.GetHashCode()} (thread {Thread.CurrentThread.ManagedThreadId})..."); return response; diff --git a/tests/GraphQL.Integration.Tests/Extensions/WebApplicationFactoryExtensions.cs b/tests/GraphQL.Integration.Tests/Extensions/WebApplicationFactoryExtensions.cs deleted file mode 100644 index 546b6a8e..00000000 --- a/tests/GraphQL.Integration.Tests/Extensions/WebApplicationFactoryExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using GraphQL.Client.Http; -using Microsoft.AspNetCore.Mvc.Testing; - -namespace GraphQL.Integration.Tests.Extensions -{ - public static class WebApplicationFactoryExtensions - { - public static GraphQLHttpClient CreateGraphQlHttpClient( - this WebApplicationFactory factory, string graphQlSchemaUrl, string urlScheme = "http://") where TEntryPoint : class - { - var httpClient = factory.CreateClient(); - var uriBuilder = new UriBuilder(httpClient.BaseAddress); - uriBuilder.Path = graphQlSchemaUrl; - uriBuilder.Scheme = urlScheme; - return httpClient.AsGraphQLClient(uriBuilder.Uri); - } - } -} diff --git a/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj b/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj index e2e2d726..23c1c85d 100644 --- a/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj +++ b/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj @@ -28,4 +28,8 @@ + + + + diff --git a/tests/GraphQL.Integration.Tests/Helpers/WebHostHelpers.cs b/tests/GraphQL.Integration.Tests/Helpers/WebHostHelpers.cs index 38704066..81ff2248 100644 --- a/tests/GraphQL.Integration.Tests/Helpers/WebHostHelpers.cs +++ b/tests/GraphQL.Integration.Tests/Helpers/WebHostHelpers.cs @@ -41,9 +41,9 @@ public static GraphQLHttpClient GetGraphQLClient(int port, string endpoint, bool => new GraphQLHttpClient(new GraphQLHttpClientOptions { EndPoint = new Uri($"http://localhost:{port}{endpoint}"), - UseWebSocketForQueriesAndMutations = requestsViaWebsocket, - JsonSerializer = serializer ?? new NewtonsoftJsonSerializer() - }); + UseWebSocketForQueriesAndMutations = requestsViaWebsocket + }, + serializer ?? new NewtonsoftJsonSerializer()); } public class TestServerSetup : IDisposable From b5817f3e91108d7608706eaac3e579651684eddb Mon Sep 17 00:00:00 2001 From: Alexander Rose Date: Sat, 21 Mar 2020 00:09:14 +0100 Subject: [PATCH 2/5] fix references --- examples/GraphQL.Client.Example/GraphQL.Client.Example.csproj | 1 + src/GraphQL.Client/GraphQLHttpClient.cs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/GraphQL.Client.Example/GraphQL.Client.Example.csproj b/examples/GraphQL.Client.Example/GraphQL.Client.Example.csproj index d9680f86..54506df0 100644 --- a/examples/GraphQL.Client.Example/GraphQL.Client.Example.csproj +++ b/examples/GraphQL.Client.Example/GraphQL.Client.Example.csproj @@ -7,6 +7,7 @@ + diff --git a/src/GraphQL.Client/GraphQLHttpClient.cs b/src/GraphQL.Client/GraphQLHttpClient.cs index 74ec0b46..36f24198 100644 --- a/src/GraphQL.Client/GraphQLHttpClient.cs +++ b/src/GraphQL.Client/GraphQLHttpClient.cs @@ -8,7 +8,6 @@ using GraphQL.Client.Abstractions; using GraphQL.Client.Abstractions.Websocket; using GraphQL.Client.Http.Websocket; -using GraphQL.Client.Serializer.Newtonsoft; namespace GraphQL.Client.Http { From 435fe58635c19de2567a0c015556fb0c84be5b1f Mon Sep 17 00:00:00 2001 From: Alexander Rose Date: Sat, 21 Mar 2020 00:13:59 +0100 Subject: [PATCH 3/5] skip test with dynamic response type --- tests/GraphQL.Integration.Tests/QueryAndMutationTests/Base.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/GraphQL.Integration.Tests/QueryAndMutationTests/Base.cs b/tests/GraphQL.Integration.Tests/QueryAndMutationTests/Base.cs index 72a28d60..550eb6a0 100644 --- a/tests/GraphQL.Integration.Tests/QueryAndMutationTests/Base.cs +++ b/tests/GraphQL.Integration.Tests/QueryAndMutationTests/Base.cs @@ -73,7 +73,7 @@ public async void QueryAsHttpResponseTheory(int id, string name) httpResponse.ResponseHeaders.Date.Should().BeCloseTo(DateTimeOffset.Now, TimeSpan.FromMinutes(1)); } - [Theory] + [Theory(Skip = "System.Json.Net deserializes 'dynamic' as JsonElement.")] [ClassData(typeof(StarWarsHumans))] public async void QueryWithDynamicReturnTypeTheory(int id, string name) { From 3d3211d4fd8ef5e507480c0043db569caf106a90 Mon Sep 17 00:00:00 2001 From: Alexander Rose Date: Sat, 21 Mar 2020 14:55:28 +0100 Subject: [PATCH 4/5] Update tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj Co-Authored-By: Ivan Maximov --- .../GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj b/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj index 23c1c85d..777bd6ed 100644 --- a/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj +++ b/tests/GraphQL.Integration.Tests/GraphQL.Integration.Tests.csproj @@ -28,8 +28,5 @@ - - - From 19382ad153961493fa8360da762554f285a28173 Mon Sep 17 00:00:00 2001 From: Alexander Rose Date: Sat, 21 Mar 2020 15:17:53 +0100 Subject: [PATCH 5/5] remove unused method in map converter --- src/GraphQL.Client.Serializer.Newtonsoft/MapConverter.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/GraphQL.Client.Serializer.Newtonsoft/MapConverter.cs b/src/GraphQL.Client.Serializer.Newtonsoft/MapConverter.cs index 5d4510d6..f15787e8 100644 --- a/src/GraphQL.Client.Serializer.Newtonsoft/MapConverter.cs +++ b/src/GraphQL.Client.Serializer.Newtonsoft/MapConverter.cs @@ -61,8 +61,6 @@ private IEnumerable ReadArray(JToken element) } } - private object ReadNumber(JToken token) => ((JValue) token).Value; - private bool IsUnsupportedJTokenType(JTokenType type) => type == JTokenType.Constructor || type == JTokenType.Property || type == JTokenType.Comment; } }