DEV Community

aaronblondeau
aaronblondeau

Posted on

5 3

A Node.js Developer Tries .NET Again

I recently wrote a post about frustration I experienced when trying out .NET having worked with Node.js for the past several years. Turns out my Google-fu was off and I should have been searching for "ASP.NET Minimal APIs" which leads to this amazing document : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0

All the fine grained control I am used to is right there! No laborious MVC to wade though, no more butting heads with razor pages, just plain GET and POST requests.

I wanted to see how hard it was to duplicate things I normally do with a simple express API:

  1. Can I use url path parameters in GET requests?
  2. Can I access the request and response objects?
  3. Can I process input from a POST request body?
  4. Can I write middleware for requests?
  5. Can I do an async web request and return the result within a handler?
  6. Can I serve static files?
  7. Can I render basic html templates?
  8. Can I add a swagger UI?

Yes! The answer to all of the above was yes! I was shocked. My experience of trying to get back into .NET had been like someone who normally goes wherever they want on a bicycle suddenly being restricted to traveling by train. Now I have a bike back!

Here are the details on the items above:

1) Using request path parameters is as simple as adding {placeholders} to the path.

app.MapGet("/hello/{name}", (string name) => $"Hello {name}!");
Enter fullscreen mode Exit fullscreen mode

2 and 3) Request and response objects are available via a HttpContext binding. Parsing of JSON body happens automatically via parameter binding.

app.MapPost("/thing", Thing (HttpContext context, Thing thang) => {
    Console.WriteLine(context.Request.Method);
    return thang;
});
Enter fullscreen mode Exit fullscreen mode

4) Middleware looks an awful lot like it does in express.

app.Use(async (context, next) =>
{
    Console.WriteLine("Halo Fren - I iz Middleware! " + context.Request.Path);
    context.Items.Add("user", "Doge");
    await next.Invoke();
});
Enter fullscreen mode Exit fullscreen mode

5) Async HTTP requests within a handler are nice and easy and automatically parse JSON.

app.MapGet("/proxy", async Task<Todo> (HttpContext context) => {
    Console.WriteLine("Middleware says I am " + (string)context.Items["user"]);
    var client = new HttpClient();
    var todo = await client.GetFromJsonAsync<Todo>("https://jsonplaceholder.typicode.com/todos/1");
    return todo;
}).WithTags("Proxy"); // Sets swagger tag
Enter fullscreen mode Exit fullscreen mode

6) Serving static files is a one-liner.

app.UseStaticFiles();
Enter fullscreen mode Exit fullscreen mode

7) To serve HTML I found the well maintained Handlebars.NET.

app.MapGet("/html", async context =>
{
    var source = System.IO.File.ReadAllText(@"./views/demo.html");
    var template = Handlebars.Compile(source);
    var data = new
    {
        title = "Demo Html",
        body = "This is super simple html!"
    };
    var result = template(data);
    await context.Response.WriteAsync(result);
});
Enter fullscreen mode Exit fullscreen mode

8) Swagger was also super easy to setup. I did have to re-write several of my handlers to add types for their input parameters and output. I even found how to setup groups (see code for #5 above). The full swagger setup is in the demo repo.

Bonus) After getting all this stuff working I noticed that the project template included a dockerfile. The dockerfile built and ran first try which was really fun to see.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay