DEV Community

Montasser Mossallem
Montasser Mossallem

Posted on

Build a RESTful API in PHP Without a Framework

APIs allow software systems to talk to each other. A RESTful API follows a set of rules for structuring requests and responses. In this tutorial, you’ll learn how to build a simple REST API using plain PHP.

Table of Contents

  • What Is a RESTful API?
  • Project Setup
  • Directory Structure
  • Create the .htaccess File
  • Routing Requests
  • Build the Controller
  • Handle API Methods (GET, POST, PUT, DELETE)
  • Return JSON Responses
  • Test Your API
  • Conclusion

What Is a RESTful API?

REST stands for Representational State Transfer. A RESTful API uses standard HTTP methods to perform operations:

  • GET – fetch data
  • POST – add new data
  • PUT – update existing data
  • DELETE – remove data

Each request must return a structured response, usually in JSON format.

Project Setup

Create a new folder for the project:

mkdir php-rest-api
cd php-rest-api
Enter fullscreen mode Exit fullscreen mode

You need:

  • PHP 7.4+ (or 8.x)
  • Apache with mod_rewrite enabled
  • A tool like Postman for testing

Directory Structure

Create this structure:

php-rest-api/
├── api/
│   └── index.php
├── .htaccess
└── data.json
Enter fullscreen mode Exit fullscreen mode
  • index.php: main API logic
  • data.json: mock database
  • .htaccess: rewrite rules for clean URLs

Create the .htaccess File

Enable clean URLs and route all requests to index.php.

# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ api/index.php [QSA,L]
Make sure AllowOverride All is enabled in your Apache config.
Enter fullscreen mode Exit fullscreen mode

Routing Requests

In api/index.php, route requests by URL and method.

<?php

header("Content-Type: application/json");

$method = $_SERVER['REQUEST_METHOD'];
$request = explode("/", trim($_SERVER['PATH_INFO'] ?? '', "/"));

$resource = $request[0] ?? null;
$id = $request[1] ?? null;

require_once 'controller.php';

handleRequest($method, $resource, $id);
Enter fullscreen mode Exit fullscreen mode

Build the Controller

Create a controller.php file inside api/.

<?php

function handleRequest($method, $resource, $id) {
    if ($resource !== 'items') {
        http_response_code(404);
        echo json_encode(["error" => "Resource not found"]);
        return;
    }

    $data = json_decode(file_get_contents(__DIR__ . '/../data.json'), true);

    switch ($method) {
        case 'GET':
            if ($id === null) {
                echo json_encode($data);
            } else {
                $item = $data[$id] ?? null;
                if ($item) {
                    echo json_encode($item);
                } else {
                    http_response_code(404);
                    echo json_encode(["error" => "Item not found"]);
                }
            }
            break;

        case 'POST':
            $input = json_decode(file_get_contents("php://input"), true);
            $id = uniqid();
            $data[$id] = $input;
            file_put_contents(__DIR__ . '/../data.json', json_encode($data, JSON_PRETTY_PRINT));
            http_response_code(201);
            echo json_encode(["id" => $id]);
            break;

        case 'PUT':
            if ($id === null || !isset($data[$id])) {
                http_response_code(404);
                echo json_encode(["error" => "Item not found"]);
                return;
            }
            $input = json_decode(file_get_contents("php://input"), true);
            $data[$id] = $input;
            file_put_contents(__DIR__ . '/../data.json', json_encode($data, JSON_PRETTY_PRINT));
            echo json_encode(["success" => true]);
            break;

        case 'DELETE':
            if ($id === null || !isset($data[$id])) {
                http_response_code(404);
                echo json_encode(["error" => "Item not found"]);
                return;
            }
            unset($data[$id]);
            file_put_contents(__DIR__ . '/../data.json', json_encode($data, JSON_PRETTY_PRINT));
            echo json_encode(["success" => true]);
            break;

        default:
            http_response_code(405);
            echo json_encode(["error" => "Method not allowed"]);
    }
}
Enter fullscreen mode Exit fullscreen mode

Handle API Methods (GET, POST, PUT, DELETE)

Use tools like Postman or curl:
GET All Items

GET /items
Enter fullscreen mode Exit fullscreen mode

GET Single Item

GET /items/{id}
Enter fullscreen mode Exit fullscreen mode

POST New Item

POST /items
Content-Type: application/json

{
  "name": "New Item",
  "price": 10
}
Enter fullscreen mode Exit fullscreen mode

PUT Update Item

PUT /items/{id}
Content-Type: application/json

{
  "name": "Updated Item",
  "price": 20
}
Enter fullscreen mode Exit fullscreen mode

DELETE Item

DELETE /items/{id}
Enter fullscreen mode Exit fullscreen mode

Return JSON Responses

The API uses header("Content-Type: application/json") and echo json_encode(...) to return data in a machine-readable format.

Test Your API

You can test it using:

  • Postman: GUI tool for API testing
  • curl: command-line tool
  • JavaScript fetch() or Axios in the browser

Conclusion

You just built a fully working RESTful API in PHP. You handled routing, methods, and JSON responses—all without a framework. This is great for learning or small-scale projects.

Next steps:

  • Connect to a real database (MySQL or SQLite)
  • Add authentication (JWT, API key)
  • Add validation and error handling

Thank you for reading.

Resources

Top comments (0)