How to send GraphQL requests via C#?

How to send GraphQL requests via C#?

There are a few ways to send GraphQL requests via C#. One option is to use the GraphQL.Client NuGet package, which provides a simple and type-safe way to interact with GraphQL APIs. Another option is to use the GraphQLHttpClient class from the GraphQL.Client package, which allows you to send queries and mutations using an HTTP client.

Here are some examples of how to use these packages:

  • Using GraphQL.Client:

var query = @"query ($id: String) { device (id: $id) { displayName, id } }"; var request = new GraphQLRequest () { Query = query, Variables = new {id =123} }; var graphQLClient = new GraphQLClient ("http://localhost:8080/api/GraphQL"); graphQLClient.DefaultRequestHeaders.Add ("Authorization", "yourtoken"); var graphQLResponse = await graphQLClient.PostAsync (request); Console.WriteLine (graphQLResponse.Data);

  • Using GraphQLHttpClient:

var client = new GraphQLHttpClient (Api_Url, new NewtonsoftJsonSerializer ()); var request = new GraphQLRequest { Query = {query} }; var response = await client.SendQueryAsync (request);

What GraphQL is?

GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. It allows you to ask for exactly what you need and get predictable results from your API, without over-fetching or under-fetching data. It also makes it easier to evolve your API over time without breaking existing clients, and enables powerful developer tools that leverage your API's type system.

GraphQL is not tied to any specific database or storage engine, and is instead backed by your existing code and data. You can create a GraphQL service by defining types and fields on those types, then providing functions for each field on each type. These functions are called resolvers, and they determine how to fetch the data for each field.

A GraphQL service can receive GraphQL queries and mutations to validate and execute. Queries are used to fetch data from the server, while mutations are used to modify data on the server. Both queries and mutations are written using the GraphQL syntax, which is based on JSON-like objects and fields.


Here is an example of a GraphQL query:

{ me { name email } }

This query asks for the name and email of the current user (me), and returns something like this:

{ "me": { "name": "Alice", "email": "" } }

If you want to learn more about GraphQL, you can check out these resources:

How to write a mutation?

A mutation is a way to modify data on the server, such as creating, updating, or deleting an object. A mutation is similar to a query in syntax, but it uses the keyword mutation instead of query, and it specifies the name and arguments of the operation, as well as the fields to return after the mutation is done.


Here is an example of a GraphQL mutation:

mutation CreateReview($ep: Episode!, $review: ReviewInput!) { createReview(episode: $ep, review: $review) { stars commentary } }

This mutation accepts two arguments: $ep of type Episode (an enum), and $review of type ReviewInput (an input object). It calls the createReview field on the Mutation type, passing the arguments to it. It then asks for the stars and commentary fields of the returned Review type.

To execute a mutation, you need to send it as a POST request to the GraphQL endpoint, along with the variables if any. You can also use tools like GraphiQL or GraphQL Playground to test your mutations interactively.


Some best practices for writing GraphQL mutations are:

  • Start with a verb when you name your mutations, such as create, update, delete, etc.
  • Keep your mutations specific and focused on one purpose. For example, don't combine creating and updating in one mutation.
  • Use a single, required, unique input object type as an argument for each mutation. This makes it easier to execute mutations on the client and avoid nullability issues.
  • Use a unique payload type for each mutation and add the mutation's output as a field to that payload type. This allows you to return more information from the mutation, such as errors or related data.
  • Nest your mutations under a common field name, such as Mutation or RootMutation. This helps with organizing your schema and avoiding conflicts.

If you want to learn more, you can check out these resources:


GraphQL mutation sample

Let's say you have a GraphQL schema that defines a type called Book, with fields like id, title, author, and rating. You want to write a mutation that allows you to add a new book to the database. Here is how you could do it:

# Define an input object type for the book data input BookInput { title: String! author: String! rating: Int } # Define a payload type for the mutation output type AddBookPayload { book: Book success: Boolean } # Define a mutation field under the Mutation type type Mutation { addBook(book: BookInput!): AddBookPayload } # Write a mutation operation with variables mutation AddBook($book: BookInput!) { addBook(book: $book) { book { id title author rating } success } } # Provide the variables as JSON { "book": { "title": "The Hitchhiker's Guide to the Galaxy", "author": "Douglas Adams", "rating": 5 } }

This mutation operation would call the addBook field on the Mutation type, passing the book variable as an argument. It would then return the book object and a success flag from the AddBookPayload type. You can test this mutation using a tool like GraphiQL or GraphQL Playground, or send it as a POST request to your GraphQL endpoint.

About us

Do you need help in services integration? Contact us to start working for your project!

Read More

Are you looking for