Graphql是什么
阅读目录
- GraphQL是什么
- .net下如何运用GraphQL
- 运用GraphQL调用Github api
- 结语
一、Graphql是什么
最近在折腾使用Github api做个微信小程序练练手,本篇文章就是在这个过程中记录。
直接先看下GraphQL的语法风格,感受一下:
query {repository(owner:"octocat", name:"Hello-World") {id} }
这是最最最简单的一个运用示例,效果上等价于http://graphqlapi.xxx.com/query/repository?owner=octocat&name=Hello-World ,返回的内容格式是这样:
![](/assets/blank.gif)
{"data": {"repository": {"id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5"}} }
![](/assets/blank.gif)
再看下稍微复杂点的查询方式:
![](/assets/blank.gif)
query {repository(owner:"octocat", name:"Hello-World") {issues(last:20, states:CLOSED) {edges {node {titleurllabels(first:5) {edges {node {name}}}}}}} }
![](/assets/blank.gif)
这是一个多级对象嵌套的查询,这里就不继续展开了。关于egde和node在下文会有少许讲解。对GraphQL有兴趣进行更深入了解的可以自行研究学习,我自己也是刚入门,不坑大家了:),官网是http://graphql.org/(这个可能打不开,可以打开国内的地址http://graphql.cn),Facebook发布的规范在 http://facebook.github.io/graphql/October2016/。
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
二、.net下如何运用GraphQL
由于我需要做一个定时任务将github上的数据定时拉到本地,所以自然的选择了后端处理的方式。找了一下.net下的GraphQL客户端,用了这个graphql-client。代码如下:
![](/assets/blank.gif)
var heroRequest = new GraphQLRequest{Query = graphql //这里填写query的内容。};var graphQLClient = new GraphQLClient("https://api.github.com/graphql");graphQLClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Safari", "537.36")); //上面这行很关键,UserAgent一定要写上,要不然会出现403错误,花了好久才找到这个问题。graphQLClient.DefaultRequestHeaders.Add("Authorization", "bearer token"); //这里的token是个占位,实际需要在Github上生成。 var graphQLResponse = graphQLClient.PostAsync(heroRequest).Result;
![](/assets/blank.gif)
关于token的生成以及其它的一些环境准备工作,在github上有详细的描述,参见:https://developer.github.com/v4/guides/forming-calls/#authenticating-with-graphql。
重要的事情说3遍:UserAgent一定要写上!! UserAgent一定要写上!! UserAgent一定要写上!!
三、运用GraphQL调用Github api
Github提供的API和相关文档在https://developer.github.com/v4/ 右侧的目录树上,这次笔者需要拉取github的大量repository库,所以用到的search接口(但是很奇怪,这个接口在文档中并没有列出来,也不知道为什么)。建议大家可以先在Github提供的explorer中先测试和验证,OK了在把代码写到实际的项目中。
接着,笔者在实现自己需要的功能时又学习了2个概念,才能正常开展下面的工作。第一个是edge与node的概念,edge可以理解为一个分页对象,其中除了包含实际的数据外还有一个cursor(返回的每条数据的唯一标识,如果要分页的话用得到这个数据,配合before与after关键字来使用)字段,实际数据就是用node表示的。
另外GraphQL是强类型的,所以当笔者用到的search返回的结果并不是一个明确的数据对象时,先需要通过node下的__typename字段来获得实际的对象是什么。代码如下:
![](/assets/blank.gif)
query {search(query:"language:c#",type:REPOSITORY,first:1){edges{cursor,node{__typename}}} }
![](/assets/blank.gif)
得到的结果是:
![](/assets/blank.gif)
{"data": {"search": www.078881.cn {"edges": [{"cursor": "Y3Vyc29yOjE=","node":www.feifanyule.cn {"__typename": "Repository"}}]}} }
![](/assets/blank.gif)
得到的实际的数据对象是Repository之后,通过查阅Github Api的文档得到该对象有哪些字段,并且从中选择需要的字段即可。这个就是GraphQL的设计天然优势之一,按需获取。单在接下去运用的时候又需要引入一个新的概念fragment,这个可以理解为一个模板,通过这个模板来向服务端指明需要获取的数据字段。代码如下:
![](/assets/blank.gif)
fragment repFragment on Repository {name,forkCount,url,createdAt,updatedAt,licenseInfo{ //对象嵌套nickname www.feifanyule.cn //licenseInfo的nickname字段},stargazers{ www.yongxinzaixian.cn/ //对象嵌套totalCount //stargazers的totalCount字段} }query {search(query:www.thqpt.com/ "language:c#",type:REPOSITORY,first:100){edges{cursor,www.fencaiyule.cnnode{__typename...repFragment}}} }
![](/assets/blank.gif)
好了,这样就得到我需要的结果了。
下面附上笔者做的Demo:https://www.leyou2.net .com/ZacharyFan/GitHubRanking,其中的token在配置文件中自行替换即可。
四、结语
最后附带提一下,GraphQL的出现,主要的场景还是在于赋能前端开发,赋予了前端开发者自由组织和定制请求数据的能力。这是一个将前后端分离后的界限偏向前端的框架,所以直接在前端通过GraphQL访问后端数据是个人比较推崇的方式。目前前端非常火热的GraphQL框架也不少,主流的就是下面2个: apollo(https://github.com/apollographql/apollo-client)、relay(https://github.com/facebook/relay)。
GraphQL虽好,但是要真正在中大型项目中运用GraphQL,还有有很大的困难的,服务端需要支持到GraphQL的规范格式进行数据输出,我认为需要付出的成本可不小。哪怕的架设一层中间层,也需要解决诸如分发、聚合和性能等问题。
Graphql是什么相关推荐
- 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能
相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询 自APIJSON发 ...
- 【译】GraphQL vs. REST
原文地址:GraphQL vs. REST 原文作者:Sashko Stubailo 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:wilsonandus ...
- fcm和firebase_我如何最终使Netlify Functions,Firebase和GraphQL一起工作
fcm和firebase In a previous post I confessed defeat in attempting to get an AWS Lambda GraphQL server ...
- 如何使用FaunaDB + GraphQL
I have one or two projects I maintain on Netlify, in addition to hosting my blog there. It's an easy ...
- 我希望支持JavaScript GraphQL实现的API
The GraphQL schema language is great! It is certainly the best way to communicate anything about a G ...
- graphql是什么_为什么GraphQL是避免技术债务的关键
graphql是什么 GraphQL (not to be confused with GraphDB or Open Graph or even an actual graph) is a rema ...
- graphql_普通英语GraphQL指南
graphql by Luis Aguilar 路易斯·阿吉拉尔(Luis Aguilar) 普通英语GraphQL指南 (A Guide to GraphQL in Plain English) 您 ...
- react 错误边界_React with GraphQL和错误边界中的自定义错误页面
react 错误边界 by Abi Noda 通过Abi Noda React with GraphQL和错误边界中的自定义错误页面 (Custom error pages in React with ...
- java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器
java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...
- graphql redux_如何在Redux应用程序中使用GraphQL
graphql redux by Howon Song 通过宋颂恩 如何在Redux应用程序中使用GraphQL (How to use GraphQL in your Redux app) Fetc ...
最新文章
- web报表移动端如何进行移动设备绑定与撤销
- 【目标检测系列】CNN中的目标多尺度处理方法
- android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...
- [Android1.6]继承BaseAdapter为GridView设置数据时设置setLayoutParams时注意
- 二进制(bit)整数
- python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...
- java上机面试题 039_深入 Java 虚拟机之面试总结篇
- Lady Bird
- python-scrapy简单爬虫实现
- mysql配置后无法在dos里运行
- oracle中exists和in的比较
- windows安装adb工具
- C语言怎么算n维向量的加法,3D数学读书笔记——向量运算及在c++上的实现
- 微信小程序名称、简称设置规范
- 99行Swift完成Markdown在线编辑服务器
- c盘满了怎么清理垃圾而不误删?教你瞬间多出20个G
- Docker 挂载Volume数据卷
- mysql ndb_MySQL NDB Cluster概述
- Python中的运算符与表达式 1
- 恒指期货实盘记录及下周行情分析!