gqlgen golang graphql server 基本试用

gqlgen golang 的graphql server

具体代码参考https://github.com/rongfengliang/gqlgen-demo

特点

  • 模型优先
  • 类型安全
  • 代码生成

安装

go get -u github.com/vektah/gqlgen

创建schema

schema.graphql

type Todo {
id: ID!
text: String!
done: Boolean!
user: User!
}

type User {
id: ID!
name: String!
}

type Query {
todos: [Todo!]!
}

input NewTodo {
text: String!
userId: String!
}

type Mutation {
createTodo(input: NewTodo!): Todo!
}

创建model

  • User (model/user.go)
package model

// User user info
type User struct {
    ID string
    Name string
}
  • Todo (model/todo.go)
package model

// Todo todo ino
type Todo struct {
    ID string
    Text string
    Done bool
    UserID string
}

生成graphql 运行时代码

  • 配置模型关联

    gqlgen.yml

schema: schema.graphql
exec:
  filename: graph/generated.go
model:
  filename: model/generated.go

models:
  Todo:
    model: github.com/rongfengliang/gqlgen-app/model.Todo
  User:
    model: github.com/rongfengliang/gqlgen-app/model.User
  • 生成bingings
gqlgen

  • 编写 resolver

    graph/graph.go

package graph

import (
    "context"
    "fmt"
    "math/rand"

    model "github.com/rongfengliang/gqlgen-app/model"
)

type App struct {
    todos []model.Todo
}

func (a *App) Mutation() MutationResolver {
    return &mutationResolver{a}
}

func (a *App) Query() QueryResolver {
    return &queryResolver{a}
}

func (a *App) Todo() TodoResolver {
    return &todoResolver{a}
}

type queryResolver struct{ *App }

func (a *queryResolver) Todos(ctx context.Context) ([]model.Todo, error) {
    return a.todos, nil
}

type mutationResolver struct{ *App }

func (a *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (model.Todo, error) {
    todo := model.Todo{
        Text: input.Text,
        ID: fmt.Sprintf("T%d", rand.Int()),
        UserID: input.UserId,
    }
    a.todos = append(a.todos, todo)
    return todo, nil
}

type todoResolver struct{ *App }

func (a *todoResolver) User(ctx context.Context, it *model.Todo) (model.User, error) {
    return model.User{ID: it.UserID, Name: "user " + it.UserID}, nil
}

入口代码编写

  • main.go
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/rongfengliang/gqlgen-app/graph"
    "github.com/vektah/gqlgen/handler"
)

func main() {
    http.Handle("/", handler.Playground("Todo", "/query"))
    http.Handle("/query", handler.GraphQL(graph.NewExecutableSchema(&graph.App{})))

    fmt.Println("Listening on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

运行

go run main.go

效果


集成dep

dep init 

参考资料

https://gqlgen.com/getting-started/
https://github.com/vektah/gqlgen
https://github.com/rongfengliang/gqlgen-demo

posted on   荣锋亮  阅读(1591)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2014-07-25 Oracle 多行合并一行 方法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示