graphql 新API 开发方式

作者&投稿:斐叙 (若有异议请与网页底部的电邮联系)
~

graphql 新API 开发方式

我们知道 GraphQL 使用 Schema 来描述数据,并通过制定和实现 GraphQL 规范 定义了支持 Schema 查询的 DSQL (Domain Specific Query Language,领域特定查询语言)。Schema 帮助将复杂的业务模型数据抽象拆分成细粒度的基础数据结构,而 DSQL 的实现则赋予了前端开发者自由组织和定制请求数据的能力。如果以一张图来表示的话,可以将 GraphQL 看做一条以 通用基础业务数据模型 为基础、将传统后端服务和前端页面紧密且自由地联系在一起的纽带。

为什么 GraphQL 的 Schema 能够表示出服务器所支持的复杂业务模型数据,GraphQL 的 Query 又是怎样赋予前端开发者对数据的定制能力,本文将通过分析和理解 GraphQL 的设计来和大家一起探讨解答这些问题。

1.GraphQL 的设计

GraphQL 由以下组件构成:

作为将数据模型和具体接口实现解耦的 DSL,GraphQL 的基础组件,也是它最重要的组件之一就是类型系统。

1.1 类型系统

可以将 GraphQL 的类型系统分为标量类型(Scalar Types,标量类型)和其他高级数据类型,标量类型即可以表示最细粒度数据结构的数据类型,可以和 JavaScript 的原始类型对应。GraphQL 规范目前规定支持的标量类型有:

Scalar Types 的 JavaScript 参考实现代码可以查看 这里 。

其他高级数据类型包括:

还有一种重要的数据类型,即 schema 类型,它描述了后端服务器能够提供的数据支持。这里先暂时不介绍,因为它涉及 GraphQL 的其他组件,等全部介绍完我们再来看 GraphQL 中 schema 的 具体实现 。

1.2 查询语言

类型系统对应我们开头提到的 Schema,是对服务器端数据的描述,而查询语言则解耦了前端开发者与后端接口的依赖。前端开发者利用查询语言可以自由地组织和定制系统能够提供的业务数据。

GraphQL 的一个查询请求被称为一份 query 文档(query document),即 GraphQL 服务能够解析验证并执行的一串请求字符串。query 由操作(Operation)和片段(Fragments)组成。一个 query 可以包含多个操作和片段。只有包含操作的 query 才会被 GraphQL 服务执行。但是不包含操作,只有片段的 query 也会被 GraphQL 服务解析验证,这样一份片段就可以在多个 query 文档内使用。

只包含一个操作的 query 可以不带操作名称或者使用简写形式(即 query 关键字加操作名)。query 包含多个操作时,所有操作都必须带上名称。

操作(Operations)

GraphQL 规范支持两种操作:

查询请求的模型可以用下面的图来表示:

选择集合(Selection Sets)

选择集合表示当前选中的数据内容,格式为:

关于选择集合的使用,可以参考 graphql-js 的代码 。参考实现代码在 这里 。

字段(Field)

字段格式为:

alias:name(argument:value)

其中 alias 是字段的别名,即结果中显示的字段名称。

name 为字段名称,对应 schema 中定义的 fields 字段名。

argument 为参数名称,对应 schema 中定义的 fields 字段的参数名称。

value 为参数值,值的类型对应标量类型的值。

例如这样的请求: http://yunhe.taobao.com/?query={banner{backgroundURL:bg,biaoti:slogan}}

backgroundURL 就是 bg 字段的别名。

片段(Fragment)

片段是 GraphQL 的主要组合数据结构,通过片段可以重用重复的字段选择,减少 query 中的重复内容。片段又分为 FragmentSpread 和 InlineFragment。例如没有片段时需要这样编写 query:

query 中存在下列重复的选择集合:

可以用片段简化为:

使用片段时需要加上 ... 操作符表示展开片段内容。

内联片段示例如下:

指令(Directives)

指令要解决的是 query 执行时字段参数无法覆盖的情况,例如引入或者忽略某个字段。指令为 GraphQL 执行添加了更多的信息。

指令实例如下:

include 指令表示只有在 if 参数为 true 时才引入片段表示的字段。

skip 指令表示在 if 参数为 true 时忽略片段中的字段。

熟悉了 类型系统 查询语言 我们就可以用 GraphQL 来实现应用层的数据请求了。其他三个 GraphQL 组件更偏向于 DSL 的实现和原理,因此本文不再做详细介绍,感兴趣的同学可以对照 规范 和 参考实现 自己研究。

2.总结

GraphQL 是在应用层对业务数据模型的抽象,是对数据请求定制的 DSQL,它解除了接口和数据之间的绑定,对业务数据结构做了抽象和整理,业务逻辑中的数据依赖于底层数据库结构,并且可以由具体业务场景来定制,不同的业务场景只要基于同样一套基础业务数据模型就可以得到复用,在我看来,这才是 GraphQL 带来的最大改变和收益。




大方县13525869872: Github 为什么开放了一套 GraphQL 版本的 API -
望欣复方: 背景 GitHub 宣布开放了一套使用 GraphQL 开发的公共 API.GitHub 的 REST API 已经非常完善,设计得很优秀,很多公司开发自己的 REST API 时都会参考 GitHub,也有很多爱好者写了非常丰富的教程.GraphQL 的核心是一套数据查询语言...

大方县13525869872: 1. 目前WebGIS主流的开发模式有哪些?即:什么GIS软件平台+什么开发平台?(开发) -
望欣复方: arcgis api for flex +flexbuilder arcgis api for silverlight+Vs arcgis api for javascript+ js,html

大方县13525869872: 如何开发自己的API接口? -
望欣复方: 开发自己的api需要准备几个工作:第一:提高你的API的功能 第二:设置你的API访问协议,如:socket,http 第三:升级你的API的认证方式,如:curl,oauth 第四:找到属于你的API开发语言

大方县13525869872: ArcGIS Server开发需要哪些知识 -
望欣复方: arcgis server有以下几种开发方式1、vs.net或JAVA 中的 ADF开发方式:熟悉.net或java,熟悉web编程,熟悉ADF框架,比如熟悉如何使用ArcGIS Server中ADF的map控件,工具条,Task任务控件,结果控件等.2、ArcGIS Server ...

大方县13525869872: 为什么很多web应用的api都用json开发,和gsoap+webservice相比,它有哪些优缺点 -
望欣复方: json和soap+webservice是一种数据交互格式,目前所有的平台都对他们进行支持.json是以键值对的形式展现的长串,webservice交互的数据多为xml,就可读性和可扩展性而言,两种方式不相上下.编码的方便程度上json要稍微占点优势,没有xml那种多于的标签对.客户端在使用json串的的时候,只需要eval(),eval这个函数很多语言都有,比如js,as 等等.在维护方面维护一段xml串比一段json我想难度要大点

大方县13525869872: GraphQL的核心是什么?
望欣复方: What is GraphQL? 正如副标题所说,GraphQL 是由 Facebook 创造的用于描述复杂数据模型的一种查询语言.这里查询语言所指的并不是常规意义上的类似 sql 语句的查询语言,而是一种用于前后端数据查询方式的规范.

大方县13525869872: 用什么开发 arcgis server -
望欣复方: arcgis server有几种开发方式 vs.net或JAVA 中的 ADF开发方式: 熟悉.net或java,熟悉web编程,熟悉ADF框架,比如熟悉如何使用ArcGIS Server中ADF的map控件,工具条,Task任务控件,结果控件等. ArcGIS Server Javascript API: 这种...

大方县13525869872: 如何开发api接口 -
望欣复方: API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节.API函数包含在Windows系统...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网