一、Graphql是什么
最近在折腾使用Github api做个微信小程序练练手,本篇文章就是在这个过程中记录。
直接先看下GraphQL的语法风格,感受一下:
query { repository(owner:"octocat", name:"Hello-World") { id } }
这是最最最简单的一个运用示例,效果上等价于http://graphqlapi.xxx.com/query/repository?owner=octocat&name=Hello-World ,返回的内容格式是这样:
{ "data": { "repository": { "id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5" } } }
再看下稍微复杂点的查询方式:
query { repository(owner:"octocat", name:"Hello-World") { issues(last:20, states:CLOSED) { edges { node { title url labels(first:5) { edges { node { name } } } } } } } }
这是一个多级对象嵌套的查询,这里就不继续展开了。关于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。代码如下:
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;
关于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字段来获得实际的对象是什么。代码如下:
query { search(query:"language:c#",type:REPOSITORY,first:1){ edges{ cursor, node{ __typename } } } }
得到的结果是:
{ "data": { "search": { "edges": [ { "cursor": "Y3Vyc29yOjE=", "node": { "__typename": "Repository" } } ] } } }
得到的实际的数据对象是Repository之后,通过查阅Github Api的文档得到该对象有哪些字段,并且从中选择需要的字段即可。这个就是GraphQL的设计天然优势之一,按需获取。单在接下去运用的时候又需要引入一个新的概念fragment,这个可以理解为一个模板,通过这个模板来向服务端指明需要获取的数据字段。代码如下:
fragment repFragment on Repository { name, forkCount, url, createdAt, updatedAt, licenseInfo{ //对象嵌套 nickname //licenseInfo的nickname字段 }, stargazers{ //对象嵌套 totalCount //stargazers的totalCount字段 } } query { search(query:"language:c#",type:REPOSITORY,first:100){ edges{ cursor, node{ __typename ...repFragment } } } }
好了,这样就得到我需要的结果了。
下面附上笔者做的Demo:https://github.com/ZacharyFan/GitHubRanking,其中的token在配置文件中自行替换即可。
四、结语
最后附带提一下,GraphQL的出现,主要的场景还是在于赋能前端开发,赋予了前端开发者自由组织和定制请求数据的能力。这是一个将前后端分离后的界限偏向前端的框架,所以直接在前端通过GraphQL访问后端数据是个人比较推崇的方式。目前前端非常火热的GraphQL框架也不少,主流的就是下面2个: apollo(https://github.com/apollographql/apollo-client)、relay(https://github.com/facebook/relay)。
GraphQL虽好,但是要真正在中大型项目中运用GraphQL,还有有很大的困难的,服务端需要支持到GraphQL的规范格式进行数据输出,我认为需要付出的成本可不小。哪怕的架设一层中间层,也需要解决诸如分发、聚合和性能等问题。
作者:Zachary_Fan
出处:http://www.cnblogs.com/Zachary-Fan/p/CsharpGraphql.html
如果你想及时得到个人自写文章的消息推送,欢迎扫描下面的二维码~。
相关推荐
python调用github api ,http://api.github.com,查看仓库信息
Swift PM模块,名为"OctoDog",是一个专门为开发者设计的工具,用于通过Swift编程语言方便、高效地访问GitHub API。Swift Package Manager (Swift PM) 是Apple推出的一个用于管理Swift项目依赖关系的工具,它使得...
本文将提供C#编码示例,以介绍GitHub API的一些更常见的功能。
一个简单的React应用程序,使用带有纯HTTP请求的GitHub GraphQL API。 。 产品特点 使用create-react-app进行React 16 GitHub GraphQL API 使用纯JS来使用GraphQL 没有阿波罗/中继 安装 git clone git@github....
在这个名为"SwiftUI-Combine-master"的示例项目中,我们将深入探讨如何将SwiftUI与Combine框架结合,利用GitHub API来创建一个实际的应用。 首先,SwiftUI是Apple的声明式用户界面框架,它允许开发者通过简单的、...
节点-Github-GraphQL GitHub GraphQL HTTP包装器目录安装npm install node-github-graphql --save基本范例var GithubGraphQLApi = require ( 'node-github-graphql' )var github = new GithubGraphQLApi ( { token :...
它是一个使用和流行的笔记本查询GraphQL API时示例和提示的存储库。 它提供了有关使用优雅的库和熊猫进行数据收集和交互式数据浏览的示例。 pyquery-ql还是轻量级Python GraphQL客户端的早期原型。 它基于Python ...
graphql.github.io, 在 graphql.org,GraphQL文档 组织gh页面部署 master 分支,因此在这个 source 分支上发生了积极的开发。站点是用JS和 site/ 中的Markdown 文件编写的。站点 Chrome 都在 site/_core/ 中的JS文件...
它基于对GraphQL Github API V4的查询。 为什么 对于表情符号! :thumbs_up: :thumbs_down: :grinning_face_with_smiling_eyes: :confused_face: :red_heart_selector: :party_popper: 如何运行示例 将文件...
在C#中直接调用OpenGL API可以为开发者提供更底层的图形控制能力,实现复杂的图形渲染和交互。本篇文章将深入探讨如何在C#环境中封装并使用OpenGL API。 首先,为了在C#中调用OpenGL,我们需要一个桥接库,如OpenTK...
一个React + Apollo + GraphQL GitHub客户端 产品特点 使用create-react-app进行React 16 React灵敏 React路由器4 带有GitHub GraphQL API的Apollo 使用渲染道具进行查询和变异 乐观更新 分页 乐观获取(例如问题...
Go-github库是Go语言中一个非常重要的工具,它为开发者提供了一个方便、高效的方式来访问GitHub API。这个库使得在Go应用中与GitHub平台进行交互变得简单,支持各种操作,如浏览用户、仓库、问题、拉取请求、标签、...
GitHub Graphql-使用Fetch API发送请求 如何使用 const gh = require ( 'fetch-github-graphq' ) gh ( token , `query` , { variables } ) 安装 这是通过提供的模块。 可以使用或命令行工具进行安装。 npm install...
它支持复杂的查询,可以一次获取多个资源的相关信息,极大地提高了开发者的效率。 ### PyGithubQL功能特性 1. **简单易用的接口**:PyGithubQL提供了一种Pythonic的方式来构造和执行GraphQL查询,使得与GitHub API...
Bootcamp GraphQL自动化测试使用GraphQL进行自动化的API测试以涵盖来自GitHub的端点以下技术堆栈正在使用:python pytest设置: 开放式终端运行git clone https://github.com/RafalRymek/graphql_github_tests克隆...
适用于Github API的GraphQL服务器 总览 基本的GraphQL服务器,它包装了Github Users API端点。 创建了一个User架构和相应的Query架构,以使用查询中提供的username获取用户的Github用户数据。 发展历程 运行npm run...
github-graphql::spider_web_selector:GraphQL绑定到GitHub API
通过GraphQL Ruby Gem演示Github API 您需要什么来运行graphql查询 您将需要一个并将其设置在['GITHUB_TOKEN']环境变量中才能运行它。 bundle install GITHUB_TOKEN=ACCESS_TOKEN ruby initializer.rb 我建议阅读...
GitHub用户和存储库搜索应用程序 React Native,GraphQL,Apollo,GitHub GraphQL API演示
graphql-github-profile GraphQL的测试存储库,该存储库在插入访问令牌后获取GitHub配置文件信息。