zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python 文件路径拼接、判断、创建、输出
    热力图制作
    矩阵文件添加列标签
    cmd运行 ‘.py’ 文件
    hdu 2017 字符串统计
    hdu 2016 数据的交换输出
    hdu 2014 青年歌手大奖赛_评委会打分
    hdu 2013 蟠桃记
    hdu 2012 素数判定
    hdu 2011 多项式求和
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/9364783.html
Copyright © 2011-2022 走看看