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

  • 相关阅读:
    vim文本替换命令
    Python线程优先级队列(Queue)
    Python线程同步
    Python使用Threading模块创建线程
    Python的isdigit()和isalpha()
    python判断unicode是否是汉字,数字,英文,或者其他字符
    理解Python的With语句
    K-means聚类算法(转)
    先验概率、后验概率以及共轭先验(转)
    经典动态规划python实现
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/9364783.html
Copyright © 2011-2022 走看看