GraphQL vs REST 在 C# 中:巨人之战还是根据任务选择工具?
\n\n大家好,同行们!如果您使用 C# 编写代码并创建 API,那么“REST 还是 GraphQL?”这个问题肯定不止一次出现过。这就像争论哪个更好:锤子还是螺丝刀。两者都是工具,但适用于不同的任务。在本文中,我们不会狂热地捍卫某一种技术,而是冷静地、通过 C# 代码示例来分析,什么时候 GraphQL 胜出,什么时候老牌的 REST 仍然是王者。
\n\n我们是 PythonLib 团队,虽然名字里有“Python”,但我们热爱 .NET 和 C# 生态系统。今天,我们将深入 C# API 的世界,弄清楚如何避免选择失误。开始吧!
\n\n快速入门:面向 C# 开发者的 REST 和 GraphQL
\n\nREST(表述性状态转移) 是一种我们都熟悉和喜爱的架构风格。在 C# 中,您很可能使用 ASP.NET Core Web API。您创建控制器、端点,每个端点返回固定的数据结构。想要获取用户?访问 /api/users/1。想要获取他的订单?访问 /api/users/1/orders。简单、可预测,但常常导致过度获取(获取多余数据)或获取不足(需要多次请求)。
GraphQL 是一种由 Facebook 开发的查询语言。在 C# 世界中,它通过 Hot Chocolate(最流行)或 GraphQL.NET 等库来实现。您只有一个端点(通常是 /graphql),客户端自己决定需要哪些字段。想要用户名和第一个订单?没问题!没有过度获取。
实践比较:C# 代码
\n\n让我们从理论转向代码。假设我们有一个简单的模型:User 和 Order。
// 数据模型\npublic class User\n{\n public int Id { get; set; }\n public string Name { get; set; }\n public string Email { get; set; }\n public string Phone { get; set; }\n public List<Order> Orders { get; set; }\n}\n\npublic class Order\n{\n public int Id { get; set; }\n public string ProductName { get; set; }\n public decimal Price { get; set; }\n public DateTime CreatedAt { get; set; }\n}\n\n\n基于 ASP.NET Core 的 REST API 示例
\n\n[ApiController]\n[Route("api/[controller]")]\npublic class UsersController : ControllerBase\n{\n [HttpGet("{id}")]\n public async Task<ActionResult<User>> GetUser(int id)\n {\n // 假设数据来自数据库\n var user = await _dbContext.Users.FindAsync(id);\n if (user == null) return NotFound();\n return Ok(user); // 返回所有字段:Id, Name, Email, Phone, Orders\n }\n}\n\n\n问题?如果客户端只需要姓名和邮箱,它仍然会收到 Phone 和 Orders。而如果需要订单,则必须单独请求 /api/users/1/orders。
基于 Hot Chocolate 的 GraphQL API 示例
\n\npublic class Query\n{\n public async Task<User> GetUser(int id, [Service] AppDbContext dbContext)\n {\n return await dbContext.Users.FindAsync(id);\n }\n}\n\n// 在 Program.cs 中注册\nbuilder.Services\n .AddGraphQLServer()\n .AddQueryType<Query>();\n\n\n现在客户端可以精确请求所需内容:
\n\n// GraphQL 查询\n{\n user(id: 1) {\n name\n email\n orders {\n productName\n price\n }\n }\n}\n\n\n响应将只包含 name、email 以及包含 productName 和 price 字段的 orders 数组。没有多余数据。完美!
什么时候 C# 中的 REST 胜出(这很正常)
\n\n1. 简单性和缓存。 REST API 很容易在 HTTP 层面(CDN、代理)进行缓存。对 /api/products 的 GET 请求可以被缓存,并且所有