使用PHP构建简单的REST API
REST API 是现代 Web 开发的核心技术之一。目前,大多数 Web 应用程序通常以单页应用程序(SPA)的形式开发,并通过后端 API 提供支持。这些 API 可以用多种编程语言实现。在 PHP 生态系统中,Laravel/Lumen 和 Symfony 的 API 平台是构建 REST API 的常用框架。这些框架提供了丰富的工具来处理请求、生成正确的 HTTP 状态代码响应,以及解决身份验证、请求验证、数据转换、分页等常见问题。
然而,对于简单的 API,我们并不总是需要复杂的框架支持。在本文中,我们将从零开始,使用 PHP 构建一个简单但安全的 REST API,并通过 Okta 作为授权提供商实现客户端凭据流,确保 API 的安全性。
创建 REST API 的 PHP 项目骨架
首先,我们需要为项目创建基本的文件结构。在项目根目录下创建一个 /src 目录,并添加一个简单的 composer.json 文件。我们将使用 DotEnv 库来管理环境变量,例如 Okta 的身份验证信息。
配置自动加载器
在 composer.json 文件中配置 PSR-4 自动加载器,以便自动加载 /src 目录中的 PHP 类。完成后,运行以下命令安装依赖项:
composer install
安装完成后,项目中会生成一个 /vendor 目录,并安装 DotEnv 依赖项。接下来,为项目创建一个 .gitignore 文件,确保 /vendor 目录和 .env 文件不会被提交到代码仓库。
配置环境变量
创建一个 .env.example 文件,用于存储 Okta 身份验证所需的变量模板。同时,创建一个 .env 文件,用于存储实际的 Okta 凭据信息。为了加载这些环境变量,我们需要创建一个 bootstrap.php 文件:
require_once __DIR__ . '/../vendor/autoload.php';
$dotenv = DotenvDotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();
配置数据库
我们将使用 MySQL 作为 API 的数据库。首先,为应用程序创建一个新的数据库和用户。接着,创建一个名为 Person 的表,用于存储用户信息。表结构如下:
idfirstnamelastnamefirstparent_idsecondparent_id
以下是创建表的 SQL 语句:
CREATE TABLE Person (
id INT AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(255) NOT NULL,
lastname VARCHAR(255) NOT NULL,
firstparent_id INT DEFAULT NULL,
secondparent_id INT DEFAULT NULL
);
将数据库连接信息添加到 .env.example 文件中,并在 .env 文件中填写实际的数据库凭据。
数据库连接类
创建一个 PHP 类用于管理数据库连接,并在 bootstrap.php 文件中初始化连接:
class Database {
private $connection;
public function __construct() {
$this->connection = new PDO(
'mysql:host=' . $_ENV['DB_HOST'] . ';dbname=' . $_ENV['DB_NAME'],
$_ENV['DB_USER'],
$_ENV['DB_PASSWORD']
);
}
public function getConnection() {
return $this->connection;
}
}
为 Person 表添加网关类
在面向对象编程中,有多种方式与数据库交互。对于简单的 API,我们可以使用表网关模式。创建一个 PersonGateway 类,包含以下方法:
- 获取所有记录
- 获取特定记录
- 添加新记录
- 更新记录
- 删除记录
以下是 PersonGateway 类的示例代码:
class PersonGateway {
private $db;
public function __construct($db) {
$this->db = $db;
}
public function getAll() {
$stmt = $this->db->query("SELECT * FROM Person");
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public function getById($id) {
$stmt = $this->db->prepare("SELECT * FROM Person WHERE id = :id");
$stmt->execute(['id' => $id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
public function create($data) {
$stmt = $this->db->prepare("INSERT INTO Person (firstname, lastname) VALUES (:firstname, :lastname)");
$stmt->execute($data);
}
public function update($id, $data) {
$stmt = $this->db->prepare("UPDATE Person SET firstname = :firstname, lastname = :lastname WHERE id = :id");
$stmt->execute(array_merge($data, ['id' => $id]));
}
public function delete($id) {
$stmt = $this->db->prepare("DELETE FROM Person WHERE id = :id");
$stmt->execute(['id' => $id]);
}
}
实现 PHP REST API
我们将创建以下 REST API 端点:
GET /persons:获取所有用户GET /persons/{id}:获取特定用户POST /persons:创建新用户PUT /persons/{id}:更新用户DELETE /persons/{id}:删除用户
在项目的 /public 目录下创建一个 index.php 文件作为前端控制器,并在 src/controller 目录下创建 PersonController.php 来处理具体的 API 请求。
使用 OAuth 2.0 保护 API
为了保护 API,我们将使用 Okta 作为授权服务器,并实现客户端凭据流。以下是身份验证的基本流程:
- 客户端应用程序持有客户端 ID 和密钥。
- 客户端将凭据传递给 Okta,获取访问令牌。
- 客户端使用访问令牌向 API 服务器发送请求。
- API 服务器验证令牌的有效性,并根据结果提供资源或返回 401 错误。
配置 Okta
使用 Okta CLI 创建 OAuth 2.0 服务应用程序,并将生成的凭据添加到 .env 文件中。确保在 Okta 管理控制台中为 API 添加所需的作用域。
构建测试客户端应用程序
为了测试 API,我们将创建一个简单的命令行客户端应用程序。该客户端将从 .env 文件中读取 Okta 的详细信息,获取访问令牌,并调用 API 端点。
以下是测试客户端的示例代码:
$token = getAccessToken();
$response = callApi('/persons', $token);
function getAccessToken() {
// 使用 Okta 凭据获取访问令牌
}
function callApi($endpoint, $token) {
// 使用 cURL 调用 API
}
运行客户端脚本即可测试 API 的功能。
总结
通过本文的步骤,我们从零开始构建了一个简单的 PHP REST API,并使用 Okta 实现了安全性。完整的代码可以在 GitHub 示例仓库 中找到。如果您想深入了解相关技术,可以参考以下资源:
原文链接: https://developer.okta.com/blog/2019/03/08/simple-rest-api-php
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- Python应用 | 网易云音乐热评API获取教程
- 22条API设计的最佳实践
- 低成本航空公司的分销革命:如何通过API实现高效连接与服务
- 实时聊天搭建服务:如何打造令人着迷的社交媒体体验?
- 简化API缩写:应用程序编程接口终极指南
- Mono Creditworthy API 集成指南|实时评估用户信用状况
- Gcore 收购 StackPath WAAP,增强全球边缘Web应用与API安全能力
- 免费IPv6地址查询接口推荐
- 什么是Unified API?基于未来集成的访问
- 使用JWT和Lambda授权器保护AWS API网关:Clerk实践指南
- 宠物领养服务:如何帮流浪毛孩找到温馨的新家?
- Python调用IP地址归属地查询API教程