:PROPERTIES: :ID: 6a5bf6dd-d0ec-43e4-8e07-9956f4715f10 :END: #+title: RESTful APIs * 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 users = new List() { new User { Id = 1, Name = "Alice", Email = "alice@email.com" }, new User { Id = 2, Name = "Bob", Email = "bob@email.com" } }; [HttpGet] public ActionResult> 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 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 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