当前位置: 首页 > news >正文

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风格要考虑团队熟悉度、客户端需求、性能要求等因素。没有绝对的好坏,适合项目的就是好的。

http://www.jsqmd.com/news/959255/

相关文章:

  • LIO-SAM保姆级调试笔记:从IMU标定到地图保存的完整避坑指南
  • 别只调学习率了!聊聊对比学习和知识蒸馏里那个神秘的‘温度’参数T
  • 别再为网卡发愁!用普通PC+CODESYS软PLC驱动EtherCAT步进电机(保姆级避坑指南)
  • 从‘万能引用’到‘完美转发’:手把手教你用std::forward写出更优雅的C++模板库(附避坑指南)
  • 超越.pcb文件:为什么以及如何用Altium Designer生成Gerber文件交付板厂(附CAM350校验指南)
  • 别再暴力匹配了!用Horspool算法5分钟搞定字符串搜索(附C语言完整代码)
  • 别再手动算均价了!封装一个通用的腾讯股票分时线分析工具函数
  • 别再死记硬背了!图解GNN消息传递机制:从邻居聚合到节点嵌入的直观理解
  • LIO-SAM建图总跑飞?别急着调参,先检查IMU内参和lidar_align外参标定
  • 用C# WinForm从零撸一个HR系统(附完整源码):登录、考勤、员工档案管理实战
  • 别再死记硬背了!用生活中的例子秒懂Wi-Fi信号为啥时好时坏(直射/反射/绕射全解析)
  • 动手实验:用HackRF One或RTL-SDR搭建简易无线信道观测环境,直观感受电磁波的反射与散射
  • 西门子博图比较操作避坑指南:为什么你的‘值不在范围内’指令总是不触发?(基于TIA V17)
  • 别再直接读ADC了!手把手教你用STM32F103和LM358给PT100搭个高精度测温电路
  • 开源AI编程的安全性:MonkeyCode 容器沙箱隔离方案深度解析
  • 用PDDL给AI定规矩:手把手教你设计一个自动化的‘快递分拣’规划问题
  • 从CAN到以太网:汽车诊断网关(DoIP/DoCAN)的报文转换实战与配置要点
  • 从PLC到上位机:深入聊聊C#/Python中byte、char处理串口数据的那些坑
  • 别再只用电阻分压了!实测5种UART电平转换方案,从成本到速度帮你选
  • 安全实验室搭建笔记:如何用中兴ZXR10-3928A的端口镜像功能部署IDS
  • 保姆级教程:用CHARMM-GUI+Amber搞定膜蛋白体系建模(附lipid17力场配置)
  • 企业数据中台建设,ETL工具选错了会踩哪些坑?
  • 从裸机到RTOS:手把手教你用RT-Thread Nano在STM32上跑起第一个多线程LED闪烁程序
  • OpenCore Legacy Patcher:让老旧Mac焕发新生的5个关键步骤
  • 从设计稿到上线:手把手教你用uni-app封装一个可复用的“凸起TabBar”组件(附GitHub源码)
  • 从傅里叶到拉普拉斯:搞懂‘收敛域’才是信号分析入门的钥匙(避坑指南)
  • 信号系统学不动了?试试用Python的SymPy库5分钟搞定拉普拉斯变换(附常见信号变换表)
  • 智能汽车远程诊断核心:DoIP网关在AUTOSAR架构下的实现与配置指南
  • 2014-2026年我国POI兴趣点数据
  • Qt状态栏别再只显示文字了!用QLabel实现进度条、超链接等高级玩法(附源码)