女主宣言
越来越多的项目中都能看到GraphQL的身影,不知道大家在项目中有没有使用过GraphQL呢?今天给大家分享一下使用Go,来创建基础GraphQL API,供大家参考学习。
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!
引言
随着时间推移,我们在越来越多的项目中,都可以发现GraphQL的身影。
从几个方面看,包括图形化的数据、多个分布式团队和高度版本化的api,以及关于类型安全和文档的问题。GraphQL看起来非常适合许多不同的应用程序。
本文的目标不是去介绍GraphQL的基础知识,而是在实际场景中看到它的实际操作。当计划将现有的REST API移动到GraphQL时,需要引入一个转换层,以实现平稳过渡。
在本篇文章中,我们将使用jsonplaceholder作为我们用GraphQL包装的API。这里有几个用于graphQL的库,在本篇文章示例中,将使用graphql-go和graphql-go-handler。
我们的目标是从jsonplaceholder获取文章和评论,最后以一种通过ID获取文章的方式,如果API使用者希望获取评论,则通过GraphQL将评论嵌套到文章中。
让我们开始吧。
开始实现
首先,我们为文章和评论定义数据模型:
我们定义 fetchPostByiD(id)函数,它用来调用http://jsonplaceholder.typicode.com/posts/$ 并将生成的JSON转换成Post。当然,还有一个fetchCommentByPostId(post.ID)助手函数,它对注释做同样的事情,从http://jsonplaceholder.typico/posts/$/注释中获取数据,并将其转换为[]Comment。
然后我们继续创建graphQL模式。我们从定义queryType开始,它是模式的根:
根查询类型只有一个字段 —— post。这个字段是由postType定义的,我们稍后会看到。它只接受一个名为id的参数。
文章通过从p.Args中解析出id,并将它传递给fetchPostsByID,返回已获取和转换后的Post以及错误信息。
接下来,我们定义postType,这很有趣。我们基本上只是把post字段从数据模型映射到graphQL类型,但我们也添加了comments字段。如果客户端显式地想要取回它们,那么评论的Resolve函数才会被调用。
为了解决评论,我们使用p.Source来访问这个查询的“父”。它为我们提供了一个Post实例*Post——已获取的文章。使用这篇文章的id,我们可以获取评论:
在模式中唯一要定义的类型是commentType,这很无聊,因为它只将数据模型的字段映射到graphQL类型:
好了,我们的模式被定义了,剩下的就是把它们放在一起。
我们实例化一个graphQL模式并将其传递给graphql-go-handler,它是一个http中间件,它帮助我们处理graphQL查询。然后我们简单地启动一个http服务器,它的返回处理程序被路由到/graphql。
这像这样:
好了,以上就是全部实现!
启动服务器之后,我们可以使用GraphiQL查询一个具有特定id的文章,指定我们感兴趣的字段:
获取到以下返回信息:
如果我们在查询中去掉了评论,那么就不会发出获取评论的请求,我们只是简单地将选定的帖子作为响应。
完整的示例代码地址 https://github.com/zupzup/example-go-graphql。
总结
这个例子展示了如何使用一个简单的Go层将现有的REST API转换成GraphQL。我们使用的这个库,graphql-go工作得很好,提供了可靠的文档和良好的示例。
当然,有更简洁、更有趣的方法来定义这样的模式,但是由于技术等有限,我选择了这个解决方案,它的重点是清晰性。希望大家举一反三,自己结合实际去编写适合项目的实现。
HULK一线技术杂谈
由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享
领取专属 10元无门槛券
私享最新 技术干货