golang+gin框架使用graphql-go

3 篇文章 0 订阅
1 篇文章 0 订阅

golang+gin框架使用graphql-go

1、安装组件
	go get github.com/graphql-go/graphql
	go get github.com/graphql-go/handler
2、router(路由)里初始化
func init(){
	AdminApiRouterGroup = Router.Group("/api/v1")
	{
		// GET方法用于支持GraphQL的web界面操作
		// 如果不需要web界面,可根据自己需求用GET/POST或者其他都可以
		AdminApiRouterGroup.POST("/graphql", GraphqlHandler())
		AdminApiRouterGroup.GET("/graphql", GraphqlHandler())
	}
}
3、GraphqlHandler() 文件,新建一个router_graphql.go文件与router文件同目录,内容:
package router

import (
	"c2matica.com/productcenter/graphql/schemas"
	"github.com/gin-gonic/gin"
	"github.com/graphql-go/graphql"
	"github.com/graphql-go/handler"
)

// 定义根查询节点
var query = graphql.NewObject(graphql.ObjectConfig{
	Name:        "query",
	Description: "query",
	Fields: graphql.Fields{
	//schemas文件夹名称,放graphql接收和返回字段
		"getList":           &schemas.GetList,
	},
})

// 定义根增删改节点
var mutation = graphql.NewObject(graphql.ObjectConfig{
	Name:        "mutation",
	Description: "mutation",
	Fields: graphql.Fields{
		"addProducts":              &schemas.AddProducts,
	},
})

// 定义Schema用于http handler处理
var Schema, _ = graphql.NewSchema(graphql.SchemaConfig{
	Query:    query,
	Mutation: mutation, // 需要通过GraphQL更新数据,可以定义Mutation
})

// 将graphql中的schema 放入gin的路由中
func GraphqlHandler() gin.HandlerFunc {
	h := handler.New(&handler.Config{
		Schema:   &Schema,
		Pretty:   true,
		GraphiQL: true,
	})

	// 只需要通过Gin简单封装即可
	return func(c *gin.Context) {
		h.ContextHandler(c, c.Writer, c.Request)
	}
}

4、在schemas创建product.go文件,写入接收参数和返回参数
package schemas

import (
	//resolves是具体要处理逻辑的方法所在的文件夹
	"c2matica.com/productcenter/graphql/resolves"
	//types是返回值封装到的文件夹
	"c2matica.com/productcenter/graphql/types"
	"github.com/graphql-go/graphql"
)
var GetBomList = graphql.Field{
	Name:        "GetList",
	Description: "GetList",
	//GetListOutputType在types文件夹里,也可以放到当前文件里
	Type:        types.GetListOutputType,
	// Args是定义在GraphQL查询中支持的查询字段,
	// 可自行随意定义,如加上limit,start这类
	Args: graphql.FieldConfigArgument{
		"name": &graphql.ArgumentConfig{
			Type: graphql.String,
		},
		"after": &graphql.ArgumentConfig{
			Type: graphql.Int,
		},
		"first": &graphql.ArgumentConfig{
			Type: graphql.Int,
		},
	},
	// Resolve是一个处理请求的函数,具体处理逻辑可在此进行
	Resolve: resolves.GetListResolve,
}
5、GetListOutputType里的内容
package types

import (
	"github.com/graphql-go/graphql"
)

// 定义查询对象的字段,支持嵌套
var GetListOutputType= graphql.NewObject(graphql.ObjectConfig{
	Name:        "GetListOutputType",
	Description: "GetListOutputType Model",
	Fields: graphql.Fields{
		"code": &graphql.Field{
			Type: graphql.String,
		},
		"message": &graphql.Field{
			Type: graphql.String,
		},
		"success": &graphql.Field{
			Type: graphql.Boolean,
		},
		"output": &graphql.Field{
		//InfoOutputType代表output是一维数组字段
			Type: InfoOutputType,
		},
		//graphql.NewList(ListNodeType)代表edges是二维数组字段
		"edges": &graphql.Field{
			Type: graphql.NewList(ListNodeType),
		},
		"totalCount": &graphql.Field{
			Type: graphql.Int,
		},
	},
})

var InfoOutputType= graphql.NewObject(graphql.ObjectConfig{
	Name:        "InfoOutputType",
	Description: "InfoOutputType Model",
	Fields: graphql.Fields{
		"id": &graphql.Field{
			Type: graphql.Int,
		},
	},
})

var ListNodeType = graphql.NewObject(graphql.ObjectConfig{
	Name:        "ListNodeType ",
	Description: "ListNodeType Model",
	Fields: graphql.Fields{
		"node": &graphql.Field{
			Type: DetailType,
		},
	},
})

var DetailType= graphql.NewObject(graphql.ObjectConfig{
	Name:        "DetailType",
	Description: "DetailType Model",
	Fields: graphql.Fields{
		"id": &graphql.Field{
			Type: graphql.String,
		},
	},
})
6、在resolve文件夹里创建go文件,实现GetListResolve方法
//p graphql.ResolveParams规定的接收方法,(data interface{}, err error)规定的返回方法,p和data和err可以改名字
func GetListResolve(p graphql.ResolveParams) (data interface{}, err error){
	//处理逻辑
	return
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用Gin和WebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用GolangGin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang Gin和WebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用GinGolang的标准库来构建强大的Web应用程序,并处理WebSocket通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值