模式切换
RESTful API 开发
使用 PHP 构建 API:基本的 RESTful 接口开发
定义 RESTful API 路由:
RESTful API 基于 HTTP 方法(GET、POST、PUT、DELETE 等)和资源路径定义操作。
php
// 简单的路由示例
$requestMethod = $_SERVER['REQUEST_METHOD'];
$requestPath = $_SERVER['REQUEST_URI'];
if ($requestMethod === 'GET' && $requestPath === '/api/users') {
// 处理获取所有用户的请求
} elseif ($requestMethod === 'POST' && $requestPath === '/api/users') {
// 处理创建新用户的请求
}
处理请求:
根据请求方法调用相应的处理逻辑。
php
switch ($requestMethod) {
case 'GET':
// 处理 GET 请求
break;
case 'POST':
// 处理 POST 请求
break;
case 'PUT':
// 处理 PUT 请求
break;
case 'DELETE':
// 处理 DELETE 请求
break;
default:
http_response_code(405); // 方法不允许
break;
}
返回响应:
设置 HTTP 状态码,并输出 JSON 数据。
php
header('Content-Type: application/json');
$response = ['status' => 'success', 'data' => $data];
echo json_encode($response);
数据格式:JSON 与 XML
JSON 格式:
JSON 是 RESTful API 最常用的数据格式,PHP 提供了 json_encode()
和 json_decode()
函数来处理 JSON 数据。
php
// 返回 JSON 响应
header('Content-Type: application/json');
$data = ['id' => 1, 'name' => 'John Doe'];
echo json_encode($data);
XML 格式:
虽然较少使用,XML 仍然在某些场景中被应用。可以使用 PHP 的 SimpleXML
来处理 XML 数据。
php
// 返回 XML 响应
header('Content-Type: application/xml');
$xml = new SimpleXMLElement('<user/>');
$xml->addChild('id', 1);
$xml->addChild('name', 'John Doe');
echo $xml->asXML();
数据格式协商:
根据 Accept
请求头决定返回数据的格式。
php
$accept = $_SERVER['HTTP_ACCEPT'];
if (strpos($accept, 'application/json') !== false) {
header('Content-Type: application/json');
echo json_encode($data);
} elseif (strpos($accept, 'application/xml') !== false) {
header('Content-Type: application/xml');
// 生成 XML 输出...
}
API 鉴权:JWT(JSON Web Token)
什么是 JWT:
JWT 是一种用于在各方之间安全传输信息的开放标准(RFC 7519),通常用于 API 的身份验证和授权。它包含三个部分:Header(头部)、Payload(负载)和 Signature(签名)。
生成 JWT:
使用 PHP 中的 firebase/php-jwt
库生成 JWT。
bash
composer require firebase/php-jwt
php
use \Firebase\JWT\JWT;
$key = "your_secret_key";
$payload = [
'iss' => 'http://example.org',
'aud' => 'http://example.com',
'iat' => time(),
'exp' => time() + 3600, // 1 小时过期
'user_id' => 1
];
$jwt = JWT::encode($payload, $key, 'HS256');
echo "JWT: " . $jwt;
验证 JWT:
验证客户端发送的 JWT,检查其有效性和签名。
php
try {
$decoded = JWT::decode($jwt, $key, ['HS256']);
$userId = $decoded->user_id;
// 继续处理 API 请求
} catch (Exception $e) {
// 无效的 JWT
http_response_code(401);
echo json_encode(['message' => 'Unauthorized']);
}
在请求中传递 JWT:
JWT 通常通过 HTTP 头部传递,例如 Authorization
头部。
http
Authorization: Bearer <JWT_TOKEN>
使用中间件进行身份验证:
创建一个中间件函数来检查 JWT 是否存在并有效。
php
function authenticate() {
$headers = apache_request_headers();
if (!isset($headers['Authorization'])) {
http_response_code(401);
exit(json_encode(['message' => 'Unauthorized']));
}
$jwt = str_replace('Bearer ', '', $headers['Authorization']);
try {
$decoded = JWT::decode($jwt, $key, ['HS256']);
// 设置当前用户信息
$GLOBALS['currentUser'] = $decoded->user_id;
} catch (Exception $e) {
http_response_code(401);
exit(json_encode(['message' => 'Unauthorized']));
}
}