概述
GraphQL 的概念
GraphQL 是一种用于 API 的查询语言和运行时环境。它是由 Facebook 于 2012 年开始内部使用,2015 年对外宣布开源。GraphQL 旨在解决 RESTful API 的一些限制,如需要多次请求才能获取完整数据、难以扩展、无法精确控制数据返回等。
GraphQL 是一种用于 API 的查询语言和运行时环境,旨在解决 RESTful API 的限制,如多次请求、数据冗余等问题。本文对比了 GraphQL 与 RESTful API 在数据获取、效率、缓存及可发现性等方面的差异,介绍了 GraphQL 的查询、变量、片段、操作名称及变更等基本语法。同时演示了在 .NET Core 项目中集成 GraphQL.Server 的具体步骤,包括安装依赖包、配置服务容器、定义 Schema 与解析器、启用 Playground 界面以及处理基本的查询请求,实现了简单的 GraphQL 接口功能。

GraphQL 是一种用于 API 的查询语言和运行时环境。它是由 Facebook 于 2012 年开始内部使用,2015 年对外宣布开源。GraphQL 旨在解决 RESTful API 的一些限制,如需要多次请求才能获取完整数据、难以扩展、无法精确控制数据返回等。
GraphQL 的核心理念是:客户端定义数据需要的结构及其关系,服务器返回与此结构相匹配的数据。因此,GraphQL 非常适用于前后端分离的应用,客户端可以精确地控制数据返回,提高了 API 的可靠性和灵活性。
GraphQL 具体应用场景如下:
GraphQL 的详细使用过程如下:
GraphQL 是一种强大而灵活的 API 开发工具,通过其独特的查询语言和运行时环境,可以大大提高 API 的可用性和灵活性,是 API 开发的一种重要的选择。
RESTful API 和 GraphQL 都是用于构建 Web API 的工具,但它们有一些不同的特点。
RESTful API 是基于 HTTP 的协议,使用 HTTP 动词(GET、POST、PUT、DELETE 等)来获取或修改数据。每个资源都有一个唯一的 URI,每个动词都对应一个特定的操作。RESTful API 的响应是基于请求中的 URI 和动词的,不能跨越这些边界。
GraphQL 使用单个端点来获取和修改数据,使用查询语言来指定所需的数据。GraphQL 允许客户端请求精确的数据,而不是只返回整个资源。
RESTful API 有一个缺点,就是当需要获取多个资源时,需要进行多个 HTTP 请求。这种'资源瀑布'的方式会导致多个请求的延迟和带宽消耗,限制了应用程序的性能。
GraphQL 允许在一个请求中获取多个资源,并且可以指定所需的字段和关系,避免了不必要的数据传输,更加高效。
RESTful API 通常使用 HTTP 标准的缓存机制(例如,使用 Last-Modified 和 ETag 头),以减少带宽和服务器负载。RESTful API 也支持版本控制,可以更好地管理 API 的变化。
GraphQL 没有内置的缓存机制,但可以使用其他缓存机制(例如,HTTP 缓存)来缓存 GraphQL 查询。版本控制通常由客户端管理,GraphQL 会返回错误,告知客户端如何修正查询。
RESTful API 和 GraphQL 各自有其优势,RESTful API 更容易理解和学习,而 GraphQL 更加灵活。
GraphQL 在数据获取方面更加强大和灵活,能够更好地适应复杂的数据需求。然而,由于 GraphQL 的语法较为复杂,开发人员需要更多的学习和编写时间。并且,GraphQL 还需要一个运行时,并且需要进行更严格的代码检查,使其更难以使用。
RESTful API 的资源 URI 的结构能够传达出 API 的基本结构。每个资源都必须在 API 文档中进行描述。
GraphQL 没有 URI 能够传达出 API 的结构,API 的可发现性需要通过不同的方式进行实现。例如,开发人员需要提供一个文档来描述所有可用的查询和变异操作。
RESTful API 和 GraphQL 各有优劣。选择哪种 API 取决于项目的需求。如果需要简单和可靠的 API,RESTful API 是一个不错的选择;如果需要快速、灵活、精确的数据获取方式,GraphQL 则是一个更好的选择。
GraphQL 是一种查询语言,用于 API 的编写和操作。以下是 GraphQL 的基本语法:
使用关键字'query'来声明查询类型,后面跟上查询的字段和参数。例如:
query {
person(id: "1") {
name
age
}
}
使用$符号来声明变量,可以在查询中重用变量。
例如:
query getPerson($id: ID!) {
person(id: $id) {
name
age
}
}
在执行时,需要提供变量的值。例如:
{
"id": "1"
}
可以在查询中使用片段来重用查询部分。片段以'…'开头,后面跟上片段名称。
例如:
query {
person(id: "1") {
name
age
address {
...addressFields
}
}
}
fragment addressFields on Address {
street
city
state
}
可以使用操作名称来标识查询,方便调试和追踪。操作名称在关键字'query'或'mutation'之后的花括号之间定义。
例如:
query getPerson($id: ID!) {
person(id: $id) {
name
age
}
}
使用关键字'mutation'来声明变更操作。变更可以用来进行数据的修改和创建。
例如:
mutation {
createPerson(name: "Sam", age: 25) {
id
name
age
}
}
以上是 GraphQL 的基本语法,还有更多高级特性和语法详情可以参考 GraphQL 官方文档。
安装包:GraphQL.Server.All
using GraphQL;
using GraphQL.Samples.Schemas.Chat;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddGraphQL(b => b
.AddAutoSchema<Query>() // schema
.AddSystemTextJson()); // serializer
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseDeveloperExceptionPage();
app.UseWebSockets();
app.UseGraphQL("/graphql"); // url to host GraphQL endpoint
app.UseGraphQLPlayground(
"/", // url to host Playground at
new GraphQL.Server.Ui.Playground.PlaygroundOptions
{
GraphQLEndPoint = "/graphql", // url of GraphQL endpoint
SubscriptionsEndPoint = "/graphql", // url of GraphQL endpoint
});
await app.RunAsync();
public class Query
{
public static string Hero() => "Luke Skywalker";
}
请求:
http://localhost:5001/graphql?query={hero}
响应:
{"data":{"hero":"Luke Skywalker"}}

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
暂无推荐文章,稍后可再来查看。
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online