.NET使用Graphql的演示——新一代的API交互
创作时间:
作者:
@小白创作中心
.NET使用Graphql的演示——新一代的API交互
引用
1
来源
1.
https://www.cnblogs.com/weskynet/p/18471829
GraphQL是什么?先来一段AI给的回答:
GraphQL是一种为API设计的查询语言,与REST相比,它提供了更高效、强大和灵活的方法来与数据交互。GraphQL由Facebook于2012年开发,并于2015年开源。其主要的优势在于能够允许客户端精确地指定他们需要的数据,从而避免了过度获取或数据不足的问题。
主要特性
- 精确获取需要的数据:客户端可以精确指定需要的数据字段,避免过度获取或数据不足的问题。
- 单一端点:所有数据请求都通过一个统一的端点进行,简化了API的使用。
- 类型系统:使用类型系统来定义数据结构,增强了数据的可读性和可维护性。
- 查询与修改:支持查询(Query)、修改(Mutation)和订阅(Subscription)三种操作类型。
- 实时数据(Subscription):支持实时数据推送,可以实现类似WebSocket的效果。
优势和局限
优势:
- 减少数据传输:只返回客户端请求的数据,减少了不必要的数据传输。
- 减少请求数:多个数据需求可以在单一查询中解决,减少了网络请求次数。
- 灵活性高:客户端可以自由构造查询,无需服务器频繁更新API。
局限:
- 复杂查询性能问题:如果不加限制地进行深度查询或大规模的数据嵌套,可能会对服务器性能造成影响。
- 缓存策略:相比于REST的URL级别缓存,GraphQL需要更复杂的缓存策略来优化性能。
- 学习曲线:对于开发者来说,需要学习新的查询语法及其底层实现。
接下来,我们通过一个实际的项目演示,展示如何在.NET中使用GraphQL进行API交互。
服务端实现
- 创建一个Web API项目作为服务端,添加必要的NuGet包:
- 新建Queries文件夹,用来存放查询使用的类和方法。例如,新增一个测试用的类和string类型返回值的方法
Hello()
:
public class TestQuery
{
public string Hello() => "Hello, GraphQL!";
}
- 在启动项或Program.cs中,添加GraphQL服务,并注册Query类型:
builder.Services
.AddGraphQLServer()
.AddQueryType<TestQuery>();
- 映射GraphQL端点:
app.MapGraphQL();
运行程序后,可以通过GraphQL Playground进行查询测试。例如,在浏览器中访问http://localhost:5264/graphql/
,输入查询语句:
query {
hello
}
客户端实现
- 创建一个控制台项目作为客户端,添加必要的NuGet包:
<PackageReference Include="GraphQL.Client" Version="4.6.1" />
<PackageReference Include="GraphQL.Client.Serializer.Newtonsoft" Version="4.6.1" />
- 在客户端代码中,创建GraphQL客户端并发送查询请求:
var client = new GraphQLHttpClient("http://localhost:5264/graphql", new NewtonsoftJsonSerializer());
var request = new GraphQLRequest
{
Query = @"query {
hello
}"
};
var response = await client.SendQueryAsync<HelloResponse>(request);
Console.WriteLine(response.Data.Hello);
拓展演示
接下来,我们演示如何处理嵌套实体类和复杂查询。例如,创建一个包含子集合的实体类:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address
{
public string City { get; set; }
public string Street { get; set; }
}
在查询时,可以灵活地选择需要的字段:
query {
person {
name
addresses {
city
}
}
}
修改操作(Mutation)
- 新建Mutations文件夹,用来存放增删改操作的类。例如,创建一个测试用的Mutation类:
public class TestMutation
{
public bool OtherOperation(OtherOperationInput input)
{
// 模拟业务操作
return true;
}
}
public class OtherOperationInput
{
public string Address { get; set; }
public string City { get; set; }
public string Phone { get; set; }
}
- 在Program.cs中注册Mutation类型:
builder.Services
.AddGraphQLServer()
.AddMutationType<TestMutation>();
- 在客户端发送Mutation请求:
var request = new GraphQLRequest
{
Query = @"mutation{
otherOperation(info:{address:""龙岗区宝龙街道"",city:""大大大深圳"",phone:""10100011""})
}"
};
var response = await client.SendQueryAsync<object>(request);
Console.WriteLine(response.Data);
数据推送和订阅(Subscription)
- 新建Subscriptions文件夹,用来存放所有与消息推送和订阅相关的定义类。例如,创建一个测试用的Subscription类:
public class TestSub
{
public IObservable<string> OnTestPublish([EventStreamConnection] IEventStreamConnection connection)
{
return connection.ToObservable<string>();
}
}
- 在服务端注册Subscription类型:
builder.Services
.AddGraphQLServer()
.AddSubscriptionType<TestSub>()
.AddInMemorySubscriptions(); // 默认消息持久化(生产情况建议更换)
- 在客户端实现订阅:
var option = new GraphQLHttpClientOptions
{
EndPoint = new Uri("http://localhost:5264/graphql"),
WebSocketEndPoint = new Uri("ws://localhost:5264/graphql")
};
using var client = new GraphQLHttpClient(option, new NewtonsoftJsonSerializer());
var subscriptionRequest = new GraphQLRequest
{
Query = @"
subscription {
onTestPublish
}"
};
var subscriptionStream = client.CreateSubscriptionStream<OnTestPublishResponse>(subscriptionRequest);
var subscription = subscriptionStream.Subscribe(
response =>
{
if (response.Errors != null)
{
Console.WriteLine("Error occurred: " + response.Errors);
}
else
{
Console.WriteLine($"Received message: {response.Data.OnTestPublish}");
}
},
error => Console.WriteLine($"Subscription error: {error.Message}"),
() => Console.WriteLine("Subscription completed."));
需要注意的是,使用AddInMemorySubscriptions
方法在生产环境中存在一些问题,例如可扩展性差、数据持久性缺失等。在生产环境中,建议使用基于Redis的持久化方案。
通过以上步骤,我们完成了在.NET中使用GraphQL进行API交互的完整演示,包括查询、修改和订阅等核心功能。GraphQL的灵活性和强大功能使其成为现代API开发的重要选择之一。
热门推荐
年夜饭的习俗:古代除夕八大传统民俗及年夜饭的渊源和寓意
红烧肉(香料版)
济南五院招聘神经内科博士,高学历人才成医院刚需
选对神经内科医生:6大要素助你做出明智选择
解码神经内科:一个主治医师的从业之路与专业心得
如何正确手写借条?详细格式指南助你避免纠纷
警惕网络借贷新陷阱:AB贷债务纠纷如何避免?
75元游亚洲最大跨国瀑布,德天景区推门票优惠
灼口综合征患者的“心灵按摩”:心理治疗助你摆脱口腔烧灼之苦
灼口综合征新疗法:激光治疗了解一下?
沈奇乐医生教你吃出健康,告别灼口综合征
秋游湖州:邂逅大闸蟹的美味之旅
湖州千张包:百年传承的江南美味
昭通市智慧社区治理新亮点:全科网格+AI赋能,打造基层治理新模式
智慧社区建设:基层治理的新引擎
“141”体系与“数字民情”:基层治理的智慧双翼
2024年就业率排名:计算机跌出前排,能源动力工程登顶
排骨汤的健康益处与食用建议
牛排骨和啥一起煲汤最好?有你吃的吗?
猪脚饭:美容养颜的秘密武器
上海发布最新口罩佩戴规定!这些场所必须戴口罩
3M口罩正确佩戴指南:四步打造安全防护
玻璃酸钠注射:髋关节炎治疗的新选择
髋关节康复训练,游泳竟然是最佳选择?
注塑机常见故障及维修方法 学会这些自己动手也能修!
茯苓泡水:利水渗湿、健脾安神,女性养生的日常饮品
茯苓的8种养生搭配方案,这样吃效果最好
【盘点】肩关节疼痛常见的 7 种疾病
7月新能源车市:理想L9车机最流畅,智界S7智能化断层领先
元旦抢票神器大比拼:铁路12306 vs 携程 vs 智行 vs 飞猪