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)