引言:为什么用PHP实现REST API既快又简单
\n\nREST(表述性状态传递)是一种已成为Web服务标准的架构风格。许多初学者开发者害怕实现API,认为这是一项复杂的任务。实际上,如果遵循正确的结构,用PHP编写一个完整的REST API只需30分钟。
\n\n在本指南中,我们将创建一个简单但功能完整的任务管理(To-Do List)API。您将学习如何处理HTTP方法(GET、POST、PUT、DELETE)、使用JSON以及构建路由。所有代码示例均可直接运行。
\n\n阅读后您将获得:
\n- \n
- 一个无需框架、基于纯PHP的工作REST API \n
- 对RESTful架构原则的理解 \n
- 一个可用于项目扩展的现成结构 \n
步骤1:配置项目结构和数据库
\n\n首先,我们创建一个简单的文件夹结构。我们只需要一个PHP文件用于路由(index.php)和一个数据库配置文件(config.php)。
项目结构
\nrest-api-todo/\n│\n├── index.php (主路由器)\n├── config.php (数据库连接)\n└── .htaccess (URL重写配置)\n\n创建MySQL数据库
\n在phpMyAdmin或通过控制台执行以下SQL查询:
\nCREATE DATABASE todo_api;\n\nUSE todo_api;\n\nCREATE TABLE tasks (\n id INT AUTO_INCREMENT PRIMARY KEY,\n title VARCHAR(255) NOT NULL,\n completed BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nINSERT INTO tasks (title) VALUES \n('学习PHP'), \n('编写REST API'), \n('发布文章');\n\nconfig.php文件
\n<?php\n// config.php\nheader('Content-Type: application/json');\nheader('Access-Control-Allow-Origin: *');\nheader('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');\nheader('Access-Control-Allow-Headers: Content-Type');\n\n$host = 'localhost';\n$dbname = 'todo_api';\n$username = 'root';\n$password = '';\n\ntry {\n $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);\n $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch(PDOException $e) {\n echo json_encode(['error' => '数据库连接错误:' . $e->getMessage()]);\n exit;\n}\n?>\n\n步骤2:创建单一入口点(路由器)
\n\n在index.php文件中,我们实现路由功能。它将处理URL并将请求转发到相应的函数。
index.php文件(完整代码)
\n<?php\nrequire_once 'config.php';\n\n$method = $_SERVER['REQUEST_METHOD'];\n$request = explode('/', trim($_SERVER['PATH_INFO'] ?? '/', '/'));\n\n// 如果传入了任务ID,则获取它\n$id = isset($request[0]) && is_numeric($request[0]) ? (int)$request[0] : null;\n\n// 处理不同的HTTP方法\nswitch($method) {\n case 'GET':\n if ($id) {\n getTask($pdo, $id);\n } else {\n getTasks($pdo);\n }\n break;\n \n case 'POST':\n createTask($pdo);\n break;\n \n case 'PUT':\n if ($id) {\n updateTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => '未指定任务ID']);\n }\n break;\n \n case 'DELETE':\n if ($id) {\n deleteTask($pdo, $id);\n } else {\n http_response_code(400);\n echo json_encode(['error' => '未指定任务ID']);\n }\n break;\n \n default:\n http_response_code(405);\n echo json_encode(['error' => '不支持的方法']);\n}\n\n// --- 函数实现 ---\n\nfunction getTasks($pdo) {\n $stmt = $pdo->query("SELECT * FROM tasks ORDER BY created_a