Understanding RESTful API CRUD Operations

APIs power modern applications, enabling smooth communication between system parts. This article dives into CRUD operations in the REST framework, showing how each action connects to HTTP methods. With practical tips and examples, you’ll learn how CRUD supports efficient, organized API design.

25 days ago   •   7 min read

By Rahul Khinchi
Table of contents

APIs are the glue that holds modern apps together, letting different parts of your system communicate effortlessly. 

If you’ve been working with RESTful APIs, you’ve probably heard about CRUD operations: Create, Read, Update, and Delete

These are the basic actions you use to interact with data through an API, and they’re essential for building, maintaining, and scaling applications effectively.

This blog post will break down CRUD operations in the REST framework. We’ll go over the basics and explore how each operation connects to HTTP methods, along with some practical examples and tips to help you design a more organized and efficient API.

What is CRUD?

First, CRUD stands for Create, Read, Update, and Delete. It’s the basic set of functions to manipulate data and is foundational in software development.

  • Create: Adds new data.
  • Read:  Retrieves data.
  • Update: Modifies existing data.
  • Delete: Removes data.

Each function will connect to a specific HTTP method in the RESTful API world. 

Mapping CRUD to HTTP Methods

In RESTful APIs, each CRUD operation has a matching HTTP method that clarifies your intentions. 

Here’s a quick breakdown:

  • Create → POST
    We use POST requests to add new resources. Think of it as sending a new item to be added to a collection. 

For example, if you’re adding a new product to an e-commerce site, you’d hit the POST /api/v1/products endpoint with the product details in the request body.

  • Read → GET
    GET requests are for retrieving information. You’ll use them to fetch specific data or a list of items. 

If you want to get a product’s details, you will make a GET /api/v1/products/{id} call, where {id} is the unique identifier for that product.

  • Update → PUT/PATCH
    PUT and PATCH requests let you update resources. 

The difference is subtle: PUT replaces a resource entirely, while PATCH applies partial updates. So, if you’re changing just a product’s price, PATCH might be a better fit.

  • Delete → DELETE
    We use DELETE requests to remove resources. For example, DELETE /api/v1/products/{id} would remove the product with the specified ID from the system.

Each of these methods has a clear purpose. Using the right one makes your API intuitive and easy to maintain.

Examples of CRUD Endpoints

Let’s walk through building and testing an API for managing products, which involves performing CRUD operations—Create, Read, Update, and Delete

Managing products means setting up an API enabling users to add new products, retrieve product details, update product information, and delete products as needed. 

This type of setup is useful for applications like e-commerce platforms, inventory systems, and other product-oriented applications. 

We'll use a simple Node.js setup with Express for the API. Then, let’s test the operations using Treblle's API testing tool, ASPEN.

Step 1: Set Up the API

Here’s a basic setup for your API to manage product data.

Project Setup

  • First, create a new project folder:
mkdir product-api
cd product-api
npm init -y
  • Install the necessary dependencies:
npm install express body-parser
  • Create a new file called app.js for your server:
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;

app.use(bodyParser.json());

// Dummy data 
let products = [
  { id: 1, name: 'Product 1', price: 29.99 },
  { id: 2, name: 'Product 2', price: 39.99 }
];

// Create a new product
app.post('/api/v1/products', (req, res) => {
  const newProduct = req.body;
  newProduct.id = products.length + 1; // simple id generation
  products.push(newProduct);
  res.status(201).json(newProduct);
});

// Fetch all products
app.get('/api/v1/products', (req, res) => {
  res.json(products);
});

// Fetch a single product by its ID
app.get('/api/v1/products/:id', (req, res) => {
  const product = products.find(p => p.id === parseInt(req.params.id));
  if (!product) return res.status(404).send('Product not found');
  res.json(product);
});

// Update a product's information
app.put('/api/v1/products/:id', (req, res) => {
  const product = products.find(p => p.id === parseInt(req.params.id));
  if (!product) return res.status(404).send('Product not found');
  
  product.name = req.body.name;
  product.price = req.body.price;
  res.json(product);
});

// Delete a product by its ID
app.delete('/api/v1/products/:id', (req, res) => {
  const index = products.findIndex(p => p.id === parseInt(req.params.id));
  if (index === -1) return res.status(404).send('Product not found');
  products.splice(index, 1);
  res.status(204).send();
});

app.listen(port, () => {
  console.log(`API is running at http://localhost:${port}`);
});

Run your server with:

node app.js

Your API is now up and running at http://localhost:3000. Let's test it using ASPEN.

Step 2: Test CRUD Operations in an API Testing Platform

