graphql是什么

GraphQL是当今软件技术中最大的流行语之一。 但究竟是什么 实际 ? 它是像SQL这样的查询语言吗? 像JVM这样的执行引擎? 像XML这样的规范 ?

如果您回答以上所有问题,那么您是正确的! GraphQL是查询语言语法,与编程语言无关的执行引擎以及不断发展的规范。

让我们深入研究GraphQL如何成为所有这些东西,并一窥为什么人们对此感到兴奋的原因。

查询语言

GraphQL作为查询语言似乎是合理的-毕竟,“ QL”似乎足够重要。 但是我们要查询什么? 查看样本查询请求和相应的响应可能会有所帮助。

以下用户查询:

{
user(id : 4 ) {
name
email
phoneNumber
}
}

可能会返回以下JSON响应:

{
"user" : {
"name" : "Zach Lendon"
“email” : “zach@hydrate.io”
“phoneNumber” : “867-5309”
}
}

假设有一个客户端应用程序查询用户详细信息,获取结果并使用它来填充配置文件屏幕。 作为查询语言,GraphQL的核心优势之一是客户端应用程序可以请求其所需的数据,并期望以一致的方式返回数据

但是,什么返回GraphQL响应? 这就是执行引擎(通常以GraphQL服务器的形式)发挥作用的地方。

执行引擎

GraphQL执行引擎负责处理GraphQL查询并返回JSON响应。 所有GraphQL服务器都由两个定义执行引擎的结构和行为的核心组件组成:分别为架构和解析器。

GraphQL模式是一种自定义类型的语言,它公开了允许(有效)和由GraphQL服务器实现处理的查询。 上面的用户示例查询的架构可能类似于:

type User {
name : String
email : String
phoneNumber : String
}

type Query {
user : User
}


此架构定义返回用户的用户查询。 客户端可以通过用户查询请求用户上的任何字段,并且GraphQL服务器将仅在响应中返回那些字段。 通过使用强类型模式,GraphQL服务器可以验证传入的查询,以确保它们基于定义的模式有效。

一旦确定查询有效,解析器将由GraphQL服务器对其进行处理。 解析器功能支持每种GraphQL类型的每个字段。 我们的用户查询的示例解析器可能如下所示:

Query : {
user ( obj, args, context, info ) {
return context.db.loadUserById ( args.id ) .then (
userData => new User ( userData )
)
}
}

尽管上面的示例是用JavaScript编写的,但GraphQL服务器可以用多种语言编写。 这是由于GraphQL 也是一个规范!

规范

GraphQL规范定义了GraphQL实现必须遵循的功能和特性。 作为开放网络基金会最终规范协议( OWFa 1.0 )下可用的开放规范,技术社区有机会审查GraphQL实现必须符合规范的要求,并有助于制定该语言的未来。

虽然该规范对GraphQL的语法,什么是有效查询以及架构如何进行了非常具体的说明,但它没有提供有关如何存储数据或GraphQL服务器应使用哪种实现编程语言的指导。 这是非常强大的功能,并且在软件领域相对独特-它允许以多种编程语言创建GraphQL服务器,并且由于它们符合规范,因此客户将确切知道它们的工作方式。 GraphQL服务器实现已经跨许多编程语言创建,不仅人们可能期望像JavaScript,Java和C#这样的语言,而且还使用Go,Elixir和Haskell这样的语言。 服务器实现所使用的语言不会成为采用的障碍-不仅存在许多语言的实现,而且它们都是开源的。 如果没有您选择的语言的实现,则可以自由创建自己的实现。

结论

GraphQL是开源API领域中一个令人兴奋的,相对较新的参与者。 它将查询语言和执行引擎与开源规范结合在一起,该规范定义了GraphQL实现的外观和功能。

GraphQL已经开始改变公司对构建客户端和API应用程序的看法。 通过将GraphQL作为技术堆栈的一部分,前端开发人员可以自由查询所需的数据,而后端开发人员可以将客户端应用程序需求与其后端系统体系结构分离。 通常,公司首先通过在其现有后端服务之上构建一个GraphQL API“层”来进入GraphQL。 这使客户端应用程序可以开始获得所需的性能和运营效率,同时使后端团队有机会确定他们可能希望在GraphQL层后面进行的“幕后”更改(如果有)。 通常,这些更改将针对优化,这些优化将帮助确保使用GraphQL的应用程序可以尽可能高效地运行。 由于GraphQL提供了抽象,因此系统团队可以进行这些更改,同时继续在其GraphQL API级别上遵守GraphQL的“合同”。

