PHP项目如何实现API接口?

wen java案例 2

本文目录导读:

PHP项目如何实现API接口?

  1. 原生PHP实现(适合小型项目)
  2. 使用框架(推荐主流方案)
  3. 核心实现要点
  4. 安全实现
  5. 最佳实践建议
  6. 选择建议
  7. 部署注意事项

在PHP项目中实现API接口,通常有以下几种主流方式,从简单到复杂:


原生PHP实现(适合小型项目)

基础路由和响应

// api.php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
// 简单的路由
$method = $_SERVER['REQUEST_METHOD'];
$path = $_SERVER['PATH_INFO'] ?? '/';
// 路由处理
switch($path) {
    case '/users':
        if($method === 'GET') {
            echo json_encode(['data' => ['user1', 'user2']]);
        }
        break;
    case '/users/create':
        if($method === 'POST') {
            $input = json_decode(file_get_contents('php://input'), true);
            echo json_encode(['message' => 'User created']);
        }
        break;
    default:
        http_response_code(404);
        echo json_encode(['error' => 'Not found']);
}

.htaccess 配置(Apache)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ api.php/$1 [QSA,L]

使用框架(推荐主流方案)

Laravel(最流行)

// routes/api.php
Route::apiResource('users', UserController::class);
// 自定义路由
Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
// 控制器
class UserController extends Controller {
    public function index() {
        return response()->json(User::all());
    }
    public function store(Request $request) {
        $user = User::create($request->validate([
            'name' => 'required|string',
            'email' => 'required|email|unique:users'
        ]));
        return response()->json($user, 201);
    }
}

Lumen(Laravel的轻量版)

// routes/web.php
$router->get('/users', 'UserController@index');
$router->post('/users', 'UserController@store');

Slim(极简微框架)

require 'vendor/autoload.php';
$app = new \Slim\App();
$app->get('/users', function ($request, $response) {
    return $response->withJson(['users' => []]);
});
$app->post('/users', function ($request, $response) {
    $data = $request->getParsedBody();
    return $response->withJson($data, 201);
});
$app->run();

核心实现要点

RESTful 设计规范

// 常见HTTP方法和用途
GET    /users          // 获取用户列表
GET    /users/1        // 获取单个用户
POST   /users          // 创建用户
PUT    /users/1        // 更新用户
DELETE /users/1        // 删除用户

请求处理

// 获取请求数据
$json = file_get_contents('php://input');
$data = json_decode($json, true);
// 获取查询参数
$page = $_GET['page'] ?? 1;
// 获取请求头
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';

响应格式

// 成功响应
{
    "status": "success",
    "data": {
        "id": 1,
        "name": "John"
    }
}
// 错误响应
{
    "status": "error",
    "message": "User not found",
    "code": 404
}

状态码规范

200 - OK
201 - Created
204 - No Content
400 - Bad Request
401 - Unauthorized
403 - Forbidden
404 - Not Found
422 - Unprocessable Entity
500 - Internal Server Error

安全实现

API认证(JWT示例)

// 生成Token
$payload = [
    'user_id' => 123,
    'exp' => time() + 3600 // 1小时过期
];
$token = JWT::encode($payload, $secretKey);
// 验证Token
try {
    $decoded = JWT::decode($token, $secretKey, ['HS256']);
    // 处理请求
} catch (\Exception $e) {
    http_response_code(401);
    echo json_encode(['error' => 'Invalid token']);
}

输入验证

function validateInput($data) {
    $errors = [];
    if (empty($data['email'])) {
        $errors['email'] = 'Email is required';
    }
    if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
        $errors['email'] = 'Invalid email format';
    }
    if (!empty($errors)) {
        http_response_code(422);
        echo json_encode(['errors' => $errors]);
        exit;
    }
}

速率限制(Rate Limiting)

// 简易实现
$ip = $_SERVER['REMOTE_ADDR'];
$cacheKey = "rate_limit:$ip";
$attempts = $cache->get($cacheKey) ?? 0;
if ($attempts >= 100) {
    http_response_code(429);
    echo json_encode(['error' => 'Too many requests']);
    exit;
}
$cache->set($cacheKey, $attempts + 1, 3600);

最佳实践建议

使用Composer管理依赖

{
    "require": {
        "slim/slim": "^4.0",
        "firebase/php-jwt": "^6.0",
        "php-di/php-di": "^7.0"
    }
}

数据库操作(PDO)

class UserAPI {
    private $db;
    public function __construct() {
        $this->db = new PDO('mysql:host=localhost;dbname=api_db', 'user', 'pass');
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    public function getUsers() {
        $stmt = $this->db->query('SELECT * FROM users');
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

错误处理

set_error_handler(function($severity, $message, $file, $line) {
    throw new \ErrorException($message, 0, $severity, $file, $line);
});
set_exception_handler(function($exception) {
    http_response_code(500);
    echo json_encode([
        'error' => 'Internal server error',
        'message' => $exception->getMessage()
    ]);
});

日志记录

function logApiCall($method, $path, $statusCode) {
    $log = [
        'timestamp' => date('Y-m-d H:i:s'),
        'method' => $method,
        'path' => $path,
        'status' => $statusCode,
        'ip' => $_SERVER['REMOTE_ADDR']
    ];
    file_put_contents('api.log', json_encode($log) . "\n", FILE_APPEND);
}

选择建议

场景 推荐方案
小型项目/快速原型 原生PHP 或 Slim
中型项目 Laravel 或 Lumen
企业级项目 Laravel
微服务架构 Lumen 或 Slim

部署注意事项

  1. 关闭错误显示display_errors = Off
  2. 启用HTTPS:强制使用SSL
  3. 设置CORS:按需配置跨域
  4. 使用.env:敏感信息不要硬编码
  5. 添加版本号/api/v1/users
  6. 文档生成:使用Swagger/OpenAPI

这样,你就能根据项目规模选择合适的方案来实现PHP API接口了。

抱歉,评论功能暂时关闭!