Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

2,931 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

JsonApiDotNetCore

BuildCoverageNuGetGitHub LicenseFIRST-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. Create a new ASP.NET Core Web API project:

    dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
    cd ExampleJsonApi
  2. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:

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

    [Resource]publicclassPerson:Identifiable<long>{[Attr]publicstring?FirstName{get;set;}[Attr]publicstringLastName{get;set;}=null!;[HasMany]publicISet<Person>Children{get;set;}=newHashSet<Person>();}
  4. Define your DbContext, seeding the database with sample data:

    publicclassAppDbContext(DbContextOptions<AppDbContext>options):DbContext(options){publicDbSet<Person>People=>Set<Person>();protectedoverridevoidOnConfiguring(DbContextOptionsBuilderbuilder){builder.UseSqlite("Data Source=SampleDb.db");builder.UseAsyncSeeding(async(dbContext,_,cancellationToken)=>{dbContext.Set<Person>().Add(newPerson{FirstName="John",LastName="Doe",Children={newPerson{FirstName="Baby",LastName="Doe"}}});awaitdbContext.SaveChangesAsync(cancellationToken);});}}
  5. Configure Entity Framework Core and JsonApiDotNetCore in Program.cs:

    varbuilder=WebApplication.CreateBuilder(args);builder.Services.AddDbContext<AppDbContext>();builder.Services.AddJsonApi<AppDbContext>(options =>{options.UseRelativeLinks=true;options.IncludeTotalResourceCount=true;});varapp=builder.Build();app.UseRouting();app.UseJsonApi();app.MapControllers();awaitCreateDatabaseAsync(app.Services);app.Run();staticasyncTaskCreateDatabaseAsync(IServiceProviderserviceProvider){awaitusingvarscope=serviceProvider.CreateAsyncScope();vardbContext=scope.ServiceProvider.GetRequiredService<AppDbContext>();awaitdbContext.Database.EnsureDeletedAsync();awaitdbContext.Database.EnsureCreatedAsync();}
  6. Start your API

    dotnet run
  7. 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, which are documented here.
  • The integration tests directory covers many advanced use cases, which are documented 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.

.NETEntity Framework CoreJsonApiDotNetCoreStatus
10105.10.0+Stable
995.5.0+Stable
88, 95.5.0+Stable
775.0.3 - 5.6.0Out of support
675.0.3 - 5.6.0Out of support
665.0.0 - 5.6.0Out of support
554.xOut of support
Core 3.13.1, 54.xOut of support
Core 2.x2.x3.xOut of support

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>
    <addkey="json-api-dotnet"value="https://f.feedz.io/json-api-dotnet/jsonapidotnetcore/nuget/index.json" />
    <addkey="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 be 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 grateful to the following sponsors, who provide the team with a no-cost license for using their tools.

JetBrains logoAraxis Logo

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

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages