PHP原生实现RESTful API的完整方法与代码示例

Aria
Aria
发布时间:2026-10-14| 4人浏览过
原创

RESTful API 是目前互联网应用中最主流的数据交互标准。它利用 HTTP 协议的标准化特性,将网络资源抽象为 URL,并通过 GET、POST、PUT、DELETE 等动词对资源执行增删改查操作。在 PHP 开发中,掌握原生 RESTful 接口的编写逻辑,不仅有助于优化服务端架构,也是理解现代前端与后端解耦模式的基础。

核心概念与设计理念

RESTful(Representational State Transfer)并非一种编程语言或框架,而是一种软件架构风格。其核心在于“资源”这一概念——任何可以被寻址的对象均可视为资源,如用户、订单或商品。RESTful API 强调无状态通信,即每个请求必须包含服务器理解该请求所需的所有信息,不依赖服务器的会话上下文。

标准的 RESTful 设计具备以下关键特征:

  • 客户端-服务器分离:数据存储与用户界面完全独立,提升了系统的可伸缩性。
  • 统一接口:所有资源均通过一组一致的 HTTP 方法进行交互,降低了开发复杂度。
  • 无状态:请求之间互不影响,服务器在处理完请求后立即断开连接,便于水平扩展。
  • 缓存支持:通过对响应设置适当的缓存头,可显著提高前端加载速度与系统性能。

操作顺序与路由分发

第1步:建立统一入口并识别请求属性

为了实现资源的统一管理,通常采用单入口文件(如 index.php)接收所有请求。在此阶段,主要目的是提取客户端的请求方法和访问路径,作为后续分支处理的依据。

  • 目的:标准化请求入口,捕获原始请求元数据。
  • 动作:读取 $_SERVER['REQUEST_URI'] 获取路径,读取 $_SERVER['REQUEST_METHOD'] 获取 HTTP 动词。
<?php
// 获取请求的URL路径和方法
$requestUrl = $_SERVER['REQUEST_URI'];
$requestMethod = $_SERVER['REQUEST_METHOD'];

// 基础的路由分发逻辑框架
if ($requestMethod === 'GET') {
    handleGetRequest($requestUrl);
} elseif ($requestMethod === 'POST') {
    handlePostRequest($requestUrl);
} else {
    // 其他方法将在后续步骤补充
}

第2步:使用GET方法获取单一或列表资源

GET 方法用于从服务器检索资源。在 URL 设计上,不带参数通常表示资源集合(如 /users),带参数则表示特定资源实例(如 /users/1)。

  • 判断逻辑:检查 URL 是否匹配正则表达式(例如 /\/users\/(\d+))。
  • 执行动作:根据正则捕获的用户 ID 查询数据;若未找到对应 ID,返回 404 状态码。
function handleGetRequest($requestUrl) {
    if ($requestUrl === '/users') {
        // 获取用户列表
        $users = ['user1', 'user2', 'user3'];
        sendResponse(200, $users);
    } elseif (preg_match('/\/users\/(\d+)/', $requestUrl, $matches)) {
        $userId = $matches[1];
        $user = getUserById($userId);
        if ($user) {
            sendResponse(200, $user);
        } else {
            sendResponse(404, 'User not found');
        }
    } else {
        sendResponse(404, 'Not Found');
    }
}

第3步:使用POST方法创建新资源

POST 方法用于向服务器提交数据以创建新的资源。典型的场景是注册新用户。

  • 输入来源:通常从 $_POST 数组或 JSON Body 中获取用户输入的字段(如用户名)。
  • 返回结果:创建成功后,通常返回 201 Created 状态码,并在响应体中包含新资源的信息。
function handlePostRequest($requestUrl) {
    if ($requestUrl === '/users') {
        // 简单模拟表单提交获取数据
        $username = isset($_POST['username']) ? $_POST['username'] : '';
        
        // TODO: 插入数据库逻辑
        
        sendResponse(201, 'User created successfully');
    } else {
        sendResponse(404, 'Not Found');
    }
}

第4步:使用PUT方法更新现有资源

PUT 方法用于替换指定资源的当前表示。这要求 URL 中必须包含资源的唯一标识符(ID)。

  • 校验前置条件:首先验证资源是否存在,只有存在的记录才允许被覆盖更新。
  • 动作:解析 ID,查找对应记录并写入新值,成功后返回确认消息。
function handlePutRequest($requestUrl) {
    if (preg_match('/\/users\/(\d+)/', $requestUrl, $matches)) {
        $userId = $matches[1];
        $existingUser = getUserById($userId);
        
        if ($existingUser) {
            // TODO: 执行数据库更新逻辑
            sendResponse(200, 'User updated successfully');
        } else {
            sendResponse(404, 'User not found');
        }
    } else {
        sendResponse(404, 'Not Found');
    }
}

第5步:使用DELETE方法移除资源

DELETE 方法指示服务器删除指定的资源。出于安全考虑,生产环境通常会增加额外的鉴权中间件,但底层逻辑依然是基于 ID 定位并清除记录。

function handleDeleteRequest($requestUrl) {
    if (preg_match('/\/users\/(\d+)/', $requestUrl, $matches)) {
        $userId = $matches[1];
        $user = getUserById($userId);
        
        if ($user) {
            // TODO: 执行数据库删除逻辑
            sendResponse(200, 'User deleted successfully');
        } else {
            sendResponse(404, 'User not found');
        }
    } else {
        sendResponse(404, 'Not Found');
    }
}

完整的运行代码

为了便于直接测试和集成,以下是整合了上述所有逻辑的单文件实现。请注意,getUserById 在当前示例中使用内存数组模拟数据库查询,实际部署时应替换为真实的数据库连接与 ORM 调用。

<?php
// 全局路由配置
$requestUrl = $_SERVER['REQUEST_URI'];
$requestMethod = $_SERVER['REQUEST_METHOD'];

// 统一请求入口
switch ($requestMethod) {
    case 'GET':
        handleGetRequest($requestUrl);
        break;
    case 'POST':
        handlePostRequest($requestUrl);
        break;
    case 'PUT':
        handlePutRequest($requestUrl);
        break;
    case 'DELETE':
        handleDeleteRequest($requestUrl);
        break;
    default:
        sendResponse(405, 'Method Not Allowed');
        break;
}

// --- 功能函数定义区域 ---

function handleGetRequest($requestUrl) {
    if ($requestUrl === '/users') {
        $users = ['user1', 'user2', 'user3'];
        sendResponse(200, $users);
    } elseif (preg_match('/\/users\/(\d+)/', $requestUrl, $matches)) {
        $userId = $matches[1];
        $user = getUserById($userId);
        if ($user) {
            sendResponse(200, $user);
        } else {
            sendResponse(404, 'User not found');
        }
    } else {
        sendResponse(404, 'Not Found');
    }
}

function handlePostRequest($requestUrl) {
    if ($requestUrl === '/users') {
        $username = $_POST['username'] ?? '';
        sendResponse(201, 'User created successfully');
    } else {
        sendResponse(404, 'Not Found');
    }
}

function handlePutRequest($requestUrl) {
    if (preg_match('/\/users\/(\d+)/', $requestUrl, $matches)) {
        $userId = $matches[1];
        $user = getUserById($userId);
        if ($user) {
            sendResponse(200, 'User updated successfully');
        } else {
            sendResponse(404, 'User not found');
        }
    } else {
        sendResponse(404, 'Not Found');
    }
}

function handleDeleteRequest($requestUrl) {
    if (preg_match('/\/users\/(\d+)/', $requestUrl, $matches)) {
        $userId = $matches[1];
        $user = getUserById($userId);
        if ($user) {
            sendResponse(200, 'User deleted successfully');
        } else {
            sendResponse(404, 'User not found');
        }
    } else {
        sendResponse(404, 'Not Found');
    }
}

// 模拟数据源
function getUserById($userId) {
    $database = [
        1 => 'user1',
        2 => 'user2',
        3 => 'user3'
    ];
    return isset($database[$userId]) ? $database[$userId] : null;
}

// 统一的响应格式处理
function sendResponse($statusCode, $data) {
    header('Content-Type: application/json');
    http_response_code($statusCode);
    echo json_encode($data);
    exit;
}

以上就是PHP中RESTful API使用方法详解的详细内容,更多关于PHP RESTful API技术的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。