Learn how to create a REST API end-to-end from scratch using the latest .NET 5 innovations and Visual Studio Code. The API will be written in C#.
💻 Get the code:
✏️ Course developed by Julio Casal. Check out his channel:
🔗 Julio’s website:
⭐️ Course Contents ⭐️
Getting Started
0:00:00 Introduction
0:03:02 Creating the project
0:04:01 Exploring the generated project files
0:10:03 Trusting the self-signed certificate
0:11:36 Exploring the default Swagger UI page
0:12:30 Configuring Visual Studio Code settings
Entity, Repository, Controller GET
0:14:33 Introduction
0:15:45 Adding an entity
0:20:39 Ading an in-memory repository
0:26:40 Creating the controller
0:30:42 Implemeting GET all items
0:33:37 Implemeting GET single item
0:37:47 Returning a 404 NotFound status code
Dependency Injection, DTOSs
0:39:57 Introduction
0:41:23 What is dependency injection?
0:46:14 Extracting the repository interface
0:47:44 Injecting the repository into the controller
0:48:53 Registering the repository as a singleton
0:52:32 Adding a Data Transfer Object DTO
0:55:46 Creating the AsDto extension method
POST, PUT, DELETE
0:58:59 Introduction
0:59:45 Implementing POST
1:07:39 Adding validations via data annotations
1:10:00 Implemeting PUT
1:17:33 Implementing DELETE
Persisting Entities with MongoDB
1:20:46 Introduction
1:24:44 Using Postman
1:27:53 Creating a MongoDB repository
1:29:42 Using the MongoDB.Driver NuGet package
1:33:28 Implementing MongoDB Create
1:33:57 Running the MongoDB Docker container
1:38:47 Configuring MongoDB connection settings
1:42:38 Registering the MongoClient singleton
1:48:02 Testing the MongoDB integration
1:50:04 Exploring the created database in VS Code
1:52:45 Implemeting MongoDB Get, Update and Delete
Tasks, Async and Await
2:02:27 Introduction
2:06:46 Using the Async suffix
2:09:04 Using tasks in the repository
2:11:50 Using async and await
2:14:28 Returning completed tasks
2:18:16 Using tasks in the controller
2:21:23 Testing async methods in Postman
Secrets and Health Checks
2:27:02 Introduction
2:30:06 Enabling authentication in MongoDB
2:33:36 Using the .NET Secret Manager
2:36:40 Using the MongoDB credentials in the service
2:40:00 Introduction to Health Checks
2:42:28 Adding an endpoint for health checks
2:44:46 Adding a MongoDB health check
2:48:41 Adding checks for readiness and liveness
2:53:51 Customizing the health check response
2:58:59 Exploring other health check NuGet packages
Docker
3:00:44 Introduction
3:08:28 What is Docker?
3:17:54 Removing https redirection
3:20:39 Generating a Dockerfile in VS Code
3:30:40 Building the Docker image
3:33:00 Adding a Docker network
3:34:07 Running the containers in the Docker network
3:40:36 Running the REST API in Docker
3:42:02 Pushing the container image to Docker Hub
3:46:02 Exploring the image in Docker Hub
3:46:32 Pulling the image back to the local box
Kubernetes
3:49:20 Introduction
3:54:05 What is Kubernetes?
4:04:06 Enabling a Kubernetes cluster in Docker Desktop
4:06:12 Installing the Kubernetes extension for VS Code
4:06:58 Declaring the REST API Kuberentes deployment
4:14:35 Creating a secret in Kubernetes
4:17:28 Declaring health probes
4:19:14 Declaring the REST API Kubernetes service
4:22:56 Creating the REST API resources in Kubernetes
4:26:15 Declaring the MongoDB Kubernetes StatefulSet
4:36:09 Declaring the MongoDB Kubernetes service
4:38:27 Creating the MongoDB resources in Kubernetes
4:40:42 Testing the REST API hosted in Kubernetes
4:42:08 Exploring the Kubernetes self-healing capability
4:46:04 Scaling Kubernetes pods
4:47:38 Adding logs via ILogger
4:52:04 Getting a new image version into Kubernetes
4:53:23 Load balancing requests across pods
Unit Testing and TDD
4:56:23 Introduction
4:57:04 What is unit testing?
5:01:19 What is test driven development?
5:04:25 Restructuring files and directories
5:08:25 Creating the xUnit test project
5:09:15 Building multiple projects in VS Code
5:13:10 Adding NuGet packages for unit testing
5:14:35 Testing GetItemAsync unexisting item
5:18:35 Using the AAA pattern
5:19:31 Stubbing dependencies via Moq
5:26:52 Running tests in VS Code
5:28:05 Using the .NET Core Test Explorer extension
5:30:55 Testing GetItemAsync existing item
5:38:01 Using FluentAssertions
5:41:46 Testing GetItemsAsync
5:45:41 Testing CreateItemAsync
5:53:13 Testing UpdateItemAsync
5:57:51 Testing DeleteItemAsync
5:59:40 Refactoring and catching regressions
6:10:50 Using TDD to test a yet to be created method
6:19:07 Going back to green by fixing the failing test
6:21:19 Testing the new controller method in Postman
Thanks a lot Beau for sharing the tutorial in this awesome channel. Really hope it helps folks get started with my favorite platform!
I'm stuck at part 1:42:38 Registering the MongoClient singleton cuz I'm using .NET 6.0 and the two files Startup.cs and Program.cs have been merged.
Can anyone help me with the code, I have tried many methods but they did not work at all
thanks
Apparently, it is now a federal felony to exhibit a software video which is not delivered in a very thick and unintelligible accent.
will this work with .net version 6? has anyone tried going through the course with .net 6 sdk?
the tutorial was goin fine until i had to use startup.cs i use .NET 6
When dialogue go in part of REST API or SSL certificate my brain say "Boom" but i load this information is overfull and understand in future
First of all, thank you Julio!! Im really digging and replaying this course!
Second, I have an error and cant find a solution 🙁 on 4:23:37 (runing kubectl apply -f .catalog.yaml) I get the following: Error from server (BadRequest): error when creating ".\catalog.yaml": Deployment in version "v1" cannot be handled as a Deployment: strict decoding error: unknown field "spec.template.spec.containers[0].env[1].valuefrom" …. Any ideas on how to solve it??
Thanks in advance!!
Thanks a lot for this tutorial ! I've been following each step, also searching for what i don't know and i'm really learning. Your way of teaching is awesome. However, i have a question (if anyone can help): I was running my docker container on the docker network (as instructed in the tutorial) with no issues. However, after restarting my computer i can't get it running again: i'm always having an error saying there''s a problem with MOngoDB (OperationsCountServerSelector }. Client view of cluster state is { ClusterId : "1", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/mongo:27017" }", EndPoint: "Unspecified/mongo:27017", ReasonChanged: "Heartbeat", State: "Disconnected"). I can run it locally (without the network) but when i try to run it under the network i'm having this error. Please help.
absolutely loving this!
in the first part of the video when working with the local repository, i am struggling to comprehend how we are still able to access the methods and list of items despite initialising the repository in the controller as an 'instance' of the interface.
when we register the dependency using AddSingleton, are we establishing this connection when we define the concrete instance that implements the interface (ie InMemItemsRepository) ?
Does this tutorial is a RESTFUL APi or just REST APi?
Thanks a lot for such good course I like it ))
I hope this helps someone. the 'Startup.cs' file missing in DOTNET 6 Project: check out this video: https://www.youtube.com/watch?v=rCHs9oEKKpM
Good Day Julio Casal, @ 4:42:08 on running the /items webapi in postman getting nginx – 404 file not found can you help in resolving this.
Incredible bootcamp!!😱😍
Thank you so much!
@32:04 getting an error when I run this that the items controller needs a return type, any thoughts?
thank you my bro benifit
Is there anything special I need to do to get the imports working? In the video it seems to be auto importing, but I'm not sure how to replicate that. Usually if I let VSCode auto-complete what I'm typing, it will also auto-import, but that doesn't seem to be working.
In dotnet core 6.0 you can register the singleton in the Program.cs file after the first comment in the file like so:
// Add services to the container.
builder.Services.AddSingleton<IItemsRepository, InMemItemsRepository>();
Very good tutorial. which helped me to learn a lot about REST Architecture.
I am curious why the lecturer is using Visual Studio Code instead of Visual Studio 2019 ? Thank you in advance for your replies.
I was expecting some insight on c# backend but we got an amazing course going beyond that, even kubernetes!
please try explaining better CUASE I DONT KNOW WHAT YOURE DOING HALF THE TIME
Working through this now and the Instructor and material are great. Really wonderful way to teach the material and not just a step by step tutorial. I am working on a project that uses Azure services for DB, API, etc so I need the conceptual understanding which this course presents very well.
Thank you for the great class!
I don''t get what's the point of a dto class
Great! With some minor changes works with .NET 6. Thanks!
What are all the extensions required
Are there major changes to .NET 6?
Can you please do a video on REST APIs with .NET Core 6.0
Single handedly the best training I have gotten with .Net Rest APIs. Awesome job.
Im just doing a spring boot course. Concepts are simiral can't tell much. At44mins seems like in dotnet the api endpoints handling is simpler than in springboot. Watching the videout out of curiosity. Btw like it some stuff are unlogical yet might be because lack of my knowledge. Will watch a db reply with my opinion. Btw I like the way you teach. Great video.
Seems like I can't get the catalog pod ready? Any solution before I just watch the rest of this video? The file had a minor mistake with the upper case which was supposed to be MongodbSettings__Password instead of "Db" but still nothing
Edit: Looks like I have Mongo connection down but don't know the reason on why that's happenning and can't connect. Any solution?
Hey @Julio Casal. Hope you are doing well.
I am getting below error at 2:38:00 when I try to Get the items
MongoDB.Driver.MongoAuthenticationException: Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1.
—> MongoDB.Driver.MongoCommandException: Command saslStart failed: Authentication failed..
at MongoDB.Driver.Core.WireProtocol.CommandUsingQueryMessageWireProtocol`1.ProcessReply(ConnectionId connectionId, ReplyMessage`1 reply)
at MongoDB.Driver.Core.WireProtocol.CommandUsingQueryMessageWireProtocol`1.ExecuteAsync(IConnection connection, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Authentication.SaslAuthenticator.AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
— End of inner exception stack trace —
at MongoDB.Driver.Core.Authentication.SaslAuthenticator.AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Authentication.DefaultAuthenticator.AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Authentication.AuthenticationHelper.AuthenticateAsync(IConnection connection, ConnectionDescription description, IReadOnlyList`1 authenticators, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.ConnectionInitializer.AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Connections.BinaryConnection.OpenHelperAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.PooledConnection.OpenAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.ConnectionCreator.CreateOpenedInternalAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.ConnectionCreator.CreateOpenedOrReuseAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquireConnectionHelper.AcquireConnectionAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.ConnectionPools.ExclusiveConnectionPool.AcquireConnectionAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Servers.Server.GetChannelAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.RetryableWriteContext.InitializeAsync(CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.RetryableWriteContext.CreateAsync(IWriteBinding binding, Boolean retryRequested, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.ExecuteAsync(IWriteBinding binding, CancellationToken cancellationToken)
at MongoDB.Driver.OperationExecutor.ExecuteWriteOperationAsync[TResult](IWriteBinding binding, IWriteOperation`1 operation, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.ExecuteWriteOperationAsync[TResult](IClientSessionHandle session, IWriteOperation`1 operation, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionBase`1.InsertOneAsync(TDocument document, InsertOneOptions options, Func`3 bulkWriteAsync)
at Catalog.Repositories.MongoDbItemsRepository.CreateItemAsync(Item item) in D:CatalogRepositoriesMongoDbItemsRepository.cs:line 29
at Catalog.Controller.ItemsController.CreateItemAsync(CreateItemDto itemDto) in D:CatalogControllersItemsController.cs:line 57
at lambda_method5(Closure , Object )
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
HEADERS
=======
Connection: keep-alive
Content-Type: application/json
Accept: /
Accept-Encoding: gzip, deflate, br
Host: localhost:5001
Referer: http://localhost:5000/items
User-Agent: PostmanRuntime/7.29.0
Content-Length: 49
Postman-Token: 5639576c-e3bf-4c47-9ff7-9097b4bc0f9b
However , My connection string is correct and also it is fetching the correct password from Secrets
1:08:00 Executed without name and it gave me a 400 is this a new feature from .net core 6.0? Default is required?
Hit Control + . to fix namespace issues. He doesn't show what namespaces he's using, he's letting vscode determine it with intellisense. Just something I think will help people as it confused me.
good tutorial but he just assumes we know most of the things and he just does it too quickly without too much explanation
Amazing tutorial, I appreciate that, thank you very much. On the unit tests, if somebody had problems with CreateItemAsync_WithItemToCreate_ReturnsCreatedItem on BeCloseTo comparison, I did this and worked:
createdItem.CreatedDate.Should().BeCloseTo(DateTimeOffset.UtcNow, TimeSpan.FromMilliseconds(1000));
I needed to use TimeSpan.FromMilliseconds, only passing 1000 the editor was complaining
readonly struct System.Int32
Represents a 32-bit signed integer.
Argument 2: cannot convert from 'int' to 'System.TimeSpan' [Catalog.UnitTests]
Thank you so much <3
I have a question. I need to have a CPU that supports virtualization for use Docker?
Really great tutorial, we want more of the Julio Casal Videos please
Do you have.a git (or other) repo with the complete project/source code?
which one better, nestjs or .netcore ^_^
This tutorial is amazing. It covers a lot of different concepts in very friendly way. I am half way . I wish there would be also small section on connecting this to SQL DB. I am doing that on my own , but including this would be like only source of information for RestAPI.
Having the whole docker portion and mongo in here is a side track from the actual main subject.
Furthermore most application using dotnet,in my experience use relational DB's.
The time would have been better suited showing work with files or 3rd party api for async concepts.