PHP API 接口开发与调用方法详解
API(应用程序编程接口)是现代Web开发中不可或缺的一部分。PHP作为一种流行的服务器端脚本语言,常被用来构建RESTful API。本文将详细介绍如何使用PHP开发API接口,以及如何调用这些接口。无论你是初学者还是有经验的开发者,都能从中获得实用的知识和技巧。
一、什么是API接口
API接口允许不同的软件系统之间进行通信。在Web开发中,API通常通过HTTP协议暴露端点(Endpoint),客户端发送请求(GET、POST、PUT、DELETE等),服务器返回响应数据(通常为JSON或XML格式)。PHP API开发的核心任务是处理请求、验证数据、操作数据库并返回格式化结果。
二、PHP API接口开发步骤
1. 基础环境准备
确保你的服务器安装了PHP(建议5.6以上版本)和Web服务器(如Apache或Nginx)。还需要一个数据库(如MySQL)用于存储数据。以下是一个简单的项目结构示例:
/api
├── index.php # 入口文件(路由)
├── config.php # 数据库配置
├── db.php # 数据库连接
├── models/
│ └── User.php # 用户模型
└── controllers/
└── UserController.php # 用户控制器2. 创建数据库表
假设我们开发一个用户管理API,需要一张用户表。执行以下SQL语句:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `email` varchar(100) NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 数据库连接配置
在 config.php 中定义数据库常量:
<?php
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'api_demo');
define('DB_USER', 'root');
define('DB_PASS', 'password');
?>在 db.php 中封装PDO连接:
<?php
require_once 'config.php';
function getDB() {
static $db = null;
if ($db === null) {
try {
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4';
$db = new PDO($dsn, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Database connection failed']);
exit;
}
}
return $db;
}
?>4. 设计路由入口
在 index.php 中解析请求URI,分发到对应控制器:
<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
require_once 'db.php';
$method = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
// 移除查询字符串和基础路径
$uri = parse_url($uri, PHP_URL_PATH);
$uri = rtrim($uri, '/');
$segments = explode('/', trim($uri, '/'));
// 假设基础路径为 /api/index.php,路径格式为 /resource[/id]
$resource = $segments[1] ?? ''; // 例如 'users'
$id = $segments[2] ?? null;
switch ($resource) {
case 'users':
require_once 'controllers/UserController.php';
$controller = new UserController();
if ($id) {
// 处理单个资源
switch ($method) {
case 'GET': $controller->show($id); break;
case 'PUT': $controller->update($id); break;
case 'DELETE': $controller->destroy($id); break;
default: http_response_code(405); echo json_encode(['error' => 'Method not allowed']); break;
}
} else {
// 处理资源集合
switch ($method) {
case 'GET': $controller->index(); break;
case 'POST': $controller->store(); break;
default: http_response_code(405); echo json_encode(['error' => 'Method not allowed']); break;
}
}
break;
default:
http_response_code(404);
echo json_encode(['error' => 'Resource not found']);
break;
}
?>5. 编写控制器
UserController.php 实现了CRUD方法。以获取用户列表和创建用户为例:
<?php
class UserController {
private $db;
public function __construct() {
$this->db = getDB();
}
// GET /users
public function index() {
try {
$stmt = $this->db->query('SELECT id, username, email, created_at FROM users');
$users = $stmt->fetchAll();
echo json_encode(['data' => $users]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['error' => 'Internal server error']);
}
}
// POST /users
public function store() {
$input = json_decode(file_get_contents('php://input'), true);
// 简单验证
if (empty($input['username']) || empty($input['email'])) {
http_response_code(400);
echo json_encode(['error' => 'Username and email are required']);
return;
}
// 检查邮箱格式
if (!filter_var($input['email'], FILTER_VALIDATE_EMAIL)) {
http_response_code(400);
echo json_encode(['error' => 'Invalid email format']);
return;
}
try {
$stmt = $this->db->prepare('INSERT INTO users (username, email) VALUES (:username, :email)');
$stmt->execute([
':username' => htmlspecialchars($input['username'], ENT_QUOTES, 'UTF-8'),
':email' => $input['email']
]);
$newId = $this->db->lastInsertId();
// 返回新创建的资源
$stmt = $this->db->prepare('SELECT id, username, email, created_at FROM users WHERE id = ?');
$stmt->execute([$newId]);
$user = $stmt->fetch();
http_response_code(201);
echo json_encode(['data' => $user]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['error' => 'Creation failed']);
}
}
// 其他方法(show, update, destroy)类似,此处省略
}
?>6. 配置URL重写
为了使用友好的URL(例如 /api/users 而不是 /api/index.php/users),需要在Apache中启用mod_rewrite并创建 .htaccess 文件。Nginx用户则需配置 try_files。以下为Apache的配置示例:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /api/index.php [QSA,L]三、PHP API接口调用方法
开发好API后,客户端可以通过多种方式调用。最常用的是使用PHP的cURL库或 file_get_contents 函数。此外,还可以使用Postman等工具测试。下面介绍纯PHP客户端的调用方式。
1. 使用cURL进行GET请求
<?php
$url = 'http://your-domain.com/api/users';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json'
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$data = json_decode($response, true);
echo 'HTTP状态码: ' . $httpCode . PHP_EOL;
print_r($data);
}
curl_close($ch);
?>2. 使用cURL进行POST请求
<?php
$url = 'http://your-domain.com/api/users';
$payload = json_encode([
'username' => 'testuser',
'email' => 'test@ippipp.com'
]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($payload)
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo 'HTTP状态码: ' . $httpCode . PHP_EOL;
$result = json_decode($response, true);
print_r($result);
?>3. 使用file_get_contents进行PUT请求
发起PUT请求需要设置stream context:
<?php
$url = 'http://your-domain.com/api/users/1'; // 更新ID为1的用户
$payload = json_encode([
'username' => 'updated_user',
'email' => 'updated@ippipp.com'
]);
$options = [
'http' => [
'method' => 'PUT',
'header' => "Content-Type: application/json\r\n" .
"Accept: application/json\r\n" .
"Content-Length: " . strlen($payload) . "\r\n",
'content' => $payload
]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$httpCode = $http_response_header ? (int)substr($http_response_header[0], 9, 3) : 0;
echo 'HTTP状态码: ' . $httpCode . PHP_EOL;
$result = json_decode($response, true);
print_r($result);
?>4. DELETE请求示例
<?php $url = 'http://your-domain.com/api/users/1'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo 'HTTP状态码: ' . $httpCode . PHP_EOL; echo '响应内容: ' . $response; ?>
四、API安全性建议
开发API时必须考虑安全措施:
- 身份验证:使用API密钥、OAuth2或JWT(JSON Web Token)验证客户端身份。
- 数据验证:始终验证和消毒输入数据,防止SQL注入和XSS攻击。
- 速率限制:限制同一IP在单位时间内的请求次数,防止滥用。
- HTTPS:强制使用HTTPS加密传输数据。
- CORS配置:仔细设置跨域资源共享策略,只允许受信任的来源。
一个简单的JWT中间件示例(假设使用firebase/php-jwt库):
<?php
require_once 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
function authenticate() {
$headers = getallheaders();
$authHeader = $headers['Authorization'] ?? '';
if (!preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) {
http_response_code(401);
echo json_encode(['error' => 'Missing or invalid token']);
exit;
}
$token = $matches[1];
$secretKey = 'your-secret-key';
try {
$decoded = JWT::decode($token, new Key($secretKey, 'HS256'));
return $decoded->user_id; // 返回用户ID
} catch (Exception $e) {
http_response_code(401);
echo json_encode(['error' => 'Token invalid or expired']);
exit;
}
}
?>在控制器中调用 $userId = authenticate(); 即可获取当前用户身份。
五、常见问题与调试
- 获取不到请求体:确保使用了
file_get_contents('php://input')且Content-Type为application/json。 - 中文乱码:在输出JSON前设置
header('Content-Type: application/json; charset=utf-8');,并确保数据库字符集为utf8mb4。 - 跨域问题:在API入口添加CORS头,如本文示例所示。
- 调试技巧:使用Postman或Insomnia工具测试API接口,查看请求和响应详情。
六、总结
本文详细介绍了PHP API接口的开发流程,包括环境搭建、数据库配置、路由设计、控制器编写、URL重写等,同时也展示了使用cURL和 file_get_contents 调用API的多种方法。最后讨论了安全性和调试要点。掌握这些知识后,你可以构建出健壮且易用的PHP RESTful API。实际项目中建议使用成熟的框架(如Laravel、Symfony)来加速开发,但理解底层原理有助于你更灵活地解决问题。希望这篇文章对你的PHP API开发之旅有所帮助。