GraphQL vs REST 在 C# 中:2024 年为您的 API 选择哪一个

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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\n

REST(表述性状态转移) 是一种我们都熟悉和喜爱的架构风格。在 C# 中,您很可能使用 ASP.NET Core Web API。您创建控制器、端点,每个端点返回固定的数据结构。想要获取用户?访问 /api/users/1。想要获取他的订单?访问 /api/users/1/orders。简单、可预测,但常常导致过度获取(获取多余数据)或获取不足(需要多次请求)。

\n\n

GraphQL 是一种由 Facebook 开发的查询语言。在 C# 世界中,它通过 Hot Chocolate(最流行)或 GraphQL.NET 等库来实现。您只有一个端点(通常是 /graphql),客户端自己决定需要哪些字段。想要用户名和第一个订单?没问题!没有过度获取。

\n\n

实践比较:C# 代码

\n\n

让我们从理论转向代码。假设我们有一个简单的模型:User 和 Order。

\n\n
// 数据模型\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。

\n\n

基于 Hot Chocolate 的 GraphQL API 示例

\n\n
public 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 数组。没有多余数据。完美!

\n\n

什么时候 C# 中的 REST 胜出(这很正常)

\n\n

1. 简单性和缓存。 REST API 很容易在 HTTP 层面(CDN、代理)进行缓存。对 /api/products 的 GET 请求可以被缓存,并且所有

博客

书籍推荐