Overview

API frameworks and tools provide the building blocks, libraries, and utilities for developing, testing, and maintaining APIs efficiently.

Backend Frameworks

Node.js Frameworks

Express.js

const express = require('express');
const app = express();
 
app.use(express.json());
 
app.get('/api/users', (req, res) => {
  // Get users logic
  res.json({ users: [] });
});
 
app.post('/api/users', (req, res) => {
  // Create user logic
  res.status(201).json({ user: req.body });
});
 
app.listen(3000);

Fastify

const fastify = require('fastify')({ logger: true });
 
fastify.get('/api/users', async (request, reply) => {
  return { users: [] };
});
 
fastify.post('/api/users', async (request, reply) => {
  return { user: request.body };
});
 
fastify.listen({ port: 3000 });

NestJS

@Controller('users')
export class UsersController {
  @Get()
  findAll(): User[] {
    return [];
  }
 
  @Post()
  create(@Body() createUserDto: CreateUserDto): User {
    return this.usersService.create(createUserDto);
  }
}

Python Frameworks

FastAPI

from fastapi import FastAPI
from pydantic import BaseModel
 
app = FastAPI()
 
class User(BaseModel):
    name: str
    email: str
 
@app.get("/api/users")
async def get_users():
    return {"users": []}
 
@app.post("/api/users")
async def create_user(user: User):
    return {"user": user}

Django REST Framework

from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer
 
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

Flask-RESTful

from flask import Flask
from flask_restful import Api, Resource
 
app = Flask(__name__)
api = Api(app)
 
class UserResource(Resource):
    def get(self):
        return {"users": []}
    
    def post(self):
        return {"user": request.json}, 201
 
api.add_resource(UserResource, '/api/users')

Java Frameworks

Spring Boot

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @GetMapping
    public List<User> getUsers() {
        return userService.findAll();
    }
    
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userService.save(user);
        return ResponseEntity.created(uri).body(savedUser);
    }
}

Micronaut

@Controller("/api/users")
public class UserController {
    
    @Get
    public List<User> getUsers() {
        return userService.findAll();
    }
    
    @Post
    public HttpResponse<User> createUser(@Body User user) {
        User savedUser = userService.save(user);
        return HttpResponse.created(savedUser);
    }
}

.NET Frameworks

ASP.NET Core Web API

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<User>> GetUsers()
    {
        return Ok(_userService.GetAllUsers());
    }
    
    [HttpPost]
    public ActionResult<User> CreateUser(User user)
    {
        var createdUser = _userService.CreateUser(user);
        return CreatedAtAction(nameof(GetUser), 
            new { id = createdUser.Id }, createdUser);
    }
}

Minimal APIs (ASP.NET Core 6+)

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
 
app.MapGet("/api/users", () => new List<User>());
app.MapPost("/api/users", (User user) => 
    Results.Created($"/api/users/{user.Id}", user));
 
app.Run();

API Development Tools

Postman

  • API Client: Test and develop APIs
  • Collections: Organize API requests
  • Environments: Manage different environments
  • Testing: Automated API testing

Insomnia

  • REST Client: Alternative to Postman
  • GraphQL Support: Built-in GraphQL queries
  • Design Documents: API specification design
  • Git Sync: Version control for API specs

Swagger/OpenAPI Tools

  • Swagger Editor: Design OpenAPI specifications
  • Swagger UI: Interactive API documentation
  • Swagger Codegen: Generate client/server code

Hoppscotch

  • Open Source: Free and open source API client
  • Real-time: WebSocket and SSE support
  • Teams: Collaboration features
  • Self-hostable: Can be hosted on your infrastructure

Testing Frameworks

REST Assured (Java)

given()
    .contentType(ContentType.JSON)
    .body(userJson)
.when()
    .post("/api/users")
.then()
    .statusCode(201)
    .body("name", equalTo("John Doe"));

Supertest (Node.js)

const request = require('supertest');
const app = require('../app');
 
describe('Users API', () => {
  it('should create a user', async () => {
    const res = await request(app)
      .post('/api/users')
      .send({ name: 'John Doe' })
      .expect(201);
    
    expect(res.body).toHaveProperty('id');
  });
});

HTTPie (Command Line)

# GET request
http GET http://localhost:3000/api/users
 
# POST request with JSON
http POST http://localhost:3000/api/users name="John Doe"
 
# With authentication
http GET http://localhost:3000/api/users Authorization:"Bearer token"

Newman (Postman CLI)

# Run Postman collection
newman run api-tests.postman_collection.json
 
# With environment
newman run api-tests.postman_collection.json -e staging.postman_environment.json
 
# Generate report
newman run api-tests.postman_collection.json -r html,json

Code Generation Tools

OpenAPI Generator

# Generate Java client
openapi-generator generate -i spec.yaml -g java -o ./generated
 
# Generate TypeScript client
openapi-generator generate -i spec.yaml -g typescript-angular -o ./generated

Swagger Codegen

# Generate Python client
swagger-codegen generate -i spec.yaml -l python -o ./generated
 
# Generate Go server
swagger-codegen generate -i spec.yaml -l go-server -o ./generated

API Mocking & Prototyping

WireMock

{
  "request": {
    "method": "GET",
    "url": "/api/users/1"
  },
  "response": {
    "status": 200,
    "jsonBody": {
      "id": 1,
      "name": "John Doe"
    }
  }
}

Mockoon

  • GUI Tool: Visual API mocking
  • Data Generation: Fake data generation
  • Recording: Record real API calls
  • Templating: Dynamic response templating

Prism

# Start mock server from OpenAPI spec
prism mock spec.yaml
 
# Validate requests against spec
prism proxy spec.yaml http://api.example.com

Performance Testing

Artillery

config:
  target: 'http://localhost:3000'
  phases:
    - duration: 60
      arrivalRate: 10
 
scenarios:
  - name: 'Get users'
    requests:
      - get:
          url: '/api/users'

k6

import http from 'k6/http';
import { check } from 'k6';
 
export let options = {
  vus: 10,
  duration: '30s',
};
 
export default function () {
  let response = http.get('http://localhost:3000/api/users');
  check(response, {
    'status is 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });
}

Development Best Practices

Project Structure

api/
├── controllers/
├── models/
├── routes/
├── middleware/
├── services/
├── tests/
├── docs/
└── config/

Error Handling

// Centralized error handling
app.use((error, req, res, next) => {
  console.error(error);
  
  if (error.type === 'VALIDATION_ERROR') {
    return res.status(400).json({ error: error.message });
  }
  
  res.status(500).json({ error: 'Internal server error' });
});

Validation

// Request validation middleware
const validateUser = (req, res, next) => {
  const { name, email } = req.body;
  
  if (!name || !email) {
    return res.status(400).json({ 
      error: 'Name and email are required' 
    });
  }
  
  next();
};

0 items under this folder.