当前位置: 首页 > 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.zskr.cn/news/1470930.html

相关文章:

  • 别再手动算均价了!封装一个通用的腾讯股票分时线分析工具函数
  • LIO-SAM建图总跑飞?别急着调参,先检查IMU内参和lidar_align外参标定
  • 保姆级教程:用CHARMM-GUI+Amber搞定膜蛋白体系建模(附lipid17力场配置)
  • 别再只用电阻分压了!实测5种UART电平转换方案,从成本到速度帮你选
  • 从设计稿到上线:手把手教你用uni-app封装一个可复用的“凸起TabBar”组件(附GitHub源码)
  • 企业数据中台建设,ETL工具选错了会踩哪些坑?
  • 智能汽车远程诊断核心:DoIP网关在AUTOSAR架构下的实现与配置指南
  • Qt状态栏别再只显示文字了!用QLabel实现进度条、超链接等高级玩法(附源码)
  • 手把手教你用MOS管搭建双向电平转换电路,搞定STM32与5V模块的UART通信
  • CMake的‘黑话’你都懂吗?一文搞懂CMAKE_SOURCE_DIR、PROJECT_BINARY_DIR等核心变量区别与实战用法
  • 模10模99计数器与分频器 Verilog Quartus
  • Zabbix Server日志里惊现MySQL连接错误?一个关于‘localhost’和Socket的深度误解与修复指南
  • Inspur服务器SSD硬盘灯不亮变红灯?可能是你的RAID阵列没把它‘算进去’
  • go 服务器下发wsam到客户端执行并返回结果的调试过程
  • 从《三体》智子到手机基站:用Python简单模拟电磁波传播的几种基本姿势
  • 告别单调气泡图!用R语言ggplot2手把手绘制桑吉气泡图(附clusterProfiler数据处理代码)
  • GIS数据处理实战:手把手教你用gdal2tiles为Leaflet地图准备TMS瓦片底图
  • 2026年靠谱的上海建筑沙盘模型/沙盘模型/建筑沙盘模型实力工厂推荐 - 行业平台推荐
  • 我的OpenMV 4 Plus内存爆了?手把手教你优化TensorFlow Lite模型,告别‘MemoryError’
  • 小程序毕业设计-基于微信小程序的博物馆文创系统的设计与实现基于springboot+微信小程序的博物馆文创系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • 2026年比较好的熔体计量泵挤出模具/静态混合器挤出模具/台州PVDF板材挤出模具深度厂家推荐 - 品牌宣传支持者
  • 信号处理入门必看:傅里叶级数的三种形式(三角、余弦、指数)到底该怎么选?
  • 国内淤泥脱水处理设备厂家实力排行及选型推荐 - 优质品牌商家
  • 避开这些坑,你的ADC0809多路采集才能准:硬件连接、时序与数据处理详解
  • 2026无人机清洗外墙服务有哪些品牌?绿阳高空清洗方案值得关注 - 华旭传媒
  • 自学还是报班,Java 转大模型的课程性价比深度分析
  • 2026年6月可靠韩国留学机构排行:新西兰留学机构/日本留学机构/澳大利亚留学机构/合规与服务能力盘点 - 优质品牌商家
  • 紧急预警:2024Q3起多地将强制执行《智能社区AI接口合规性新规》——你漏掉的这5个认证项正在导致项目搁浅
  • 2026 年,探秘高性价比电子记分牌领先源头厂家
  • 【实用教程】软碟通UltraISO下载安装及U盘启动盘制作全攻略