前言

以前需要提供Web服务接口的时候,除了标准的WEBAPI形式,还考虑了OData、GraphQL等形式,虽然实现思路上有很大的区别,但对使用方来说,都是将查询的主动权让渡给了前端,让调用方能够更加自由地发挥或者符合自己要求的数据。其中,OData作为传统REST WEBAPI的拓展,对外还是WEBAPI的形式,为了照顾到和第三方对接的兼容性,我最终使用了OData作为首选技术。

OData在使用上方便性不言而喻,简直爱不释手,不过逐渐也发现一个问题:Mock不方便!前端常用的比如json-schema-faker无法识别OData的标记,返回的内容依旧是传统API返回的内容(无法输出@odata之类的内容)。

P.S. 最近还非常烦恼和OData一起使用EF Core时,由于有导航属性(Navigation Property),mock框架会循环引用导致Maximum call stack size exceeded的问题。一直没有找好办法,如果有朋友知道,还请不吝赐教。

于是和调用方的扯皮一直延续,最后还是先上线了后台暂时处理了这个问题。最近有一个想法浮到水面:反正mock是不可能mock了,调用方已经要恨死我了,就干脆点直接WebAPI形式也不要了,摊牌了。

GraphQL

GraphQL是Facebook推出的一项提供数据API的语言,和WEBAPI相比较,它有一些自己的特点,详细介绍可以看这里,最吸引我的地方,就是请求API可以一步到位,处理一些逻辑的时候,简单的一个API请求就可以得到所有的数据(当然使用OData的expand等查询也可以达到类似的效果),而且描述语言也比较简洁。这样调用方可以精确描述自己需要什么,接口返回不多不少刚刚好的数据,优雅!

关于GraphQL的介绍,可以查看其他文章,不是本文的重点。

体验

使用GraphQL,.NET支持的有很多库,比较流行的,有GraphQL.NET和HotChocolate,作为一个肥宅,我就选HotChocolate作为主要使用的库,直接使用nuget安装即可。

install-package HotChocolate.AspNetCore

新建一个新的ASP.NET CORE空项目,添加HotChocolate.AspNetCore的nuget包,然后定义以下数据结构

public class Class
{
public string Name { get; set; }
public Teacher Teacher{get;set;}
}
public class Student
{
public string Realname { get; set; } public Class Class{get;set;}
}
public class Teacher
{
public string Realname { get; set; }
public bool IsSupervisor{get;set;}
}

描述一个班级,教师和学生的关系,如果是REST API的话,一般需要三个接口表述三种不同的资源。GraphQL只有一个Endpoint,这个就比较简单了。

接下来定义暴露的接口:

using System.Collections.Generic;

using System.Linq;

namespace Demo
{
public class Query
{
private List<Student> GetStudents()
{
List<Student> students = new List<Student>();
students.Add(new Student
{
Realname = "ZHANGSAN",
Class = new Class
{
Name = "GAOSAN",
Teacher = new Teacher { Realname = "LISI", IsSupervisor = false }
}
});
students.Add(new Student
{
Realname = "ZHANGSAN2",
Class = new Class
{
Name = "GAOSAN1",
Teacher = new Teacher { Realname = "LISI", IsSupervisor = true }
}
});
return students;
}
public IEnumerable<Student> StudentInfo(string name)
{
if(string.IsNullOrWhiteSpace(name)) return GetStudents();
return GetStudents().Where(w=>w.Realname == name);
}
}
}

提供了一个StudentInfo可以对外接口。

public void ConfigureServices(IServiceCollection services)
{
services.AddGraphQLServer().AddQueryType<Query>();
} //在configure中
app.UseEndpoints(endpoints =>
{
endpoints.MapGraphQL();
});

然后然后直接F5运行,访问HotChocolate自带的分析器地址:http://localhost:5000/graphql/



直接查询即可得到结果,换一种查询条件:



可以发现,GraphQL返回的内容是可以由调用方进行定义的,你要啥它给啥,不用的字段你不写就不返回。很多时候,只要一次查询就能完成多次普通WebAPI请求才能达到的目标。(这个例子还不能表现出这个特点,有机会以后补充)。

补充

