{"id":1639,"date":"2025-12-16T10:25:08","date_gmt":"2025-12-16T10:25:08","guid":{"rendered":"https:\/\/oussamasaidi.com\/?p=1639"},"modified":"2025-12-20T13:30:35","modified_gmt":"2025-12-20T13:30:35","slug":"restful-api-mastery-best-practices-with-asp-net-core","status":"publish","type":"post","link":"https:\/\/oussamasaidi.com\/en\/restful-api-mastery-best-practices-with-asp-net-core\/","title":{"rendered":"RESTful API Best Practices with ASP.NET Core"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Professional Best Practices, Versioning Strategies &amp; Advanced Serialization (Part 1)<br><\/h2>\n\n\n\n<h5 class=\"wp-block-heading\">In this blog<\/h5>\n\n\n<ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-introduction-building-enterprise-grade-restful-apis-with-asp-net-core-2\">Introduction: Building Enterprise-Grade RESTful APIs with ASP.NET Core<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-1-restful-apis-in-the-modern-asp-net-core-ecosystem-8\">1. RESTful APIs in the Modern ASP.NET Core Ecosystem<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-why-rest-still-dominates-11\">Why REST Still Dominates<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-2-rest-architectural-constraints-every-asp-net-core-api-must-enforce-25\">2. REST Architectural Constraints Every ASP.NET Core API Must Enforce<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-clientserver-separation-27\">Client\u2013Server Separation<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-statelessness-33\">Statelessness<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-uniform-interface-40\">Uniform Interface<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-3-establishing-a-clean-and-scalable-asp-net-core-api-foundation-48\">3. Establishing a Clean and Scalable ASP.NET Core API Foundation<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-project-creation-50\">Project Creation<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-minimal-hosting-setup-net-8-59\">Minimal Hosting Setup (.NET 8+)<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-4-designing-forward-compatible-api-versioning-strategies-62\">4. Designing Forward-Compatible API Versioning Strategies<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-why-versioning-matters-64\">Why Versioning Matters<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-url-based-versioning-most-common-70\">URL-Based Versioning (Most Common)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-best-practice-recommendation-75\">Best Practice Recommendation<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-5-advanced-json-serialization-and-contract-control-in-asp-net-core-78\">5. Advanced JSON Serialization and Contract Control in ASP.NET Core<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-system-text-json-vs-newtonsoft-json-80\">System.Text.Json vs Newtonsoft.Json<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-custom-serialization-options-86\">Custom Serialization Options<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-6-predictable-input-validation-and-explicit-model-binding-91\">6. Predictable Input Validation and Explicit Model Binding<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-data-annotations-for-validation-93\">Data Annotations for Validation<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-fluentvalidation-recommended-97\">FluentValidation (Recommended)<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-7-centralized-error-handling-and-standardized-exception-responses-99\">7. Centralized Error Handling and Standardized Exception Responses<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-global-exception-middleware-101\">Global Exception Middleware<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-problem-details-rfc-7807-103\">Problem Details (RFC 7807)<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-8-authentication-and-authorization-as-first-class-api-concerns-107\">8. Authentication and Authorization as First-Class API Concerns<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-jwt-authentication-setup-109\">JWT Authentication Setup<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-9-http-caching-strategies-for-high-performance-apis-116\">9. HTTP Caching Strategies for High-Performance APIs<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-response-caching-middleware-118\">Response Caching Middleware<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-best-practice-122\">Best Practice<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-10-rate-limiting-and-throttling-for-api-reliability-124\">10. Rate Limiting and Throttling for API Reliability<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-built-in-rate-limiting-net-8-126\">Built-in Rate Limiting (.NET 8)<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-conclusion-solid-rest-foundations-before-scaling-131\">Conclusion: Solid REST Foundations Before Scaling<\/a><\/li><\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-introduction-building-enterprise-grade-restful-apis-with-asp-net-core-2\">Introduction: Building Enterprise-Grade RESTful APIs with ASP.NET Core<\/h2>\n\n\n\n<p>RESTful API Mastery with <strong>ASP.NET Core<\/strong> is a strategic engineering task, not a mechanical implementation detail. In modern .NET platforms, APIs must be <strong>predictable, evolvable, secure, and operationally efficient<\/strong> from day one.<\/p>\n\n\n\n<p>At Microsoft scale, APIs are treated as long-lived products. Therefore, architectural decisions around <strong>versioning, serialization, validation, and rate limiting<\/strong> are made early and enforced consistently.<\/p>\n\n\n\n<p>This article is the <strong>first part of a complete, production-oriented guide<\/strong> to RESTful API mastery with ASP.NET Core. It focuses on the <strong>core technical foundations<\/strong> that every senior .NET developer must fully understand before scaling an API across teams, services, and clients.<\/p>\n\n\n\n<p>The goal is not only to explain <em>how<\/em> things work, but also <em>why<\/em> certain best practices are preferred in real-world enterprise systems.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-1024x683.png\" alt=\"RESTful API Mastery\" class=\"wp-image-1681\" srcset=\"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-1024x683.png 1024w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-300x200.png 300w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-768x512.png 768w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-18x12.png 18w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-256x171.png 256w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r-950x633.png 950w, https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">RESTful API Mastery<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-1-restful-apis-in-the-modern-asp-net-core-ecosystem-8\">1. RESTful APIs in the Modern ASP.NET Core Ecosystem<\/h2>\n\n\n\n<p>Before writing a single line of code, it is essential to understand <strong>what makes an API truly RESTful<\/strong>.<\/p>\n\n\n\n<p>A <strong>RESTful API<\/strong> (Representational State Transfer) is an architectural style that defines how distributed systems communicate over HTTP using standardized semantics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-why-rest-still-dominates-11\">Why REST Still Dominates<\/h3>\n\n\n\n<p>Although alternatives such as gRPC and GraphQL exist, REST remains dominant because:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It is <strong>simple and universally understood<\/strong><\/li>\n\n\n\n<li>It leverages <strong>standard HTTP verbs<\/strong><\/li>\n\n\n\n<li>It works seamlessly with browsers, mobile apps, and IoT devices<\/li>\n\n\n\n<li>It integrates naturally with ASP.NET Core middleware<\/li>\n<\/ul>\n\n\n\n<p>In ASP.NET Core, REST aligns perfectly with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Attribute routing<\/li>\n\n\n\n<li>Model binding<\/li>\n\n\n\n<li>Filters and middleware<\/li>\n\n\n\n<li>Content negotiation<\/li>\n<\/ul>\n\n\n\n<p>As a result, REST is often the <strong>default choice<\/strong> for enterprise-grade APIs built on .NET.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-2-rest-architectural-constraints-every-asp-net-core-api-must-enforce-25\">2. REST Architectural Constraints Every ASP.NET Core API Must Enforce<\/h2>\n\n\n\n<p>To build a real RESTful API, you must respect a set of <strong>architectural constraints<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-clientserver-separation-27\">Client\u2013Server Separation<\/h3>\n\n\n\n<p>The client and server must evolve independently. In practice, this means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No UI logic in your API<\/li>\n\n\n\n<li>No client-specific assumptions in controllers<\/li>\n<\/ul>\n\n\n\n<p>ASP.NET Core naturally enforces this separation when APIs are designed correctly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-statelessness-33\">Statelessness<\/h3>\n\n\n\n<p>Each request must contain <strong>all the information needed<\/strong> to process it.<\/p>\n\n\n\n<p>&#x274c; Avoid:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">HttpContext.Session.SetString(\"UserId\", userId);<\/pre>\n\n\n\n<p>&#x2705; Prefer:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Authorization: Bearer eyJhbGciOi...<\/pre>\n\n\n\n<p>Stateless APIs scale better and work perfectly with load balancers and containers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-uniform-interface-40\">Uniform Interface<\/h3>\n\n\n\n<p>This constraint enforces consistency through:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Resource-based URLs<\/li>\n\n\n\n<li>Standard HTTP methods<\/li>\n\n\n\n<li>Meaningful status codes<\/li>\n<\/ul>\n\n\n\n<p>Example:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Operation<\/th><th>HTTP Verb<\/th><th>Endpoint<\/th><\/tr><tr><td>Get products<\/td><td>GET<\/td><td>\/api\/products<\/td><\/tr><tr><td>Get product<\/td><td>GET<\/td><td>\/api\/products\/{id}<\/td><\/tr><tr><td>Create product<\/td><td>POST<\/td><td>\/api\/products<\/td><\/tr><tr><td>Update product<\/td><td>PUT<\/td><td>\/api\/products\/{id}<\/td><\/tr><tr><td>Delete product<\/td><td>DELETE<\/td><td>\/api\/products\/{id}<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-3-establishing-a-clean-and-scalable-asp-net-core-api-foundation-48\">3. Establishing a Clean and Scalable ASP.NET Core API Foundation<\/h2>\n\n\n\n<p>A strong foundation starts with a <strong>clean project structure<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-project-creation-50\">Project Creation<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dotnet new webapi -n Store.Api\ncd Store.Api<\/pre>\n\n\n\n<p>Recommended Folder Structure<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Store.Api\n\u2502\u2500\u2500 Controllers\n\u2502\u2500\u2500 Domain\n\u2502\u2500\u2500 Application\n\u2502\u2500\u2500 Infrastructure\n\u2502\u2500\u2500 Contracts\n\u2502\u2500\u2500 Program.cs<\/pre>\n\n\n\n<p>This structure supports:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Clean Architecture<\/li>\n\n\n\n<li>Testability<\/li>\n\n\n\n<li>Long-term maintainability<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-minimal-hosting-setup-net-8-59\">Minimal Hosting Setup (.NET 8+)<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">var builder = WebApplication.CreateBuilder(args);\n\n\nbuilder.Services.AddControllers();\nbuilder.Services.AddEndpointsApiExplorer();\nbuilder.Services.AddSwaggerGen();\n\n\nvar app = builder.Build();\n\n\nif (app.Environment.IsDevelopment())\n{\napp.UseSwagger();\napp.UseSwaggerUI();\n}\n\n\napp.UseHttpsRedirection();\napp.UseAuthorization();\napp.MapControllers();\n\n\napp.Run();<\/pre>\n\n\n\n<p>This setup is lightweight, fast, and production-ready.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-4-designing-forward-compatible-api-versioning-strategies-62\">4. Designing Forward-Compatible API Versioning Strategies<\/h2>\n\n\n\n<p>API versioning is <strong>not optional<\/strong> in professional systems.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-why-versioning-matters-64\">Why Versioning Matters<\/h3>\n\n\n\n<p>Without versioning:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Clients break unexpectedly<\/li>\n\n\n\n<li>Backward compatibility becomes impossible<\/li>\n\n\n\n<li>Refactoring turns into a nightmare<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-url-based-versioning-most-common-70\">URL-Based Versioning (Most Common)<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/api\/v1\/products\n\/api\/v2\/products\n\n[ApiController]\n[Route(\"api\/v{version:apiVersion}\/products\")]\n[ApiVersion(\"1.0\")]\npublic class ProductsController : ControllerBase\n{\n[HttpGet]\npublic IActionResult Get() => Ok(\"v1 products\");\n}<\/pre>\n\n\n\n<p>Header-Based Versioning<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">X-API-Version: 2.0<\/pre>\n\n\n\n<p>This approach keeps URLs clean but requires stricter client discipline.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-best-practice-recommendation-75\">Best Practice Recommendation<\/h3>\n\n\n\n<p>In most enterprise .NET APIs:<\/p>\n\n\n\n<p>&#x2705; Use <strong>URL versioning<\/strong> for public APIs &#x2705; Use <strong>header versioning<\/strong> for internal APIs<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-5-advanced-json-serialization-and-contract-control-in-asp-net-core-78\">5. Advanced JSON Serialization and Contract Control in ASP.NET Core<\/h2>\n\n\n\n<p>Serialization defines how your objects are transformed into HTTP responses.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-system-text-json-vs-newtonsoft-json-80\">System.Text.Json vs Newtonsoft.Json<\/h3>\n\n\n\n<p>ASP.NET Core defaults to <strong>System.Text.Json<\/strong> because it is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Faster<\/li>\n\n\n\n<li>Memory efficient<\/li>\n\n\n\n<li>Secure by default<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-custom-serialization-options-86\">Custom Serialization Options<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddControllers()\n.AddJsonOptions(options =>\n{\noptions.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;\noptions.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;\n});<\/pre>\n\n\n\n<p>Enum as Strings<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());<\/pre>\n\n\n\n<p>So that improves API readability and reduces client-side confusion.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-6-predictable-input-validation-and-explicit-model-binding-91\">6. Predictable Input Validation and Explicit Model Binding<\/h2>\n\n\n\n<p>Invalid data is one of the most common causes of production bugs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-data-annotations-for-validation-93\">Data Annotations for Validation<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class CreateProductRequest\n{\n[Required]\n[StringLength(100)]\npublic string Name { get; set; }\n\n\n[Range(1, 10000)]\npublic decimal Price { get; set; }\n}<\/pre>\n\n\n\n<p>Automatic Validation in Controllers<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[HttpPost]\npublic IActionResult Create(CreateProductRequest request)\n{\nif (!ModelState.IsValid)\nreturn BadRequest(ModelState);\n\n\nreturn Ok();\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-fluentvalidation-recommended-97\">FluentValidation (Recommended)<\/h3>\n\n\n\n<p>For complex rules, <a href=\"https:\/\/docs.fluentvalidation.net\/\" title=\"Best .NET 8 Testing Libraries: The Complete Guide for Developers\">FluentValidation <\/a>provides a cleaner approach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-7-centralized-error-handling-and-standardized-exception-responses-99\">7. Centralized Error Handling and Standardized Exception Responses<\/h2>\n\n\n\n<p>Exposing raw <a href=\"https:\/\/oussamasaidi.com\/en\/net-6-gestion-des-exceptions-globales-de-lapi-web\/\" title=\".NET 6 \u2013 Gestion des exceptions globales de l\u2019API Web\">exceptions <\/a>is a <strong>security risk<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-global-exception-middleware-101\">Global Exception Middleware<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">app.UseExceptionHandler(errorApp =>\n{\nerrorApp.Run(async context =>\n{\ncontext.Response.StatusCode = 500;\nawait context.Response.WriteAsJsonAsync(new\n{\nerror = \"An unexpected error occurred\"\n});\n});\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-problem-details-rfc-7807-103\">Problem Details (RFC 7807)<\/h3>\n\n\n\n<p>ASP.NET Core supports standardized error responses:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">return Problem(title: \"Validation failed\", statusCode: 400);<\/pre>\n\n\n\n<p>This improves API consistency and client integration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-8-authentication-and-authorization-as-first-class-api-concerns-107\">8. Authentication and Authorization as First-Class API Concerns<\/h2>\n\n\n\n<p>Security must be <strong>built-in<\/strong>, not added later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-jwt-authentication-setup-109\">JWT Authentication Setup<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddAuthentication(\"Bearer\")\n.AddJwtBearer();<\/pre>\n\n\n\n<p>Securing Endpoints<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[Authorize]\n[HttpGet]\npublic IActionResult GetSecureData()\n{\nreturn Ok(\"Secure content\");\n}<\/pre>\n\n\n\n<p>Policy-Based Authorization:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[Authorize(Policy = \"AdminOnly\")]<\/pre>\n\n\n\n<p>This approach scales better than role-based checks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-9-http-caching-strategies-for-high-performance-apis-116\">9. HTTP Caching Strategies for High-Performance APIs<\/h2>\n\n\n\n<p>Caching reduces latency and server load.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-response-caching-middleware-118\">Response Caching Middleware<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddResponseCaching();\napp.UseResponseCaching();<\/pre>\n\n\n\n<p>Controller-Level Caching<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ResponseCache(Duration = 60)]\n[HttpGet]\npublic IActionResult GetProducts()\n{\nreturn Ok(products);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-best-practice-122\">Best Practice<\/h3>\n\n\n\n<p>Cache <strong>read-heavy endpoints<\/strong> and avoid caching sensitive data.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-10-rate-limiting-and-throttling-for-api-reliability-124\">10. Rate Limiting and Throttling for API Reliability<\/h2>\n\n\n\n<p><a href=\"https:\/\/oussamasaidi.com\/en\/how-to-build-an-idempotent-api-with-net-9-ef-core-9-and-polly-v8\/\" title=\"How to Build an Idempotent API with .NET 9, EF Core 9 and Polly v8\">Rate limiting<\/a> protects your API from abuse and accidental overload.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-built-in-rate-limiting-net-8-126\">Built-in Rate Limiting (.NET 8)<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">builder.Services.AddRateLimiter(options =>\n{\noptions.AddFixedWindowLimiter(\"fixed\", limiterOptions =>\n{\nlimiterOptions.PermitLimit = 100;\nlimiterOptions.Window = TimeSpan.FromMinutes(1);\n});\n});<\/pre>\n\n\n\n<p>Applying Rate Limits<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">app.UseRateLimiter();<\/pre>\n\n\n\n<p>This ensures fair usage and improves API reliability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion-solid-rest-foundations-before-scaling-131\">Conclusion: Solid REST Foundations Before Scaling<\/h2>\n\n\n\n<p>In this first part of <strong>RESTful API Mastery with ASP.NET Core<\/strong>, we deliberately focused on the <strong>non-negotiable fundamentals<\/strong> that determine whether an API will succeed or fail at scale.<\/p>\n\n\n\n<p>You have seen how professional .NET teams approach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>REST architectural constraints and uniform interfaces<\/li>\n\n\n\n<li><a href=\"https:\/\/oussamasaidi.com\/en\/solid-principles-in-c-explained-definitions-examples-best-practices\/\" title=\"SOLID Principles in C# Explained: Definitions, Examples &amp; Best Practices\">Clean ASP.NET Core project structure<\/a><\/li>\n\n\n\n<li>Explicit and future-proof API versioning<\/li>\n\n\n\n<li>Controlled JSON serialization contracts<\/li>\n\n\n\n<li>Defensive input validation and model binding<\/li>\n\n\n\n<li>Centralized error handling aligned with HTTP standards<\/li>\n\n\n\n<li>Authentication and authorization as core design elements<\/li>\n\n\n\n<li>HTTP caching for performance optimization<\/li>\n\n\n\n<li>Rate limiting to protect platform stability<\/li>\n<\/ul>\n\n\n\n<p>These concepts form the <strong>baseline expectations<\/strong> for any serious ASP.NET Core API operating in production.<\/p>\n\n\n\n<p>In <strong><a href=\"https:\/\/oussamasaidi.com\/en\/https-oussamasaidi-com-restful-api-mastery-best-practices-with-asp-net-core-part-2\/\" target=\"_blank\" rel=\"noopener\" title=\"RESTful API Mastery with ASP.NET Core Part 2\">Part 2<\/a><\/strong>, we will move beyond fundamentals and focus on <strong>testing strategies, performance tuning, <a href=\"https:\/\/oussamasaidi.com\/en\/net-8-test-driven-design-architecture-7-proven-patterns-to-build-robust-maintainable-systems\/\" title=\"Net 8 Test Driven Design Architecture 7 Proven Patterns to Build Robust, Maintainable Systems\">microservices communication<\/a>, security hardening, observability, API gateways, and deployment patterns<\/strong> used in large-scale .NET systems.<\/p>\n\n\n\n<p>Mastery begins with discipline\u2014and disciplined APIs scale.<\/p>\n\n\n\n<div class=\"buy-coffee-container\">\n<p style=\"text-align:center; color:#555; font-size:14px;\">\n  If this article helped you, consider supporting my work.\n<\/p>\n  <a\n    href=\"https:\/\/buymeacoffee.com\/oussamasaii\"\n    target=\"_blank\"\n    rel=\"noopener noreferrer\"\n    class=\"buy-coffee-button\"\n  >\n    &#x2615; Buy me a coffee\n  <\/a>\n<\/div>\n\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Professional Best Practices, Versioning Strategies &amp; Advanced Serialization (Part 1) In this blog Introduction: Building Enterprise-Grade RESTful APIs with ASP.NET&#8230; <\/p>\n<div class=\"art-el-more\"><a href=\"https:\/\/oussamasaidi.com\/en\/restful-api-mastery-best-practices-with-asp-net-core\/\" class=\"art-link art-color-link art-w-chevron\">Read more<\/a><\/div>","protected":false},"author":1,"featured_media":1682,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[40,68,45,41,56,17,85,84,279,82,83,42,43,44,86,282,284,46,98,60,20,92,91,61],"tags":[47,48,49,54,97,53,50,51,52,96],"ppma_author":[286],"class_list":["post-1639","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-netcore","category-api","category-asp-net","category-c","category-c-2","category-design","category-docker","category-ef-core","category-en","category-entity-framework-core","category-entity-framework-core-2","category-log","category-logging","category-nlog","category-podman","category-scalar","category-security","category-serilog","category-solid","category-swagger-ui","category-technology","category-test","category-unit-test","category-web-api","tag-net-core","tag-asp-net","tag-c-sharp","tag-c","tag-clean-code","tag-dot-net-core","tag-log","tag-logging","tag-serilog","tag-solid"],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-cover-scaled.png","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1714,"url":"https:\/\/oussamasaidi.com\/en\/https-oussamasaidi-com-restful-api-mastery-best-practices-with-asp-net-core-part-2\/","url_meta":{"origin":1639,"position":0},"title":"RESTful API best practices\u00a0with ASP.NET Core Part 2","author":"Saidi Oussama","date":"December 20, 2025","format":false,"excerpt":"Testing, Performance, Security, Microservices & Deployment Introduction: From Solid Foundations to Production Excellence In Part 1 of RESTful API Mastery, we established the architectural and technical foundations required to build reliable, evolvable RESTful APIs with ASP.NET Core. However, a well-designed API only becomes truly valuable when it is tested, observable,\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"RESTful API Mastery","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/12\/restful-api-mastery-best-practices-with-asp-net-core-2r.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1086,"url":"https:\/\/oussamasaidi.com\/en\/logging-centralise-avec-opentelemetry-dans-net-core\/","url_meta":{"origin":1639,"position":1},"title":"Logging Centralis\u00e9 avec OpenTelemetry dans .NET Core","author":"Saidi Oussama","date":"April 7, 2025","format":false,"excerpt":"Diagramme officiel OpenTelemetry montrant le flux de donn\u00e9es. Source originale. Introduction Dans le monde du d\u00e9veloppement moderne, la gestion des logs est devenue un \u00e9l\u00e9ment critique pour assurer la stabilit\u00e9 et la performance des applications. OpenTelemetry \u00e9merge comme la solution ultime pour impl\u00e9menter une strat\u00e9gie de logging centralis\u00e9e efficace. Ce\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-8-avr.-2025-00_36_08.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":399,"url":"https:\/\/oussamasaidi.com\/en\/serilog-in-aspnet-core-3-1\/","url_meta":{"origin":1639,"position":2},"title":"Ma\u00eetriser les Logs Structur\u00e9s avec Serilog dans ASP.NET Core 8","author":"Saidi Oussama","date":"September 21, 2022","format":false,"excerpt":"Guide Complet Serilog avec Exemples pour SQL Server et le Cloud Introduction Aujourd'hui, les applications modernes g\u00e9n\u00e8rent des volumes croissants de donn\u00e9es. Pour les d\u00e9velopper efficacement, une solution de journalisation robuste devient indispensable. Parmi les outils disponibles, Serilog se distingue comme l'une des meilleures biblioth\u00e8ques de logging pour .NET. Dans\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/07\/serilog-dotnet-core.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/07\/serilog-dotnet-core.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/07\/serilog-dotnet-core.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/07\/serilog-dotnet-core.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/07\/serilog-dotnet-core.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":660,"url":"https:\/\/oussamasaidi.com\/en\/best-libraries-for-aspnet-core\/","url_meta":{"origin":1639,"position":3},"title":"15 meilleures biblioth\u00e8ques pour les d\u00e9veloppeurs ASP.NET Core","author":"Saidi Oussama","date":"November 23, 2022","format":false,"excerpt":"Plusieurs nouveaux d\u00e9veloppeurs font quotidiennement leurs premiers pas dans ASP.Net Core pour leur carri\u00e8re de d\u00e9veloppement Web. Choisir et ma\u00eetriser les meilleures biblioth\u00e8ques qui aident \u00e0 optimiser l'exp\u00e9rience de d\u00e9veloppement est le facteur d\u00e9cisif pour toute technologie. Avec la croissance rapide de .NET Core au cours des derni\u00e8res ann\u00e9es, plusieurs\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/pngaaa.com-592393.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":931,"url":"https:\/\/oussamasaidi.com\/en\/net-9-entity-framework-core-what-is-new\/","url_meta":{"origin":1639,"position":4},"title":"Les Nouveaut\u00e9s d&rsquo;Entity Framework Core avec .NET 9 : Ce Qu&rsquo;il Faut Savoir","author":"Saidi Oussama","date":"January 6, 2025","format":false,"excerpt":"La sortie de .NET 9 s\u2019accompagne de mises \u00e0 jour significatives dans Entity Framework Core (EF Core), le c\u00e9l\u00e8bre ORM de Microsoft. Ces nouveaut\u00e9s visent \u00e0 simplifier les sc\u00e9narios complexes et \u00e0 am\u00e9liorer les performances, la compatibilit\u00e9 cloud et l\u2019int\u00e9gration IA. Voici les cinq principales nouveaut\u00e9s qui transformeront vos projets.\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2025\/01\/DALL%C2%B7E-2025-01-06-15.03.46-A-professional-and-modern-banner-image-for-a-WordPress-blog-article-about-the-new-features-of-Entity-Framework-Core-with-.NET-9.-The-design-should-inc.webp?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":838,"url":"https:\/\/oussamasaidi.com\/en\/comment-implementer-authentification-cle-api-aspnet-core\/","url_meta":{"origin":1639,"position":5},"title":".NET Core : impl\u00e9menter l\u2019authentification par cl\u00e9 API en C#","author":"Saidi Oussama","date":"August 22, 2024","format":false,"excerpt":"ContexteCr\u00e9ation de l'attribut de cl\u00e9 APIImpl\u00e9menter du filtre d'autorisation ApiKeyimpl\u00e9mentation de l'ApiKeyValidatorTester l'APIUtilisez le middlewareConclusionDerniers Articles Vous pouvez trouver le code source complet sur github Contexte Alors, qu\u2019est-ce que l\u2019authentification par cl\u00e9 API dans ASP.NET Core ? Prenons un exemple concret. Imaginez que vous ayez d\u00e9velopp\u00e9 un tableau de bord\u2026","rel":"","context":"In &quot;.Net Core&quot;","block_context":{"text":".Net Core","link":"https:\/\/oussamasaidi.com\/en\/category\/netcore\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/oussamasaidi.com\/wp-content\/uploads\/2024\/07\/Capture00.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"authors":[{"term_id":286,"user_id":1,"is_guest":0,"slug":"oussama_sa","display_name":"Saidi Oussama","avatar_url":{"url":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg","url2x":"https:\/\/oussamasaidi.com\/wp-content\/uploads\/2022\/02\/001_001_cv1.jpg"},"author_category":"1","first_name":"Oussama","last_name":"SAIDI","user_url":"https:\/\/oussamasaidi.com","job_title":"Senior Fullstack .NET Developer","description":"I\u2019m a Senior Fullstack .NET Developer specializing in building scalable, high-performance web applications with .NET, C#, and modern frontend frameworks like React.js. I\u2019m passionate about clean architecture, automated testing, and sharing knowledge through blogs and tutorials."}],"_links":{"self":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/1639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/comments?post=1639"}],"version-history":[{"count":53,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/1639\/revisions"}],"predecessor-version":[{"id":1745,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/posts\/1639\/revisions\/1745"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media\/1682"}],"wp:attachment":[{"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/media?parent=1639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/categories?post=1639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/tags?post=1639"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/oussamasaidi.com\/en\/wp-json\/wp\/v2\/ppma_author?post=1639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}