Skip to content

A framework for building JSON:API compliant REST APIs using ASP.NET and Entity Framework Core.

License

Notifications You must be signed in to change notification settings

json-api-dotnet/JsonApiDotNetCore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JsonApiDotNetCore

Build Coverage NuGet GitHub License Chat FIRST-TIMERS

A framework for building JSON:API compliant REST APIs using ASP.NET Core and Entity Framework Core. Includes support for the Atomic Operations extension.

The ultimate goal of this library is to eliminate as much boilerplate as possible by offering out-of-the-box features, such as sorting, filtering, pagination, sparse fieldset selection, and side-loading related resources. You just need to focus on defining the resources and implementing your custom business logic. This library has been designed around dependency injection, making extensibility incredibly easy.

Note

OpenAPI support is now available, currently in preview. Give it a try!

Getting started

The following steps describe how to create a JSON:API project.

  1. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

    dotnet add package JsonApiDotNetCore
    dotnet add package Microsoft.EntityFrameworkCore.Sqlite
  2. Declare your entities, annotated with JsonApiDotNetCore attributes:

    #nullable enable
    
    [Resource]
    public class Person : Identifiable<long>
    {
        [Attr] public string? FirstName { get; set; }
        [Attr] public string LastName { get; set; } = null!;
        [HasMany] public ISet<Person> Children { get; set; } = new HashSet<Person>();
    }
  3. Define your DbContext, seeding the database with sample data:

    public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(options)
    {
        public DbSet<Person> People => Set<Person>();
    
        protected override void OnConfiguring(DbContextOptionsBuilder builder)
        {
            builder.UseSqlite("Data Source=SampleDb.db");
            builder.UseAsyncSeeding(async (dbContext, _, cancellationToken) =>
            {
                dbContext.Set<Person>().Add(new Person
                {
                    FirstName = "John",
                    LastName = "Doe",
                    Children =
                    {
                        new Person
                        {
                            FirstName = "Baby",
                            LastName = "Doe"
                        }
                    }
                });
                await dbContext.SaveChangesAsync(cancellationToken);
            });
        }
    }
  4. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddDbContext<AppDbContext>();
    builder.Services.AddJsonApi<AppDbContext>(options =>
    {
        options.UseRelativeLinks = true;
        options.IncludeTotalResourceCount = true;
    });
    
    var app = builder.Build();
    app.UseRouting();
    app.UseJsonApi();
    app.MapControllers();
    await CreateDatabaseAsync(app.Services);
    app.Run();
    
    static async Task CreateDatabaseAsync(IServiceProvider serviceProvider)
    {
        await using var scope = serviceProvider.CreateAsyncScope();
        var dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
        await dbContext.Database.EnsureDeletedAsync();
        await dbContext.Database.EnsureCreatedAsync();
    }
  5. Start your API

    dotnet run
  6. Send a GET request to retrieve data:

    GET http://localhost:5000/people?filter=equals(firstName,'John')&include=children HTTP/1.1
    Expand to view the JSON response
    {
      "links": {
        "self": "/people?filter=equals(firstName,%27John%27)&include=children",
        "first": "/people?filter=equals(firstName,%27John%27)&include=children",
        "last": "/people?filter=equals(firstName,%27John%27)&include=children"
      },
      "data": [
        {
          "type": "people",
          "id": "1",
          "attributes": {
            "firstName": "John",
            "lastName": "Doe"
          },
          "relationships": {
            "children": {
              "links": {
                "self": "/people/1/relationships/children",
                "related": "/people/1/children"
              },
              "data": [
                {
                  "type": "people",
                  "id": "2"
                }
              ]
            }
          },
          "links": {
            "self": "/people/1"
          }
        }
      ],
      "included": [
        {
          "type": "people",
          "id": "2",
          "attributes": {
            "firstName": "Baby",
            "lastName": "Doe"
          },
          "relationships": {
            "children": {
              "links": {
                "self": "/people/2/relationships/children",
                "related": "/people/2/children"
              }
            }
          },
          "links": {
            "self": "/people/2"
          }
        }
      ],
      "meta": {
        "total": 1
      }
    }

Learn more

The following links explain what this project provides, why it exists, and how you can use it.

About

Official documentation

Samples

  • The examples directory provides ready-to-run sample API projects
  • Many advanced use cases are covered by integration tests, which can be found here. This includes topics such as batching, multi-tenancy, authorization, soft-deletion, obfuscated IDs, resource inheritance, alternate routing, custom metadata, error handling and logging.
  • The Ember.js Todo List App showcases a JsonApiDotNetCore API and an Ember.js client with token authentication.

Related projects

Compatibility

The following chart should help you pick the best version, based on your environment. See also our versioning policy.

JsonApiDotNetCore Status .NET Entity Framework Core
master Preview 9 9
8 8, 9
5.7.0+ Stable 9 9
8 8, 9
5.5.0-5.6.0 Stable 9 9
8 8, 9
7 7
6 6, 7
5.0.3-5.4.0 Stable 7 7
6 6, 7
5.0.0-5.0.2 Stable 6 6
4.x Stable 6 5
5 5
Core 3.1 3.1, 5
3.x Stable Core 2.x 2.x

Trying out the latest build

After each commit to the master branch, a new pre-release NuGet package is automatically published to feedz.io. To try it out, follow the steps below:

  1. Create a nuget.config file in the same directory as your .sln file, with the following contents:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <packageSources>
        <add key="json-api-dotnet" value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
        <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
      </packageSources>
    </configuration>
  2. In your IDE, browse the list of packages from the json-api-dotnet feed. Make sure pre-release packages are included in the list.

Contributing

Have a question, found a bug or want to submit code changes? See our contributing guidelines.

Build from source

To build the code from this repository locally, run:

dotnet build

Running tests locally requires access to a PostgreSQL database. If you have docker installed, this can started via:

pwsh run-docker-postgres.ps1

And then to run the tests:

dotnet test

Alternatively, to build, run all tests, generate code coverage and NuGet packages:

pwsh Build.ps1

Sponsors

We are very grateful to the sponsors below, who have provided us with a no-cost license for their tools.

JetBrains Logo   Araxis Logo

Do you like this project? Consider to sponsor, or just reward us by giving our repository a star.