阅读目录

  • 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 ,返回的内容格式是这样:

{"data": {"repository": {"id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5"}}
}

  再看下稍微复杂点的查询方式:

query {repository(owner:"octocat", name:"Hello-World") {issues(last:20, states:CLOSED) {edges {node {titleurllabels(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": www.078881.cn  {"edges": [{"cursor": "Y3Vyc29yOjE=","node":www.feifanyule.cn {"__typename": "Repository"}}]}}
}

  得到的实际的数据对象是Repository之后,通过查阅Github Api的文档得到该对象有哪些字段,并且从中选择需要的字段即可。这个就是GraphQL的设计天然优势之一,按需获取。单在接下去运用的时候又需要引入一个新的概念fragment,这个可以理解为一个模板,通过这个模板来向服务端指明需要获取的数据字段。代码如下:

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}}}
}

  好了,这样就得到我需要的结果了。

  下面附上笔者做的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是什么相关推荐

  1. 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询 自APIJSON发 ...

  2. 【译】GraphQL vs. REST

    原文地址:GraphQL vs. REST 原文作者:Sashko Stubailo 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:wilsonandus ...

  3. fcm和firebase_我如何最终使Netlify Functions,Firebase和GraphQL一起工作

    fcm和firebase In a previous post I confessed defeat in attempting to get an AWS Lambda GraphQL server ...

  4. 如何使用FaunaDB + GraphQL

    I have one or two projects I maintain on Netlify, in addition to hosting my blog there. It's an easy ...

  5. 我希望支持JavaScript GraphQL实现的API

    The GraphQL schema language is great! It is certainly the best way to communicate anything about a G ...

  6. graphql是什么_为什么GraphQL是避免技术债务的关键

    graphql是什么 GraphQL (not to be confused with GraphDB or Open Graph or even an actual graph) is a rema ...

  7. graphql_普通英语GraphQL指南

    graphql by Luis Aguilar 路易斯·阿吉拉尔(Luis Aguilar) 普通英语GraphQL指南 (A Guide to GraphQL in Plain English) 您 ...

  8. react 错误边界_React with GraphQL和错误边界中的自定义错误页面

    react 错误边界 by Abi Noda 通过Abi Noda React with GraphQL和错误边界中的自定义错误页面 (Custom error pages in React with ...

  9. java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器

    java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...

  10. graphql redux_如何在Redux应用程序中使用GraphQL

    graphql redux by Howon Song 通过宋颂恩 如何在Redux应用程序中使用GraphQL (How to use GraphQL in your Redux app) Fetc ...

最新文章

  1. web报表移动端如何进行移动设备绑定与撤销
  2. 【目标检测系列】CNN中的目标多尺度处理方法
  3. android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...
  4. [Android1.6]继承BaseAdapter为GridView设置数据时设置setLayoutParams时注意
  5. 二进制(bit)整数
  6. python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...
  7. java上机面试题 039_深入 Java 虚拟机之面试总结篇
  8. Lady Bird
  9. python-scrapy简单爬虫实现
  10. mysql配置后无法在dos里运行
  11. oracle中exists和in的比较
  12. windows安装adb工具
  13. C语言怎么算n维向量的加法,3D数学读书笔记——向量运算及在c++上的实现
  14. 微信小程序名称、简称设置规范
  15. 99行Swift完成Markdown在线编辑服务器
  16. c盘满了怎么清理垃圾而不误删?教你瞬间多出20个G
  17. Docker 挂载Volume数据卷
  18. mysql ndb_MySQL NDB Cluster概述
  19. Python中的运算符与表达式 1
  20. 恒指期货实盘记录及下周行情分析!

热门文章

  1. wps怎么把字缩到最小_WPS文字如何调节字体大小突破字号72的限制实现大小随意调...
  2. 猿创征文 | 专做药品生产研发的程序员
  3. CSS实现文字动画炫酷效果
  4. Centos7安装(四)抓包工具wireshark源码编译安装
  5. PHP Laravel 队列技巧:Fail、Retry 或者 Delay
  6. dva如何去掉hash
  7. 怎么学好python?
  8. inline函数在IAR中的使用
  9. 云智慧发布电商618网站性能监测报告
  10. win11什么时候发布的_2019年8月证券从业资格考试报名通知什么时候发布?