# Routing and Model Binding — .NET Core: Build, Test and Ship Web APIs

Source: https://www.geekswithgeeks.com/en/dotnet-core/api-routing-binding

> Read route values, query strings and JSON bodies and return proper status codes.

## Where values come from

Handler parameters are bound automatically: names in `{braces}` come from the route, simple types from the query string, and a complex type from the JSON body. `Results.*` helpers set the status code.

## GET by id and POST

`TypedResults.NotFound()` gives a 404 and `TypedResults.Created` gives a 201 with a Location header.

```csharp
var products = new List<Product>();

app.MapGet("/products/{id:int}", (int id) =>
    products.FirstOrDefault(p => p.Id == id) is { } p
        ? Results.Ok(p)
        : Results.NotFound());

app.MapPost("/products", (Product p) =>
{
    products.Add(p);
    return Results.Created($"/products/{p.Id}", p);
});

record Product(int Id, string Name);
```

## Use route constraints

`{id:int}` makes `/products/abc` fail to match, so you get a 404 instead of a conversion error inside your handler. Group related routes with `app.MapGroup("/products")`.

**Quiz:** Which status code should a successful POST that creates a resource return?

- [ ] 200 OK only
- [ ] 204 No Content
- [ ] 404 Not Found
- [x] 201 Created

*Answer:* 201 Created. 201 signals that a new resource exists, ideally with a Location header pointing to it.
