如何在30分钟内用PHP编写REST API:实用指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么用PHP实现REST API既快又简单

\n\n

REST(表述性状态传递)是一种已成为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
\n\n

步骤1:配置项目结构和数据库

\n\n

首先,我们创建一个简单的文件夹结构。我们只需要一个PHP文件用于路由(index.php)和一个数据库配置文件(config.php)。

\n\n

项目结构

\n
rest-api-todo/\n│\n├── index.php        (主路由器)\n├── config.php       (数据库连接)\n└── .htaccess        (URL重写配置)
\n\n

创建MySQL数据库

\n

在phpMyAdmin或通过控制台执行以下SQL查询:

\n
CREATE 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\n

config.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并将请求转发到相应的函数。

\n\n

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                

博客

书籍推荐