reference: https://www.jianshu.com/p/2ad286397f7a
Similarity:
the are both based on Http to do request and receive data.

从获取资源的方式上来比较:
相同点:都有资源这个概念,而且都能通过ID去获取资源。
相同点:都可以通过HTTP GET方式来获取资源
相同点:都可以使用JSON作为响应格式
差异点:在REST中,你所访问的路径就是该资源的唯一标识(ID);在GraphQL中,该标识与访问方式并不相关, 比如说 REST: GET /books/1 GraphQL: GET /graphql?query={ book(id: “1”) { title, author { firstName } } }
差异点:在REST中,资源的返回结构与返回数量是由服务端决定;在GraphQL,服务端只负责定义哪些资源是可用的,由客户端自己决定需要得到什么资源

路由(URL Route) vs. GraphQL Schema来比较:
对API的访问描述信息就显得很重要。通常我们会通过阅读API文档来获取信息,但通过GraphQL的Introspection机制、以及Swagger这样的REST API工具,这些信息就能可以自动获取到。
那么怎么获取到呢?REST会使用类似GET、POST这样的动词去请求相同的URL来表示这到底是一个读操作还是写操作,而GraphQL会使用不同的预定义类型:Mutation和Query。在GraphQL请求中,你可以通过不同的关键字进行不同的操作。
简而言之,REST对数据的描述形式是一连串的URL端点,而GraphQL则是由相互之间有所关联的schema组成。
相同点:REST API的URL端点列表与GraphQL的Query/Mutation中的字段类似,都表示数据的访问入口。
相同点:都能用不同的方式描述一个API请求到底是读操作还是写操作。
差异点:GraphQL让你可以通过一个资源入口访问到关联的其他资源,只要事先在schema中定义好资源之间的关系即可;而REST则提供了多个URL端点来获取相关的资源。
差异点:在GraphQL中,Query类型可以在一个请求的根节点中被访问,除此以外它跟其他类型没有区别,比如你也可以对一个query中的字段添加参数。而在REST中,即使响应结果是嵌套关系,但在请求中并没有嵌套的概念。
差异点:REST使用POST这样的HTTP方法名称来定义写操作,GraphQL则是查询结构中的关键字。

路由处理器(Route Handlers)vs. 解析器(Resolvers)来比较
REST API请求的生命周期

  1. 服务器收到请求并提取出HTTP方法名(比如这里就是GET方法)与URL路径
  2. API框架找到提前注册好的、请求路径与请求方法都匹配的代码
  3. 该段代码被执行,并得到相应结果
  4. API框架对结果进行序列化,添加上适当的状态码与响应头后,返回给客户端
    GraphQL请求的生命周期
  5. 服务器收到HTTP请求,取出其中的GraphQL查询
  6. 遍历查询语句,调用里面每个字段所对应的Resolver。在这个例子里,只有Query这个类型中的一个字段hello
  7. Resolver函数被执行并返回相应结果
  8. GraphQL框架把结果根据查询语句的要求进行组装

下图形象地说明了使用REST和GraphQL进行多种资源获取的方式的差异
Difference between GraphQL and REST API_服务器
相同点:REST的端点与GraphQL查询字段都在服务端调起函数执行。
相同点:REST和GraphQL都使用框架和类库来进行一些通用的网络协议处理。
差异点:一个REST请求对应一个路由处理器(Route Handler),而一个GraphQL的请求可以唤起多个解析器(Resolver)在一次响应中访问多种资源。
差异点:REST需要你自己构建整个请求的响应,而GraphQL的请求响应是由查询方指定结构、并由GraphQL进行构建组装的。

简而言之,你可以把GraphQL理解为一个可以在一次请求中进行多个端点调用的系统,差不多算是REST的多路复用版。