Skip to main content

RESTful API Best Practices

HTTP Verbs

  • GET: Retrieve resources (idempotent, safe)
  • POST: Create new resources
  • PUT: Replace entire resource (idempotent)
  • PATCH: Partial update
  • DELETE: Remove resource (idempotent)

Status Codes

CodeMeaningWhen to Use
200OKSuccessful GET, PUT, PATCH
201CreatedSuccessful POST
204No ContentSuccessful DELETE
400Bad RequestInvalid input
401UnauthorizedMissing/invalid authentication
403ForbiddenAuthenticated but not authorized
404Not FoundResource doesn't exist
409ConflictDuplicate resource
500Server ErrorUnexpected error

Resource Naming

✅ Good:
/api/products
/api/products/123
/api/products/123/reviews
/api/orders/456/items

❌ Bad:
/api/getProducts
/api/product/delete/123
/api/createOrder

Versioning

// URL versioning
app.MapGet("/api/v1/products", GetProductsV1);
app.MapGet("/api/v2/products", GetProductsV2);

// Header versioning
app.MapGet("/api/products", async (HttpContext context) =>
{
var version = context.Request.Headers["api-version"];
return version == "2.0" ? GetProductsV2() : GetProductsV1();
});

Pagination

public class PagedResult\<T\>
{
public List\<T\> Items { get; set; }
public int Page { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
public int TotalPages => (int)Math.Ceiling(TotalCount / (double)PageSize);
}

app.MapGet("/api/products", (int page = 1, int pageSize = 10) =>
{
// Return paginated results
});

Resources