由于GraphQL相对较新,因此开发人员仍在寻找新颖而激动人心的方法来利用它来构建更好的软件解决方案。 GraphQL将如何改变您构建应用程序的方式,并且它不会辜负宣传吗? 只有一种方法可以找出答案-到那里去用GraphQL构建一些东西!

翻译自: https://opensource.com/article/19/6/what-is-graphql

graphql是什么

graphql是什么_什么是GraphQL?相关推荐

  1. js node 打包mac应用_混搭 TypeScript + GraphQL + DI + Decorator 风格写 Node.js 应用

    阅读本文的知识前提:熟悉 TypeScript + GraphQL + Node.js + Decorator + Dependency Inject 等概念.前言 恰逢最近需要编写一个简单的后端 N ...

  2. graphql 嵌套查询_了解GraphQL中的查询

    graphql 嵌套查询 介绍 (Introduction) In this tutorial, we'll take an in-depth look at queries in GraphQL s ...

  3. laravel graphql php,结合 Laravel 初步学习 GraphQL

    本文字数:7134,大概需要14.27分钟. 按照官网所述的: A query language for your API一种用于 API 的查询语言 GraphQL is a query langu ...

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

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

  5. react 生命挂钩_如何在GraphQL API中使用React挂钩来管理状态

    react 生命挂钩 In this blog post, we are going to learn - 在这篇博客中,我们将学习- What React hooks are什么是React钩子 H ...

  6. 【.NET 遇上 GraphQL】使用 Hot Chocolate 构建 GraphQL 服务

    Hot Chocolate 是 .NET 平台下的一个开源组件库, 您可以使用它创建 GraphQL 服务, 它消除了构建成熟的 GraphQL 服务的复杂性, Hot Chocolate 可以连接任 ...

  7. golang底层深入_带有Golang的GraphQL:从基础到高级的深入研究

    golang底层深入 by Ridham Tarpara 由里德姆·塔帕拉(Ridham Tarpara) 带有Golang的GraphQL:从基础到高级的深入研究 (GraphQL with Gol ...

  8. 前端websocket获取数据后需要存本地吗_是什么让我放弃了restful api?了解清楚后我全面拥抱GraphQL...

    GraphQL初步认识 背景 REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史.它的简单易用性,可扩展性, ...

  9. 前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...

    背景 REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史.它的简单易用性,可扩展性,伸缩性受到广大Web开发 ...

最新文章

  1. CocoStudio 1.3和1.4.1导入Flash文件注意事项(转载并有修改)
  2. python 内置函数的一部分
  3. G6 2.0 开源发布 -- 裂变·聚变
  4. continue和break的区别
  5. UA PHYS515A 电磁理论IV 时变电磁场理论6 用含时Green函数求解时变电磁场问题的例子
  6. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
  7. 机器学习中 True Positives(真正例TP)、False Positives(假正例FP)、True Negatives(真负例TN)和 False Negatives(假负例FN)指什么
  8. 牛客多校2 - Interval(网格图最大流转换为对偶图最短路)
  9. Python获取文件路径:os.listdir()和os.walk()
  10. 网络基础---NAT技术和代理服务器
  11. 即时通信聊天工具的原理与设计
  12. mysql省市区表带简称_mysql地区数据库表带地区编码和上级id
  13. Mysql压缩包版的安装教程
  14. mybatis入门1
  15. ui设计入门书籍_书籍封面设计入门指南
  16. v-if和v-show能和v-for同时出现吗?
  17. matlab元胞数组的创建和显示
  18. 每个人都至少需要4个邮箱账户(附国内外数十个免费邮箱)
  19. 【Java8 环境安装】Java1.8JDK环境安装jdk-8u361-windows-x64
  20. 计算云服务——弹性伸缩服务

热门文章

  1. Spring核心知识点总结
  2. spring整合使用activemq
  3. Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
  4. 利用https实现站点的访问
  5. mysql示例employees数据库
  6. 第十二篇 Android 系统电话管理机制一--工厂模式和代理模式
  7. python开发的类似stardict工具
  8. WINDOWSXP全面优化下
  9. 分布式缓存原理——一致性hash算法(hash环)、Hash槽
  10. html中鼠标左键自定义多级菜单,CSS多级菜单的实现代码