REST是构建API的一种流行方法,而且比GraphQL应用更广泛,让我们看看GraphQL和REST的区别。

Rest是一个概念

REST是一个事实上的架构标准,但它实际上没有规范,有大量的非官方定义。GraphQL有一个规范草案,它是一种查询语言,而不是一个架构,有一套围绕它的定义良好的工具(和一个繁荣的生态系统)。

REST是建立在现有的架构之上的,如HTTP,而GraphQL则是建立自己的一套规则。这可能是一个优势点,也可能不是,因为REST可以使用HTTP层上的缓存。GraphQL必须在系统中建立自己的缓存。

单一的端点

GraphQL只有一个端点,你在那里发送你的所有查询。通过REST方法,你创建了多个端点,并使用HTTP动词来区分读取动作(GET)和写入动作(POST、PUT、DELETE)。GraphQL不使用HTTP动词来确定请求类型。

根据您的需求定制

使用REST,您通常无法选择服务器返回给您的内容,除非服务器实现部分响应稀疏字段集,并且客户端使用该功能。 API维护人员无法强制执行此类过滤。

API通常会返回比你需要的多得多的信息,除非你也负责API服务,并为每个不同的请求定制响应。

在GraphQL中,情况就不同了:你向一个端点发出一个请求,只取回你需要的东西。

它避免了服务端大量冗余数据的返回,查询速度更快,更灵活。

下面我们来看一个Pizza endpoint的例子。

如果你调用GET /pizza/margherita,你将得到一个Margherita比萨。如果你调用GET /pizza/napoli,你将得到一份Napoli比萨。

如果你有30种不同的口味,你就会有30个端点(除非你把比萨饼的名字作为参数传给GET /pizza)

但也许你想要一种特定的比萨,这很容易向服务员描述,但很难向REST endpoint表达。

一个GraphQL端点可以让你调用/pizza,描述你要求的特定成分,以建立你想要的完美比萨。

GraphQL使监测字段的使用变得容易

在REST中,通常没有办法确定一个字段是否被客户端所需要,所以当涉及到重构或废弃时,不可能确定实际的使用情况。

GraphQL可以知道哪些字段被客户使用。

访问嵌套的数据资源

GraphQL产生更少的网络请求。

举个例子。访问一个人的所有朋友的姓名。如果你的REST API暴露了一个端点/person/1/friends,返回一个人朋友的信息列表,你首先通过GET /person/1得到/person/1,然后GET /person/1/friends。

除非一个人的朋友列表已经包含了朋友的名字,否则如果有100个朋友,你就需要向/person端点做101次HTTP请求,这是一个巨大的时间和资源的浪费。

使用GraphQL,你只需要一个请求,即询问一个人的朋友的名字。

类型

API是基于JSON的,不能提供类型控制。GraphQL有一个类型系统。

哪一个更好?

现在,全世界的开发者正试图找出从REST迁移到GraphQL是否适合他们的需求。

当你需要公开复杂的数据表示时,客户可能只需要数据的一个子集,或者他们经常执行嵌套查询以获得他们需要的数据时,GraphQL是一个完美的选择。

与编程语言一样,没有单一的赢家,这完全取决于你的需求。

另外,我想说的是:你可以同时使用。

你可以根据你的需要混合和使用REST和GraphQL,有时这是最好的做法。

GraphQL API vs REST API的更多相关文章

  1. 用API网关把API管起来

    最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合 ...

  2. lumen 构建api(dingo api)

    什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...

  3. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

  4. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  5. HTML5之本地文件系统API - File System API

    HTML5之本地文件系统API - File System API 新的HTML5标准给我们带来了大量的新特性和惊喜,例如,画图的画布Canvas,多媒体的audio和video等等.除了上面我们提到 ...

  6. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  7. 【百度地图API】百度API卫星图使用方法和卫星图对比工具

    原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...

  8. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  9. 【quickhybrid】API的分类:短期API、长期API

    前言 一切就绪,开始规划API,这里在规划前对API进行了一次分类:短期API.长期API 首先申明下,这个是在实际框架演变过程中自创的一个概念,其它混合框架可能也会有这个概念,但应该是会在原生底层来 ...

  10. 阿里云API网关(2)开放 API 并接入 API 网关

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

随机推荐

  1. 其他:Windows10安装自带的Linux

    1.首先我们要打开Windows功能 2.在这里把勾打上 3.然后打开 设置 --- 更新和安全 --- 针对开发人员 --- (选择)开发人员模式 --- 确定启动 就行了 4.打开PowerShe ...

  2. 其他:Spring5.0框架源码导入IDEA

    1.下载Spring spring-framework-5.0.4.RELEASE下载地址:https://github.com/spring-projects/spring-framework/re ...

  3. 0、springboot

    在线新建springboot项目 https://start.spring.io/ 参考地址 https://github.com/battcn/spring-boot2-learning 博客 ht ...

  4. Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?

    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题? Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解 ...

  5. idea中IDEA优化配置

    进入IDEA 设置.两种方法: 1,File  -> Settings 2,工具栏有个工具按钮点下(假如没工具栏,View -> 选下Toolbar) 进入设置页面,从上到下,主要是 外观 ...

  6. easyswoole实现线上更新代码

    众所周知,easyswoole作为常驻内存的框架,修改代码并不能直接生效,而是需要重启服务,那么,当你的easyswoole项目上线之后,该如何保证旧请求的同时去更新代码呢? nginx reload ...

  7. Vue数据双向绑定不起作用、Vue如何正确的手动添加json数据、Vue视图层不刷新、手动刷新视图层

    Vue.set(obj,"key","value") 如果接收到来自服务器的消息时,我们需要对其进性进一步处理 我们想当然的会直接将数据添加进json 像这样: ...

  8. TCP连接的11种状态

    传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP协议主要针对三次握手建立连接和四次挥手断开连接,其中包括了 ...

  9. Linux磁盘配额与LVM

    一.LVM概述  逻辑卷管理 Logical Volume Manager二.LVM机制的基本概念三.LVM的管理命令  ① 主要命令  ② ==LVM逻辑卷操作流程==  ③ 举例四.磁盘配额概述  ...

  10. python mysql 类 图片保存到表中,从表中读图片形成图片文件

    import pymysql class MysqlHelper(object): conn = None def __init__(self, host, username, password, d ...