如果调用方不会GraphQL的话,不建议轻易上这个技术,因为他们来一句“这不是标准WEBAPI或者Webservice,我们调不了。”就把你噎死了。好多歹说就算终于上了,你还需要告诉清楚他们每一个接口的请求内容,这就纯粹给自己找事,体验太不好了。

在.NET中体验GraphQL的更多相关文章

  1. ASP.NET Core中使用GraphQL - 最终章 Data Loader

    ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...

  2. 在Docker中体验数据库之Microsoft SQL Server

    前面记录了一下在docker中体验mongodb和mysql.今天记录一下mssql……其实早就体验了,就是没有记录,前几天看了一下2019的一些新闻,很喜欢Polybase这个特性,想体验一把,可惜 ...

  3. ASP.NET Core中使用GraphQL - 第一章 Hello World

    前言 你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL. GraphQL提供了一种声明式的方式从服务器拉取数据.你可以从GraphQL官网中了解到GraphQL的所有优点.在这一系 ...

  4. ASP.NET Core中使用GraphQL - 第二章 中间件

    前文:ASP.NET Core中使用GraphQL - 第一章 Hello World 中间件 如果你熟悉ASP.NET Core的中间件,你可能会注意到之前的博客中我们已经使用了一个中间件, app ...

  5. ASP.NET Core中使用GraphQL - 第三章 依赖注入

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 SOL ...

  6. ASP.NET Core中使用GraphQL - 第四章 GraphiQL

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  7. ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  8. ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  9. ASP.NET Core中使用GraphQL - 第七章 Mutation

    ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...

随机推荐

  1. (四)React Ant Design Pro + .Net5 WebApi:PostgreSQL数据库环境搭建

    一.简介 PostgreSQL,开源数据库(没听过小伙伴自己反思一下自行百度) PgAdmin,官方提供的数据库管理工具. 二.环境 1. 官网下载包,安装数据库 tar xjvf /app/pack ...

  2. pandas数据分析API常用操作

    1.导入数据 df = pd.read_csv( # 该参数为数据在电脑中的路径,可以不填写 filepath_or_buffer='/Users/Weidu/Desktop/sz000002.csv ...

  3. 2V升3.3V芯片,输出500MA,低功耗10uA解决方案

    2V的输入电压其实非常少,一般都是镍氢电池1.2V,干电池1.5V,来给玩具,MCU单片机,模块啊,等等供电.不过2V的供电电源或者设备确实是不常见的. 一般2V升3.3V,需要升压芯片PW5100即 ...

  4. 特征预处理之归一化&标准化

    写在前面 这篇博客的主要内容 应用MinMaxScaler实现对特征数据进行归一化 应用StandardScaler实现对特征数据进行标准化 特征预处理 定义 ​ 通过一些转换函数将特征数据转换成更加 ...

  5. 图解 | 原来这就是TCP

    你是一台电脑,你的名字叫 A 经过<图解 | 原来这就是网络>这篇文章中的一番折腾,只要你知道另一位伙伴 B 的 IP 地址,且你们之间的网络是通的,无论多远,你都可以将一个数据包发送给你 ...

  6. 微服务网关1-Spring Cloud Gateway简介

    一.网关基本概念 1.API网关介绍 ​ API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各 ...

  7. MySQL ---- 锁知识

    锁 我们知道mysql中支持很多个存储引擎,在不同的存储引擎下所能支持的锁是不同的,我们通过MyISAM和InnoDB来进行一下对比. 表级锁定(table-level) ​ 表级别的锁定是MySQL ...

  8. django 组件 自定义过滤器 自定义标签 静态文件配置

    组件 将一些功能标签写在一个html文件里,这个文件作为一个组件,如果那个文件需要就直接拿过来使用即可: 这是title.html文件,写了一个导航栏,作为一个公用的组件 <div style= ...

  9. 转 12 jmeter性能测试实战--web程序

    12 jmeter性能测试实战--web程序   项目背景 项目:XX网站环境:Windows需求:并发登录的性能测试场景:1s增加2个线程,运行2000次(线程数20,Ramp-Up seconds ...

  10. (012)每日SQL学习:TO_CHAR(DATE,FORMAT)

    SYSDATE 2009-6-16 15:25:10 TRUNC(SYSDATE) 2009-6-16 TO_CHAR(SYSDATE,'YYYYMMDD') 20090616 到日 TO_CHAR( ...