Files
org_roam/Career Concepts/20260305132058-restful_api.org
Zaine ccdd229a7d
All checks were successful
Build Roam Site / build (push) Successful in 32s
search key nav fixes
2026-05-14 14:51:09 +01:00

320 lines
5.6 KiB
Org Mode
Executable File

:PROPERTIES:
:ID: 6a5bf6dd-d0ec-43e4-8e07-9956f4715f10
:END:
#+title: RESTful APIs
#+filetags: :notes:api:career:technical:
#+category: Career Concepts
* What is a RESTful API?
A *RESTful API* is a web service that follows the principles of *REST (Representational State Transfer)*. REST is an architectural style used for designing networked applications.
In a RESTful system:
- Everything is treated as a *resource*
- Resources are identified using *URLs*
- Standard *HTTP methods* are used to interact with resources
- Communication is usually done using *JSON*
Example resource:
#+begin_src
/users
/users/1
/users/1/orders
#+end_src
These represent data stored on the server.
* Core HTTP Methods
REST APIs rely heavily on HTTP verbs.
| Method | Purpose | Example Endpoint |
|--------+-----------------------------+------------------|
| GET | Retrieve data | GET /users |
| POST | Create a new resource | POST /users |
| PUT | Update an existing resource | PUT /users/1 |
| DELETE | Remove a resource | DELETE /users/1 |
* Example Resource: User
Assume we have a simple *User* resource:
#+begin_src json
{
"id": 1,
"name": "Alice",
"email": "alice@email.com"
}
#+end_src
The API allows clients to create, read, update, and delete users.
* Creating a REST API in C# (ASP.NET Core)
In C#, REST APIs are commonly built using *ASP.NET Core Web API*.
Example project creation:
#+begin_src bash
dotnet new webapi -n UserApi
cd UserApi
dotnet run
#+end_src
This creates a ready-to-run REST API project.
* Defining a Model
First, define the resource model.
File: Models/User.cs
#+begin_src csharp
namespace UserApi.Models
{
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
}
#+end_src
This represents the data stored and returned by the API.
* Creating a Controller
Controllers handle HTTP requests.
File: Controllers/UserController.cs
#+begin_src csharp
using Microsoft.AspNetCore.Mvc;
using UserApi.Models;
namespace UserApi.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
private static List<User> users = new List<User>()
{
new User { Id = 1, Name = "Alice", Email = "alice@email.com" },
new User { Id = 2, Name = "Bob", Email = "bob@email.com" }
};
[HttpGet]
public ActionResult<List<User>> GetUsers()
{
return Ok(users);
}
}
}
#+end_src
Endpoint created:
#+begin_src
GET /api/user
#+end_src
Response:
#+begin_src json
[
{ "id": 1, "name": "Alice", "email": "alice@email.com" },
{ "id": 2, "name": "Bob", "email": "bob@email.com" }
]
#+end_src
* Getting a Single Resource
Add an endpoint to retrieve a specific user.
#+begin_src csharp
[HttpGet("{id}")]
public ActionResult<User> GetUser(int id)
{
var user = users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}
#+end_src
Endpoint:
#+begin_src
GET /api/user/1
#+end_src
* Creating a Resource (POST)
Clients send JSON data to create a new user.
#+begin_src csharp
[HttpPost]
public ActionResult<User> CreateUser(User newUser)
{
newUser.Id = users.Max(u => u.Id) + 1;
users.Add(newUser);
return CreatedAtAction(nameof(GetUser), new { id = newUser.Id }, newUser);
}
#+end_src
Example request:
#+begin_src json
POST /api/user
{
"name": "Charlie",
"email": "charlie@email.com"
}
#+end_src
* Updating a Resource (PUT)
#+begin_src csharp
[HttpPut("{id}")]
public IActionResult UpdateUser(int id, User updatedUser)
{
var user = users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
return NotFound();
}
user.Name = updatedUser.Name;
user.Email = updatedUser.Email;
return NoContent();
}
#+end_src
Endpoint:
#+begin_src
PUT /api/user/1
#+end_src
* Deleting a Resource
#+begin_src csharp
[HttpDelete("{id}")]
public IActionResult DeleteUser(int id)
{
var user = users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
return NotFound();
}
users.Remove(user);
return NoContent();
}
#+end_src
Endpoint:
#+begin_src
DELETE /api/user/1
#+end_src
* REST Principles
A good REST API should follow these key ideas:
** 1. Statelessness
Each request contains all information needed.
The server does *not store client session state*.
** 2. Resource-Based URLs
Endpoints should represent *nouns*, not verbs.
Good:
#+begin_src
GET /users
POST /users
GET /users/1
#+end_src
Bad:
#+begin_src
GET /getUsers
POST /createUser
#+end_src
** 3. Standard HTTP Status Codes
| Code | Meaning |
|------+--------------|
| 200 | OK |
| 201 | Created |
| 204 | No Content |
| 400 | Bad Request |
| 404 | Not Found |
| 500 | Server Error |
* Example Full API Structure
#+begin_src
UserApi/
├── Controllers/
│ └── UserController.cs
├── Models/
│ └── User.cs
├── Program.cs
└── appsettings.json
#+end_src
* Testing the API
You can test APIs using tools like:
- curl
- Postman
- Swagger UI (included with ASP.NET)
Example curl request:
#+begin_src bash
curl http://localhost:5000/api/user
#+end_src
* Summary
A RESTful API:
- Exposes *resources via URLs*
- Uses *HTTP methods (GET, POST, PUT, DELETE)*
- Communicates typically using *JSON*
- Is *stateless*
- Returns *standard HTTP status codes*
In C#, *ASP.NET Core Web API* makes building REST APIs straightforward using:
- Models
- Controllers
- Routing
- Built-in JSON serialization