美文网首页
gqlgen初体验(三)

gqlgen初体验(三)

作者: 戈壁堂 | 来源:发表于2021-05-12 20:20 被阅读0次

    继续Building a GraphQL API in Go using gqlgen中的第五步

    接口定义与实现

    • 先定义接口interface,以及接口中可能用到的结构体。例如pkg/todo_service.go
    type ToDoItem struct {
        Id        string
        Text      string
        IsDone    bool
        CreatedOn time.Time
        UpdatedOn *time.Time
    }
    
    type ToDo interface {
        Initialise() error
        Create(text string, isDone bool) (*string, error)
        Update(id string, text string, isDone bool) error
        List() ([]ToDoItem, error)
    }
    
    • 定义接口的实现对象结构体。让此结构体实现上述所有的接口方法。go语言中任意实现了所有接口中定义的方法的对象,都默认实现了此接口。例如pkg/imp/todo_service.go
    
    type ToDoImpl struct {
        DbUserName string
        DbPassword string
        DbURL      string
        DbName     string
    }
    
    func (t *ToDoImpl) Initialise() error {...}
    
    func (t *ToDoImpl) Create(text string, isDone bool) (*string, error) {...}
    
    func (t *ToDoImpl) Update(id string, text string, isDone bool) error {...}
    
    func (t *ToDoImpl) List() ([]todo.ToDoItem, error) {...}
    

    graphql请求与响应

    • 通常就两类主要的请求:一种为查询query;一种为变更mutation。通常在在schema.graphl文件中定义
    schema {
        query: MyQuery
        mutation: MyMutation
    }
    
    type MyQuery {
        todos: [Todo!]!
    }
    
    type MyMutation {
        createTodo(todo: TodoInput!): Todo!
    }
    
    • 响应会在对应的schema.resolver.go文件中实现。默认有一个resolver.go文件,可以一行实现type Resolver struct{}。关键的是对请求和响应的声明:
    // MyMutation returns generated.MyMutationResolver implementation.
    func (r *Resolver) MyMutation() generated.MyMutationResolver { return &myMutationResolver{r} }
    
    // MyQuery returns generated.MyQueryResolver implementation.
    func (r *Resolver) MyQuery() generated.MyQueryResolver { return &myQueryResolver{r} }
    
    type myMutationResolver struct{ *Resolver }
    type myQueryResolver struct{ *Resolver }
    
    
    • 然后在对应的resolver中实现graphql文件中的各种查询和变更的方法,gqlgen默认实现的方法只包含一句panic(fmt.Errorf("not implemented"))
    func (r *myQueryResolver) Todo(ctx context.Context, id string) (*model.Todo, error) {...}
    func (r *myMutationResolver) CreateTodo(ctx context.Context, todo model.TodoInput) (*model.Todo, error) {...}
    

    在对应resolver具体的方法实现中调用上述“接口方法”。完成对请求的最终响应。

    最终对graphql的请求处理,gqlgen会最终生成generated.go(具体名称有配置文件定义)作为运行时响应

    相关文章

      网友评论

          本文标题:gqlgen初体验(三)

          本文链接:https://www.haomeiwen.com/subject/mocndltx.html