如何在30分钟内用PHP编写REST API
REST API(Representational State Transfer)是一种分布式应用程序组件在网络中交互的架构风格。在现代Web开发中,REST API是创建移动应用后端、SPA(单页应用)和微服务的标准。本文将向您展示如何在短短30分钟内用PHP编写一个简单但功能完整的REST API。
我们将创建一个支持CRUD操作(创建、读取、更新、删除)的任务列表(Todo List)管理API。您将学习如何组织路由、处理JSON请求以及连接MySQL数据库。
环境准备
您需要准备以下工具:
- 支持PHP 7.4+的Apache或Nginx Web服务器
- MySQL或MariaDB
- 代码编辑器(VS Code、PhpStorm)
- 用于测试API的Postman或curl
创建项目结构:
todo-api/├── index.php # 入口点(路由器)├── config.php # 数据库连接配置├── api/│ └── tasks.php # 任务处理逻辑└── .htaccess # URL重写配置步骤1:配置.htaccess和入口点
创建.htaccess文件,将所有请求重定向到index.php:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php?url=$1 [QSA,L]现在创建我们的主路由器index.php:
<?phpheader("Content-Type: application/json; charset=UTF-8");header("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");header("Access-Control-Allow-Headers: Content-Type, Authorization");
// 处理预检请求if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit();}
require_once 'config.php';require_once 'api/tasks.php';
$url = isset($_GET['url']) ? rtrim($_GET['url'], '/') : '';$urlParts = explode('/', $url);$resource = $urlParts[0] ?? '';$id = $urlParts[1] ?? null;
switch ($resource) { case 'tasks': $tasks = new Tasks(); echo $tasks->handleRequest($_SERVER['REQUEST_METHOD'], $id); break; default: http_response_code(404); echo json_encode(["message" => "Resource not found"]); break;}?>步骤2:连接数据库
创建包含连接配置的config.php:
<?phpclass Database { private $host = "localhost"; private $db_name = "todo_api"; private $username = "root"; private $password = ""; public $conn;
public function getConnection() { $this->conn = null; try { $this->conn = new PDO( "mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password ); $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { http_response_code(500); echo json_encode(["message" => "Database connection error"]); exit(); } return $this->conn; }}?>在MySQL中创建表:
CREATE DATABASE todo_api;USE todo_api;
CREATE TABLE tasks ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT, status ENUM('pending', 'completed') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);步骤3:实现CRUD操作
创建包含主要逻辑的文件api/tasks.php: