This is an implementation of Facebook's GraphQL in .NET.
Now the specification is being developed by the GraphQL Foundation.
This project uses a lexer/parser originally written by Marek Magdziak and released with a MIT license. Thank you Marek!
http://graphql-dotnet.github.io
This site is in sync with master
branch.
You can install the latest stable version via NuGet.
> dotnet add package GraphQL
For serialized results, you'll need an IDocumentWriter
implementation.
We support several serializers (or you can bring your own):
Package | Downloads | Nuget Latest |
---|---|---|
GraphQL.SystemTextJson | ||
GraphQL.NewtonsoftJson |
> dotnet add package GraphQL.SystemTextJson
> dotnet add package GraphQL.NewtonsoftJson
Note: You can use
GraphQL.NewtonsoftJson
with .NET Core 3+, just be aware it lacks async writing capabilities so writing to an ASP.NET Core 3.0HttpResponse.Body
will require you to setAllowSynchronousIO
totrue
as per this announcement; which isn't recommended.
You can get all preview versions from GitHub Packages. Note that GitHub requires authentication to consume the feed. See here.
https://github.com/graphql-dotnet/examples
You can also try an example of GraphQL demo server inside this repo - GraphQL.Harness. It supports the popular IDEs for managing GraphQL requests and exploring GraphQL schema:
- API Development in .NET with GraphQL - Glenn Block demonstrates how to use the GraphQL .NET framework to build a fully functional GraphQL endpoint.
- Building GraphQL APIs with ASP.NET Core by Roland Guijt
You can see the changes in public APIs using fuget.org.
Define your schema with a top level query object then execute that query.
Fully-featured examples can be found here.
var schema = Schema.For(@"
type Query {
hello: String
}
");
var root = new { Hello = "Hello World!" };
var json = await schema.ExecuteAsync(_ =>
{
_.Query = "{ hello }";
_.Root = root;
});
Console.WriteLine(json);
This example uses the GraphQL schema language. See the documentation for more examples and information.
public class Droid
{
public string Id { get; set; }
public string Name { get; set; }
}
public class Query
{
[GraphQLMetadata("droid")]
public Droid GetDroid()
{
return new Droid { Id = "123", Name = "R2-D2" };
}
}
var schema = Schema.For(@"
type Droid {
id: ID
name: String
}
type Query {
droid: Droid
}
", _ => {
_.Types.Include<Query>();
});
var json = await schema.ExecuteAsync(_ =>
{
_.Query = "{ droid { id name } }";
});
public class Droid
{
public string Id { get; set; }
public string Name { get; set; }
}
public class Query
{
private List<Droid> _droids = new List<Droid>
{
new Droid { Id = "123", Name = "R2-D2" }
};
[GraphQLMetadata("droid")]
public Droid GetDroid(string id)
{
return _droids.FirstOrDefault(x => x.Id == id);
}
}
var schema = Schema.For(@"
type Droid {
id: ID
name: String
}
type Query {
droid(id: ID): Droid
}
", _ => {
_.Types.Include<Query>();
});
var json = await schema.ExecuteAsync(_ =>
{
_.Query = $"{{ droid(id: \"123\") {{ id name }} }}";
});
- Grammar and AST for the GraphQL language should be compatible with the June 2018 specification.
- Scalars
- Objects
- Lists of objects/interfaces
- Interfaces
- Unions
- Arguments
- Variables
- Fragments
- Directives
- Include
- Skip
- Custom
- Enumerations
- Input Objects
- Mutations
- Subscriptions
- Async execution
- Arguments of correct type
- Default values of correct type
- Fields on correct type
- Fragments on composite types
- Known argument names
- Known directives
- Known fragment names
- Known type names
- Lone anonymous operations
- No fragment cycles
- No undefined variables
- No unused fragments
- No unused variables
- Overlapping fields can be merged
- Possible fragment spreads
- Provide non-null arguments
- Scalar leafs
- Unique argument names
- Unique directives per location
- Unique fragment names
- Unique input field names
- Unique operation names
- Unique variable names
- Variables are input types
- Variables in allowed position
- Single root field
- __typename
- __type
- name
- kind
- description
- fields
- interfaces
- possibleTypes
- enumValues
- inputFields
- ofType
- __schema
- types
- queryType
- mutationType
- subscriptionType
- directives
The package publishing process is automated with GitHub Actions.
After your PR is merged into master
or develop
, preview packages are published to GitHub Packages.
Stable versions of packages are published to NuGet when a release is created.
This project exists thanks to all the people who contribute.
Thank you to all our backers! 🙏 Become a backer.
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. Become a sponsor.