ASP.NET CORE 2.
2 & 3 REST API TUTORIAL
HTTPS://WWW.YOUTUBE.COM/PLAYLIST?LIST=PL UOEQUMGNXXOGMSDWU7TL 6IQTSOTYJTWU
TABLE OF CONTENTS
https://www.youtube.com/playlist?list=PLUOequmGnXxOgmSDWU7Tl6iQTsOtyjtwU ........................................... 1
ASP.NET Core 2.2 REST API Tutorial 1 - Setup and Swagger configuration ................................................................... 2
ASP.NET Core 2.2 REST API Tutorial 2 - Implementing versioning................................................................................. 4
ASP.NET Core 2.2 REST API Tutorial 3 - Dependency injection and clean service registration ..................................... 5
ASP.NET Core 3 & 2.2 REST API Tutorial 4 - Creating resources using POST ................................................................. 7
ASP.NET Core 3 & 2.2 REST API Tutorial 5 - Retrieving resources with GET .................................................................. 8
ASP.NET Core 2.2 REST API Tutorial 6 - Updating resources with PUT ........................................................................ 11
ASP.NET Core 3 & 2.2 REST API Tutorial 7 - Deleting resources with DELETE ............................................................. 12
ASP.NET CORE 2.2 REST API TUTORIAL 1 - SETUP AND SWAGGER CONFIGURATION
Delete IIS express from properties
Add swagger SWASHBUCKLE.ASPNETCO RE
Add folder Options, create class SwaggerOptions.cs
public class SwaggerOptions
{
public string JsonRoute { get; set; }
public string Description { get; set; }
public string UiEndpoint { get; set; }
}
Add to startup the following code
var swaggerOptions = new SwaggerOptions();
Configuration.GetSection(nameof(SwaggerOptions)).Bind(swaggerOptions);
app.UseSwagger(option => { option.RouteTemplate = swaggerOptions.JsonRoute; });
app.UseSwaggerUI(option =>
{
option.SwaggerEndpoint(swaggerOptions.UiEndpoint, swaggerOptions.Description);
});
ASP.NET CORE 2.2 REST API TUTORIAL 2 - IMPLEMENTING VERSIONING
Create folder Domain, create class Post.cs
public class Post
{
public string Id { get; set; }
}
Create Controllers/api/v1, create class PostsController.cs
public class PostsController : Controller
{
private List<Post> _posts;
public PostsController()
{
_posts = new List<Post>();
for (var i = 0; i < 5; i++)
{
_posts.Add(new Post{Id = Guid.NewGuid().ToString()});
}
}
[HttpGet(ApiRoutes.Posts.GetAll)]
public IActionResult GetAll()
{
return Ok(_posts);
}
Create folder Contract, create class Contract/v1/ApiRouters.cs
public static class ApiRoutes
{
public const string Root = "api";
public const string Version = "v1";
public const string Base = Root + "/" + Version;
public static class Posts
{
public const string GetAll = Base+"/posts";
public const string Create = Base + "/posts";
public const string Get = Base + "/posts/{postId}";
}
}
ASP.NET CORE 2.2 REST API TUTORIAL 3 - DEPENDENCY INJECTION AND CLEAN SERVICE
REGISTRATION
Create folder Installers, create interface IInstaller.cs
public interface IInstaller
{
void InstallServices(IServiceCollection services , IConfiguration configuration);
Create class MvcInstaller.cs which implements IInstaller interface
public class MvcInstaller : IInstaller
{
public void InstallServices(IServiceCollection services, IConfiguration configuration)
{
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given
request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSwaggerGen(x =>
{
x.SwaggerDoc("v1", new Info { Title = "Tweetbook API", Version = "v1" });
});
}
}
Create class MvcInstaller.cs which implements IInstaller interface
public class DbInstaller :IInstaller
{
public void InstallServices(IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
configuration.GetConnectionString("DefaultConnection")));
}
}
Create class InstallerExtensions.cs
public static class InstallerExtensions
{
public static void InstallServicesInAssemble(this IServiceCollection services, IConfiguration
configuration)
{
var installers = typeof(Startup).Assembly.ExportedTypes.Where(x =>
typeof(IInstaller).IsAssignableFrom(x) && !x.IsInterface &&
!x.IsAbstract).Select(Activator.CreateInstance).Cast<IInstaller>().ToList();
installers.ForEach(installer => installer.InstallServices(services, configuration));
Remove from method ConfigureService from startup.cs and make it:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.InstallServicesInAssemble(Configuration);
}
ASP.NET CORE 3 & 2.2 REST API TUTORIAL 4 - CREATING RESOURCES USING POST
Create new folders Contract/v1/Requests and Contract/v1/Responses
Create new class Contract/v1/Requests/CreatePostRequest.cs
public class CreatePostRequest
{
public string Id { get; set; }
}
Create new class Contract/v1/Responses/PostResponse.cs
public class PostResponse
{
public string Id { get; set; }
}
Add new method to PostsController.cs
[HttpPost(ApiRoutes.Posts.Create)]
public IActionResult Create([FromBody] CreatePostRequest postRequest)
{
var post = new Post{Id=postRequest.Id};
if (string.IsNullOrEmpty(post.Id))
post.Id = Guid.NewGuid().ToString();
_posts.Add(post);
var baseUrl = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.ToUriComponent()}";
var locationUri = baseUrl + "/" + ApiRoutes.Posts.Get.Replace("{postId}", post.Id);
var response = new PostResponse {Id = post.Id};
return Created(locationUri, response);
}
ASP.NET CORE 3 & 2.2 REST API TUTORIAL 5 - RETRIEVING RESOURCES WITH GET
Modify Post.cs, add string name, and make Id Guid
public class Post
{
public Guid Id { get; set; }
public string Name { get; set; }
}
Modify CreatePostRequest.cs make Id Guid
public class CreatePostRequest
{
public Guid Id { get; set; }
}
Modify PostResponse.cs make Id Guid
public class PostResponse
{
public Guid Id { get; set; }
}
Create Services folder, add IPostService.cs interface
public interface IPostService
List<Post> GetPosts();
Post GetPostById(Guid postId);
}
Add PostService.cs class which implements IPostService interface
public class PostService : IPostService
{
private readonly List<Post> _posts;
public PostService()
{
_posts = new List<Post>();
for (var i = 0; i < 5; i++)
{
_posts.Add(new Post
{
Id = Guid.NewGuid(),
Name = $"Post Name {i}"
});
}
}
public List<Post> GetPosts()
{
return _posts;
}
public Post GetPostById(Guid postId)
{
return _posts.SingleOrDefault(x => x.Id == postId);
}
}
Modify DBInstaller.cs (which was created instead of startup.cs) and add AddSingleton method
public void InstallServices(IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
configuration.GetConnectionString("DefaultConnection")));
services.AddSingleton<IPostService, PostService>();
}
Modify PostsController.cs, as follows
public class PostsController : Controller
{
private readonly IPostService _postService;
public PostsController(IPostService postService)
{
_postService = postService;
}
[HttpGet(ApiRoutes.Posts.GetAll)]
public IActionResult GetAll()
{
return Ok(_postService.GetPosts());
}
[HttpGet(ApiRoutes.Posts.Get)]
public IActionResult Get([FromRoute] Guid postId)
{
var post = _postService.GetPostById(postId);
if (post == null)
return NotFound();
return Ok(post);
}
[HttpPost(ApiRoutes.Posts.Create)]
public IActionResult Create([FromBody] CreatePostRequest postRequest)
{
var post = new Post{Id = postRequest.Id};
if (post.Id != Guid.Empty)
post.Id = Guid.NewGuid();
_postService.GetPosts().Add(post);
var baseUrl = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host.ToUriComponent()}";
var locationUri = baseUrl + "/" + ApiRoutes.Posts.Get.Replace("{postId}", post.Id.ToString());
var response = new PostResponse {Id = post.Id};
return Created(locationUri, response);
}
}
ASP.NET CORE 2.2 REST API TUTORIAL 6 - UPDATING RESOURCES W ITH PUT
Add Contract/v1/Requests/ class UpdatePostRequest.cs
public class UpdatePostRequest
{
public string Name { get; set; }
}
Modify interface IPostService.cs add UpdatePost method
public interface IPostService
{
List<Post> GetPosts();
Post GetPostById(Guid postId);
bool UpdatePost(Post postToUpdate);
Modify PostService.cs, add updatePost method
public bool UpdatePost(Post postToUpdate)
{
var exists = GetPostById(postToUpdate.Id) != null;
if (!exists)
return false;
var index = _posts.FindIndex(x => x.Id == postToUpdate.Id);
_posts[index] = postToUpdate;
return true;
Modify ApiRoutes.cs, add Update static method
public const string Update = Base + "/posts/{postId}";
Modify PostsController.cs, add Update method
[HttpPut(ApiRoutes.Posts.Update)]
public IActionResult Update([FromRoute] Guid postId, [FromBody] UpdatePostRequest request)
{
var post = new Post
{
Id = postId,
Name = request.Name
};
var updated = _postService.UpdatePost(post);
if (!updated)
return NotFound();
return Ok(post);
}
ASP.NET CORE 3 & 2.2 REST API TUTORIAL 7 - DELETING RESOURCES W ITH DELETE
Modify interface IPostService.cs add DeletePost method
public interface IPostService
{
List<Post> GetPosts();
Post GetPostById(Guid postId);
bool UpdatePost(Post postToUpdate);
bool DeletePost(Guid postId);
Modify PostService.cs, add updatePost method
public bool DeletePost(Guid postId)
{
var post= GetPostById(postId);
if(post == null)
return false;
_posts.Remove(post);
return true;
}
Modify ApiRoutes.cs, add Update static method
public const string Delete = Base + "/posts/{postId}";
Modify PostsController.cs, add Delete method
[HttpDelete(ApiRoutes.Posts.Delete)]
public IActionResult Delete([FromRoute] Guid postId)
{
var isDeleted = _postService.DeletePost(postId);
if (!isDeleted)
return NotFound();
return NoContent();
}