We’ll now use ASPEN to test each CRUD operation for managing products.

1. Create a Product (POST Request)

  • Open ASPEN and create a new request.
  • Set the method to POST and use the URL: http://localhost:3000/api/v1/products.
  • In the Body tab, set the format to JSON
  • Add the following data:
{
  "name": "New Product",
  "price": 49.99
}
  • Hit Send
  • You should see a response similar to this:
{
  "id": 3,
  "name": "New Product",
  "price": 49.99
}

The above message indicates that the system has successfully created a new product.

2. Get a Product (GET Request)

  • Create another GET request in ASPEN with the URL: http://localhost:3000/api/v1/products/3
  • Hit Send
  • Note: When you request a GET to retrieve a product by its ID, do not include any data in the body. Instead, just specify the product ID in the URL.
  • You should get the response:
{
  "id": 3,
  "name": "New Product",
  "price": 49.99
}

The above image shows the details of the product you just created.

3. Update a Product (PUT Request)

  • Create a PUT request in ASPEN with the URL: http://localhost:3000/api/v1/products/3.
  • In the Body tab, set the format to JSON
  • Add the following data to update the product:
{
  "name": "Updated Product",
  "price": 55.99
}
  • Hit Send, and the response should show:
{
  "id": 3,
  "name": "Updated Product",
  "price": 55.99
}

This JSON data updates the existing product with ID 3.

4. Delete a Product (DELETE Request)

  • Create a DELETE request in ASPEN with the URL: http://localhost:3000/api/v1/products/3.
  • Hit Send, and you’ll receive a response with a 204 No Content status, confirming that the system has successfully deleted the product.

Handling CRUD Operations Responsibly

CRUD operations might sound straightforward, but there are a few things to keep in mind to make sure your API stays reliable:

  • Data Validation: Validate incoming data on the server side. 

Even if you’ve done front-end validation, there’s always a chance that insufficient data slips through. Use frameworks or libraries to validate requests and avoid errors.

  • HTTP Status Codes: Using the correct HTTP status codes for each CRUD operation is essential for conveying success or error states. 

For example:

  • 201 Created for successful POST requests
  • 200 OK for successful GET, PUT, and PATCH requests
  • 204 No Content for successful DELETE requests
  • 404 Not Found for missing resources

  • Error Handling: Always provide meaningful error responses. 

A generic error message isn’t helpful for a developer trying to figure out what happened. Give enough info to point them in the right direction without exposing sensitive data.

CRUD Operations and Database Interactions

Behind the scenes, each CRUD operation corresponds to a database action. 

Here’s how it breaks down:

  • Create: INSERT a new row in the database.
  • Read: SELECT specific rows from the database.
  • Update: UPDATE the data in existing rows.
  • Delete: DELETE rows from the database.

An ORM (Object-Relational Mapper) like Sequelize for Node.js or Eloquent for Laravel simplifies these mappings. ORMs automatically translate your CRUD calls into the proper SQL commands, saving you from writing raw SQL code and ensuring consistent database interactions.

Best Practices for CRUD Operations in RESTful APIs

To keep your API functional and easy to maintain, here are a few tips:

  • Consistent Naming

Stick to clear, predictable naming conventions. Avoid mixing singular and plural nouns or using inconsistent terms.

  • Authentication and Authorization

Only let authorized users perform specific CRUD actions, especially when working with sensitive data.

  • Rate Limiting and Logging

Rate limiting helps prevent abuse, while logging lets you keep track of operations for easier monitoring and debugging.

Common Pitfalls and How to Avoid Them

Even with the basics down, making mistakes with CRUD operations is easy. 

Here are some common pitfalls to watch out for:

  • Using GET for Updates: Don’t use GET to create or update data.

 Use POST, PUT, or PATCH for those actions to avoid unintended side effects.

  • Not Validating Input: Failing to validate input can lead to security holes and unexpected bugs.
  • Ignoring Error Handling: Always handle errors correctly. 

Return informative error messages and avoid generic error codes like 500 Internal Server Error without context.

Conclusion

When building or working with an API, consider each CRUD operation's structure, consistency, and reliability. Adopting an API-First approach can enhance these aspects for a more robust design.

As you continue working with APIs, Aspen can be a great tool to make your life easier. It’s a free, native macOS app designed to test REST APIs. Aspen requires no login and simplifies the process with its user-friendly design.

You can run tests without the hassle, generate data models, create Open API specs, and even get integration code with minimal effort.

If you’re looking for a straightforward way to test and improve your APIs, Aspen is worth checking out.

Spread the word

Keep reading