美文网首页程序员
GraphQL 从入门到放弃系列

GraphQL 从入门到放弃系列

作者: 豆志昂扬 | 来源:发表于2019-01-06 13:03 被阅读44次

    使用 GraphQL,你可以将你所有的业务建模为图。
    中文官网:http://graphql.cn/

    REST是一种古老的面向服务端和客户端的架构风格。它定义了一系列严格的构建API的原则,用简单的方式描述资源,并认为大部分时候违背这些原则会让软件的扩展性受限。随着服务端SOA和客户端Ajax的崛起,通信扩展问题变得越来越重要,REST得以广泛被运用。

    在MicroService逐渐流行的今天,RESTful API已经成为主流。不过随着前端和移动端的迅猛发展,REST也面临严峻挑战。

    REST API存在问题:

    1. 资源分类导致性能受限。前端的效率主要来源于http请求

    2. 在现代场景中难于维护。虽然REST的目标是易于维护和扩展,但在Web前端/客户端领域,它的表现并没有想象得那么好。我们经常说最明显的Code smell就是重复。

    3. 缺乏约束。对REST来说,不同版本之间的兼容能力非常弱小。

    4. 严格,抽象,但并不能解决客户端问题。我们经常可以在网上看到互相指责的文章和讨论,基本上都是一方列举出自己使用RESTful API遇到的实际问题,而另一方认为前者实际应用违反了哪条REST原则,因此不是RESTful API。

    GraphQL是什么?

    image

    GraphQL是一个查询语言,由Facebook开发,用于替换RESTful API。服务端可以用任何的语言实现。

    GraphQL优势:

    1. 需求驱动。可以减少了沟通成本。

    2. 一次请求复杂数据。

    3. 静态类型。

    4. 兼容多版本。

    GraphQL也存在一些潜在的问题,如安全问题,需要重新思考Cache策略等。

    那么 GraphQL 与 RESTful 的具体区别有什么呢?我觉得主要是两点。

    • 入口 (entry point)

    RESTful 的核心理念在于资源 (resource),且讲究一个 RESTful 接口仅操作单一资源;因此在你使用 RESTful 时,会设计出大量的接口。

    GraphQL 是单一入口,一般配置在 [host]/graphql/,所有的资源都从该入口通过 GraphQL 的语句获取或修改(当然 GraphQL 亦支持多入口,但显然多入口的数量也远小于 RESTful)。

    • 所见即所得

    查询的返回结果就是输入的查询结构的精确映射

    查询:

    {

    hero {
    name
    }
    }

    返回:

    {

    "data": {
    "hero": {
    "name": "R2-D2"
    }
    }
    }

    • 减少网络请求次数

    如果设计的数据结构是从属的,直接就能在查询语句中指定。

    {
    hero (id: "10"){
    name
    # 查询可以有备注!
    friends {
    name
    }
    }
    }

    查询结果:

    {
    "data": {
    "hero": {
    "name": "R2-D2",
    "friends": [
    {
    "name": "Luke Skywalker"
    },
    {
    "name": "Han Solo"
    },
    {
    "name": "Leia Organa"
    }
    ]
    }
    }

    }

    即使数据结构是独立的,也可以在查询语句中指定上下文,只需要一次网络请求,就能获得资源和子资源的数据。

    query {
    hero {
    name
    }
    droid(id: "2000") {
    name
    }
    }

    4 代码即文档

    GraphQL会把schema定义和相关的注释生成可视化的文档,从而使得代码的变更,直接就反映到最新的文档上,避免RESTful中手工维护可能会造成代码、文档不一致的问题

    5 参数类型强校验

    RESTful方案本身没有对参数的类型做规定,往往都需要自行实现参数的校验机制,以确保安全。

    但GraphQL提供了强类型的schema机制,从而天然确保了参数类型的合法性。

    获取更多内容请关注微信公众号豆志昂扬:

    • 直接添加公众号豆志昂扬
    • 微信扫描下图二维码;

    相关文章

      网友评论

        本文标题:GraphQL 从入门到放弃系列

        本文链接:https://www.haomeiwen.com/subject/puksrqtx.html