# REST API Design Made Simple with Express.js

## What does REST API mean?

A **REST API** (Representational State Transfer Application Programming Interface) is an architectural style that enables two software applications to communicate over the internet.

A RESTful API operates over HTTP, treating data as addressable **resources** and performing actions using standard HTTP methods rather than arbitrary URLs.

## Resources in REST architecture

RESTful APIs in ExpressJS are designed around resources, which are identified by unique URLs. These resources represent the entities (e.g., **users, products, articles**) that the API manipulates.

*   Resources are represented as **nouns**, never verbs (e.g., `/users`, not `/getUsers`).
    
*   Collection endpoints use plural nouns (e.g., `/users`), while single items are identified with their ID (e.g., `/users/123`).
    

## HTTP methods

RESTful APIs use standard HTTP methods to perform **CRUD (Create, Read, Update, Delete**) operations on resources:

*   **GET**: When you want to get some data from the server.
    
*   **POST**: When you want to send and mutate some data on the server.
    
*   **PUT**: Updates an existing resource.
    
*   **PATCH:** Partially change.
    
*   **DELETE**: Deletes a resource.
    

REST maps database operations (CRUD) directly to standard HTTP methods:

<table style="min-width: 225px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="width: 150px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p><strong>CRUD Operation</strong></p></td><td colspan="1" rowspan="1"><p><strong>HTTP Method</strong></p></td><td colspan="1" rowspan="1" colwidth="150"><p><strong>Route (Example)</strong></p></td><td colspan="1" rowspan="1"><p><strong>Action Description</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Create</strong></p></td><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1" colwidth="150"><p><code>/users</code></p></td><td colspan="1" rowspan="1"><p>Creates a new user</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Read</strong></p></td><td colspan="1" rowspan="1"><p><code>GET</code></p></td><td colspan="1" rowspan="1" colwidth="150"><p><code>/users</code> or <code>/users/:id</code></p></td><td colspan="1" rowspan="1"><p>Retrieves all users or a specific user</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Update</strong></p></td><td colspan="1" rowspan="1"><p><code>PUT</code></p></td><td colspan="1" rowspan="1" colwidth="150"><p><code>/users/:id</code></p></td><td colspan="1" rowspan="1"><p>Replaces an entire user record</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Delete</strong></p></td><td colspan="1" rowspan="1"><p><code>DELETE</code></p></td><td colspan="1" rowspan="1" colwidth="150"><p><code>/users/:id</code></p></td><td colspan="1" rowspan="1"><p>Removes a specific user</p></td></tr></tbody></table>

## Status codes basics

![](https://cdn.hashnode.com/uploads/covers/695291ab5b12442dcb8f69d8/940eb03b-ed8c-46cc-9568-05eb93ccc1cd.png align="center")

## Designing routes using REST principles

<table style="min-width: 356px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="width: 281px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p><strong>Method</strong></p></td><td colspan="1" rowspan="1"><p><strong>Endpoint</strong></p></td><td colspan="1" rowspan="1" colwidth="281"><p><strong>Description</strong></p></td><td colspan="1" rowspan="1"><p><strong>Success Status</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p><code>GET</code></p></td><td colspan="1" rowspan="1"><p><code>/users</code></p></td><td colspan="1" rowspan="1" colwidth="281"><p>List all users (supports pagination/filters)</p></td><td colspan="1" rowspan="1"><p><code>200 OK</code></p></td></tr><tr><td colspan="1" rowspan="1"><p><code>POST</code></p></td><td colspan="1" rowspan="1"><p><code>/users</code></p></td><td colspan="1" rowspan="1" colwidth="281"><p>Create a new user with request body data</p></td><td colspan="1" rowspan="1"><p><code>201 Created</code></p></td></tr><tr><td colspan="1" rowspan="1"><p><code>GET</code></p></td><td colspan="1" rowspan="1"><p><code>/users/:id</code></p></td><td colspan="1" rowspan="1" colwidth="281"><p>Get details for one specific user</p></td><td colspan="1" rowspan="1"><p><code>200 OK</code></p></td></tr><tr><td colspan="1" rowspan="1"><p><code>PUT</code></p></td><td colspan="1" rowspan="1"><p><code>/users/:id</code></p></td><td colspan="1" rowspan="1" colwidth="281"><p>Replace user details completely</p></td><td colspan="1" rowspan="1"><p><code>200 OK</code></p></td></tr><tr><td colspan="1" rowspan="1"><p><code>DELETE</code></p></td><td colspan="1" rowspan="1"><p><code>/users/:id</code></p></td><td colspan="1" rowspan="1" colwidth="281"><p>Delete user with specified ID</p></td><td colspan="1" rowspan="1"><p><code>204 No Content</code></p></td></tr></tbody></table>

![](https://cdn.hashnode.com/uploads/covers/695291ab5b12442dcb8f69d8/f5da9d0f-c081-431e-873b-6f8f5f4565d3.png align="center")
