PHPGraphQL与RESTfulAPI对比
PHP GraphQL与RESTful API对比
GraphQL和REST是两种不同的API设计风格。各有优缺点,选择哪种取决于项目需求。今天说说PHP中两种API的对比。
RESTful API示例。
```php
// REST: 多个端点返回固定结构
$router->get('/api/users', function () {
return json_encode(['users' => [['id' => 1, 'name' => '张三']]]);
});
$router->get('/api/users/{id}', function ($params) {
return json_encode(['user' => ['id' => $params['id'], 'name' => '用户']]);
});
$router->get('/api/users/{id}/orders', function ($params) {
return json_encode(['orders' => [['id' => 1, 'total' => 299.99]]]);
});
?>
GraphQL查询示例。
```php
// GraphQL: 单一端点,客户端指定需要的字段
// query {
// user(id: 1) {
// name
// email
// orders {
// total
// status
// }
// }
// }
function handleGraphQL(string $query): array
{
$schema = [
'user' => function ($args) {
$user = ['id' => 1, 'name' => '张三', 'email' => 'test@test.com'];
if (str_contains($query, 'orders')) {
$user['orders'] = [['id' => 1, 'total' => 299.99, 'status' => 'paid']];
}
return $user;
},
];
// 简化解析
return $schema['user'](['id' => 1]);
}
?>
对比示例。
```php
// REST: 获取用户和订单需要多次请求
// GET /api/users/1
// GET /api/users/1/orders
// GraphQL: 一次请求获取所有数据
// POST /graphql
// { user(id: 1) { name, email, orders { total, status } } }
function restStyle(int $userId): array
{
// 多次调用
$user = httpGet("/api/users/$userId");
$orders = httpGet("/api/users/$userId/orders");
return array_merge($user, ['orders' => $orders]);
}
function graphqlStyle(int $userId): array
{
// 一次调用
$query = "{ user(id: $userId) { name email orders { total status } } }";
return httpPost('/graphql', ['query' => $query]);
}
?>
选择合适的API风格。
```php
// REST适合的场景
// 简单的CRUD操作
// 缓存要求高
// 文件上传下载
// HATEOAS超媒体
// GraphQL适合的场景
// 复杂的数据关系
// 多种客户端(Web、移动端)
// 需要精确控制返回字段
// 快速迭代的产品
?>
PHP中实现GraphQL用webonyx/graphql-php库。REST用常规的框架路由即可。选择API风格要考虑团队熟悉度、客户端需求、性能要求等因素。没有绝对的好坏,适合项目的就是好的。
