--- sidebar_position: 2 title: Graphql --- For our examples we will use a small example project based on an SQLite database. This example is available [here](/DemoGraphQL.zip). ## Creating a client application We will create a client application to consume GraphQL. Create a new Blazor WASM app. Edit the `appsettings.json` file, adding an address to the GraphQL app: ```csharp title="wwwroot/appsettings.json" { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "GraphQLURI": "https://localhost:44371/graphql", "AllowedHosts": "*" } ``` Install the `GraphQL.Client` package in its latest version. ![required library](/img/graphql/29-GraphQL.CLient-new-version.png) Or using the Package Manager console: `PM> Install-Package GraphQL.Client` Install the GraphQL serialization nuget `GraphQL.Client.Serializer.Newtonsoft`: ![required library](/img/graphql/30-GraphQL-Serializer-Newtonsoft.png) `PM> Install-Package GraphQL.Client.Serializer.Newtonsoft` After installation, we will save it in the `Program` class: ```csharp {8} title="Program.cs" public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add("#app"); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); builder.Services.AddScoped(s => new GraphQLHttpClient(builder.Configuration["GraphQLURI"], new NewtonsoftJsonSerializer())); await builder.Build().RunAsync(); } ``` The next step is to create the `OwnerConsumer` class, which will store all requests and mutations: ```csharp title="OwnerConsumer.cs" public class OwnerConsumer { private readonly IGraphQLClient _client; public OwnerConsumer(IGraphQLClient client) { _client = client; } } ``` Now let's register this class: ```csharp {9} title="Program.cs" public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add("#app"); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); builder.Services.AddScoped(s => new GraphQLHttpClient(builder.Configuration["GraphQLURI"], new NewtonsoftJsonSerializer())); builder.Services.AddScoped(); await builder.Build().RunAsync(); } ``` We have finished everything regarding the configuration. ## Creating model classes We will create the model classes so that we can use the data from our queries: ```csharp title="Models/TypeOfAccount.cs" public enum TypeOfAccount { Cash, Savings, Expense, Income } ``` ```csharp title="Models/Account.cs" public class Account { public Guid Id { get; set; } public TypeOfAccount Type { get; set; } public string Description { get; set; } } ``` ```csharp title="Models/Owner.cs" public class Owner { public Guid Id { get; set; } public string Name { get; set; } public string Address { get; set; } public ICollection Accounts { get; set; } } ``` Now we are going to create the `Input` class for the mutation actions. ```csharp title="Models/OwnerInput.cs" public class OwnerInput { public string Name { get; set; } public string Address { get; set; } } ``` We have now prepared everything and are ready to start creating queries and mutations. ## Creating queries and mutations to consume the GraphQL API Open the `OwnerConsumer` class and add the `GetAllOwners` method: ```csharp title="OwnerConsumer.cs" public async Task> GetAllOwners() { var query = new GraphQLRequest { Query = @" query ownersQuery{ owners { id name address accounts { id type description } } }" }; var response = await _client.SendQueryAsync(query); return response.Data.Owners; } ``` As you can see, we are creating a new `GraphQLRequest` object which contains a `Query` property for the query we want to send to the GraphQL API. This query is the same one you can use with the `UI.Playground` tool. To execute the query, call the `SenQueryAsync` method which accepts a response type (as a generic parameter) and the query. Finally, the code returns the list of owners from this response. We don't have the `ResponseOwnerCollectionType` class, so let's create a new `ResponseTypes` folder and inside it create the two new classes: ```csharp title="ResponseTypes/ResponseOwnerCollectionType.cs" public class ResponseOwnerCollectionType { public List Owners { get; set; } } ``` ```csharp title="ResponseTypes/ResponseOwnerType.cs" public class ResponseOwnerType { public Owner Owner { get; set; } } ``` ### Get Query ```csharp title="OwnerConsumer.cs" public async Task GetOwner(Guid id) { var query = new GraphQLRequest { Query = @" query ownerQuery($ownerID: ID!) { owner(ownerId: $ownerID) { id name address accounts { id type description } } }", Variables = new { ownerID = id } }; var response = await _client.SendQueryAsync(query); return response.Data.Owner; } ``` ### Create Mutation ```csharp title="OwnerConsumer.cs" public async Task CreateOwner(OwnerInput ownerToCreate) { var query = new GraphQLRequest { Query = @" mutation($owner: ownerInput!){ createOwner(owner: $owner){ id, name, address } }", Variables = new {owner = ownerToCreate} }; var response = await _client.SendMutationAsync(query); return response.Data.Owner; } ``` ### Update Mutation ```csharp title="OwnerConsumer.cs" public async Task UpdateOwner(Guid id, OwnerInput ownerToUpdate) { var query = new GraphQLRequest { Query = @" mutation($owner: ownerInput!, $ownerId: ID!){ updateOwner(owner: $owner, ownerId: $ownerId){ id, name, address } }", Variables = new { owner = ownerToUpdate, ownerId = id } }; var response = await _client.SendMutationAsync(query); return response.Data.Owner; } ``` ### Delete Mutation ```csharp title="OwnerConsumer.cs" public async Task DeleteOwner(Guid id) { var query = new GraphQLRequest { Query = @" mutation($ownerId: ID!){ deleteOwner(ownerId: $ownerId) }", Variables = new { ownerId = id } }; var response = await _client.SendMutationAsync(query); return response.Data.Owner; } ``` ## Use in a Blazor page Create a new `Consume.razor` page to test our code: ```html title="Pages/Consume.razor" @page "/consume"

Consume

@if (Owner != null) { @foreach (var item in Owner) { }
Id Name Address
@item.Id @item.Name @item.Address
} ``` Create the page code: ```csharp title="Pages/Consume.razor.cs" public partial class Consume { private List Owner; [Inject] public OwnerConsumer Consumer { get; set; } protected override async Task OnInitializedAsync() { this.Owner = await Consumer.GetAllOwners(); } } ```