slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
GraphQL与REST孰优孰劣?(代码比较篇)
17611538698
webmaster@21cto.com

GraphQL与REST孰优孰劣?(代码比较篇)

资讯 0 2823 2021-03-20 09:45:04

REST并不是第一个进行Web通信的协议,十几年来,它一直统治着API领域。

近期来,由Facebook设计的GraphQL正在变得越来越流行,它的目标是克服REST的某些缺点,但实际上没有一种技术是完美的。

GraphQL与REST相比有什么优点?为什么在项目中使用GraphQL?

REST API已知的问题

 

首先,我们讨论REST的一些缺点,GraphoQL如何尝试解决它们。主要有如下三个方面:服务器过多的往复,获取过多/不足,缺乏一些灵活性。

1)使用REST API连接服务器的次数过多

比如我们正在开发一个社交媒体的应用程序,有一个需求是显示所有用户的新帖子,包括用户名以及个人资料,照片等。

在REST中,需要向/api/posts发送GET请求,以获取帖子,这将返回一个帖子的标题、内容、标签、日期以及用户ID等的一个Json对象。

接下来,需要请求每个帖子,向/api/user/:id/发送GET请求,以获取相关用户的名字,头像和相关信息。

当为每个用户发出GET请求时,一页的服务器通信就会很多!

而使用GraphQL,只需要走一趟服务器就可以获取所需要的全部:

query {
    posts {
        title,
        content,
        tags,
        date,
        user {
            username,
            avatar,
            catchphrase,
            favorite_dog
        }
    }
}

尽管在比较小的范围内,多次访问服务器也没有什么关系。但是,一旦大量的请求数据,则API调用会大量的增加,减少API请求次数,则性能会因此受益,因此GraphQL则更容易实现。

REST API中的过度获取和不足获取

REST API的相关问题就是获取过多和不足。在REST API中,当命中一个节点时,不论是否需要全部,我们都要获取这些相同的数据。

假如我们只需要其中某人的用户名和头像,比如/usr/:id会返回用户名、头像、个性化和喜欢的动物等字段,不管你需不需要,都能取得这些信息。

想要显示单个用户的帖子,我们需要用户信息和帖子的内容。如果我们想从用户结点获取用户信息,仍然需要点击posts节点,并使用userid检索。

// First we get the user's info
GET /api/users/42

{
    "username": "Mr. T",
    "avatar": "http://example.com/users/42/pic.jpg",
    "catchphrase": "I pity the fool",
    "favorite_dog": "beagle"
}

// Then we get their posts
GET /api/users/42/posts

{
    "posts": [{
        "title": "Hello World",
        "content": "Hi everyone!"
        "tags": "first post"
        "date": "July 1, 2020"
    }]
    // etc.
}


如同前面的例子,GraphQL可以允许用户用一个节点获取想要的内容来解决了问题。


REST API缺少灵活性

 

在前面的基础上,REST依赖于创建符合前端需求的API。如果你可以预计前端到达指定节点时需要什么,则可以精确地调整检索到的数据,以匹配该前端视图。

当前端视图静态化较多时,这种方法效果会很好。如果前端经常会修改,开发者会希望返回的数据能有更大的灵活性。

同样,如果API被具有不同需求的各种客户端使用,那么REST API的灵活性就会变得差强人意了。

而GraphQL通过允许检索不同的数据配置,能够提供这种灵活性。

// If I just need the username and avatar:

query {
    users {
        username,
        avatar
    }
}

// If I need their favorite dog breed, too.

query {
    users {
        username,
        avatar,
        favorite_dog
    }
}


是用REST还是GraphQL?

 

从上面看来,GraphQL比REST要更好,但也不全是。

人们在开发应用程序时,每个体系结构都各有利弊,REST和GraphQL也不例外。

以下是一些开发者需要考虑的事情:

1)如果你需要易于使用的内容,请选择GraphQL;
2)正确执行REST需要学习,如果还不是很熟悉,那么用GraphQL可以轻松创建出色的API。
3)如果用GraphQL,要学会如何处理错误
4)REST API很好地利用了HTTP的错误报告功能
5)REST可能更适合微服务
如果在后端使用微服务,则REST可能会更好地实现目标,它可以使关注点分开。
6)GraphQL的统一数据图形非常有用。

 

结论

 

与所有其它内容一样,在REST和GraphQL之间进行选择时需要考虑一些细节。在项目选型时取决于你的需求与当下资源。

评论