小白可以看懂的「GraphQL」,GraphQL到底是啥样

news/2025/3/24 1:54:53/

GraphQL是一种用于API的查询语言,可以在服务端定义GraphQL Schema,客户端可以向服务端发送GraphQL请求,服务端执行GraphQL查询,并将结果作为JSON返回给客户端。

下面是一个使用golang实现GraphQL的示例,首先需要安装golang的GraphQL库github.com/graphql-go/graphql

第一步定义GraphQL Schema

package mainimport "github.com/graphql-go/graphql"// 定义User结构体
type User struct {ID   intName stringAge  int
}// 定义GraphQL Schema
var Schema, _ = graphql.NewSchema(graphql.SchemaConfig{Query: graphql.NewObject(graphql.ObjectConfig{Name: "Query",Fields: graphql.Fields{// 定义getUser查询,查询一个用户的信息"getUser": &graphql.Field{Type: UserObject,Args: graphql.FieldConfigArgument{"id": &graphql.ArgumentConfig{Type: graphql.Int,},},Resolve: func(p graphql.ResolveParams) (interface{}, error) {// 处理getUser查询的逻辑userID, ok := p.Args["id"].(int)if !ok {return nil, nil}var user = User{ID:   userID,Name: "Tom",Age:  18,}return user, nil},},},}),
})// 定义User类型
var UserObject = graphql.NewObject(graphql.ObjectConfig{Name: "User",Fields: graphql.Fields{"id": &graphql.Field{Type: graphql.Int,},"name": &graphql.Field{Type: graphql.String,},"age": &graphql.Field{Type: graphql.Int,},},
})

以上代码中,定义了一个叫做User的类型,以及一个叫做getUser的查询,getUser查询需要一个名为id的参数,返回一个User类型的对象。

② 执行GraphQL查询

package mainimport ("encoding/json""fmt""net/http""github.com/graphql-go/graphql""github.com/graphql-go/handler"
)func main() {// 定义http请求处理函数http.Handle("/graphql", handler.New(&handler.Config{Schema: &Schema,Pretty: true,}))// 启动http服务fmt.Println("Server running on port 8080")http.ListenAndServe(":8080", nil)
}

以上代码中,使用github.com/graphql-go/handler库创建一个http处理器,并监听8080端口。

接下来,可以使用HTTP Client来测试GraphQL查询:

package mainimport ("bytes""encoding/json""fmt""net/http"
)func main() {// 定义GraphQL查询query := `query getUser($id:Int!) {user:getUser(id:$id) {idnameage}}`// 定义查询参数params := struct {Query     string      `json:"query"`Variables interface{} `json:"variables"`}{Query: query,Variables: map[string]interface{}{"id": 1,},}// 将查询参数编码为JSON格式requestBody, _ := json.Marshal(params)// 发送GraphQL查询请求resp, _ := http.Post("http://localhost:8080/graphql", "application/json", bytes.NewBuffer(requestBody))// 读取查询结果var result struct {Data   interface{} `json:"data"`Errors []struct {Message string `json:"message"`} `json:"errors"`}json.NewDecoder(resp.Body).Decode(&result)// 处理查询结果if len(result.Errors) > 0 {fmt.Println(result.Errors[0].Message)} else {fmt.Printf("%+v\n", result.Data)}
}

以上代码中,定义了一个叫做getUser的查询,并且将查询变量id的值设置为1。将查询参数编码为JSON格式,并通过HTTP Post发送GraphQL查询请求。最后,处理查询结果并打印到控制台。

总结:graphQL给我们带来的diff是什么?

可以给GraphQL形象地比喻成一名个人管家或者服务员。客户端向服务端发送一个需要的数据需求(就像是顾客点菜),服务端的个人管家/服务员(即GraphQL)收到需求后,帮你去找到所有数据,然后将所有数据优化打包成一个请求结果返回给客户端(即将所有的菜打包成一份菜单,客户端只需要按需取数据即可)。

下面是GraphQL的一些优点和缺点:

优点:

  • 精细的数据获取:GraphQL可以精确获取客户端需要的数据,减少数据传输量和网络请求次数,提高性能。
  • 灵活的数据查询:GraphQL查询语言非常灵活,支持多种查询方式,可以方便的定制查询条件,满足客户端的不同数据需求。
  • 自描述性:GraphQL服务端会提供一份Schema,客户端可以根据该Schema自动生成文档或者代码,方便开发和协作。
  • 适用于多平台:GraphQL不依赖具体的数据库和平台,适用于多种语言和开发框架。

缺点:

  • 学习成本:相对于RESTful API,GraphQL需要更多的学习成本,包括查询语言和Schema定义等。
  • 需要服务端支持:GraphQL需要服务端实现支持,需要服务端和客户端都做相应的改造,不能直接覆盖已有的API。
  • 安全问题:由于GraphQL可以让客户端获取更小粒度的数据,因此很容易暴露一些敏感数据给客户端,需要在服务端实现中特别注意安全问题。

http://www.ppmy.cn/news/205657.html

相关文章

手撕数据结构—单链表

✅作者:简单^不简单 🔥系列专栏:C语言数据结构 💖如果文章有错误,时刻欢迎大家的指正。当然觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝 💬格言:希望我…

二、KeilMDK+STM32CubeMX建立工程_LED灯闪烁为例

1、开发环境 (1)KeilMDK:V5.38.0.0 (2)STM32CubeMx:V6.8.1 (3)MCU:STM32F407ZGT6 2、实验目的&原理图 2.1、实验目的 实现两个LED灯以500毫秒闪烁一次。 2.2、原理图 (1)LED阴极接GPIO,GPIO输出低电平,LED点亮;GPIO输…

网络安全大厂面试题合集+

以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。 注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题&#xf…

vmware安装deepin系统一直卡在黑屏(已解决)

我与到了这样的情况,在vmware里安装的deepin15,一致卡在黑屏界面,解决办法如下 deepin属于dedian系的系统,,在vmware选择系统类型的时候,选择同属于debian系的ubantu就行了,还要注意待安装的系统是32还是64位的 虽然vmware这个软件是32位软件,,但是不要误解,它是可以装64位系统…

微信预览wx.previewImage黑屏

function showPic(picurl,id){var photo_list $("#photo_list_"id).val();var picarr photo_list.split(|);wx.previewImage({current: picurl,urls: picarr }); }点击事件出现黑屏转圈的情况,然后开发者工具出现这个提示 PC无法调试出黑屏转圈的情况&…

WebSocketClient.js?5586:16 WebSocket connection to ‘ws://10.40.126.70:8080/w

兄弟们,我才疏学浅,我直接给关了,然后重启项目,目前并不影响正常操作,什么时候进阶研究源码再说吧!

python websockets(wss)

官网介绍 以下为两段示例代码 #!/usr/bin/env pythonimport asyncio import websocketsasync def hello():async with websockets.connect("ws://localhost:8765") as websocket:await websocket.send("Hello world!")await websocket.recv()asyncio.run(…

Windows如何安装WS2

1.启用WSL 管理员身份打开PowerShell 工具并运行以下命令: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart2.启用虚拟平台 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /nor…