继续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
(具体名称有配置文件定义)作为运行时响应
网友评论