是什么启发了我写这篇文章

GraphQL 正在我的实习网站上使用,所以我想我实际上会尝试在手边运行它。
它是根据原始教程和作为参考的文章内容编写的。
这篇文章是Go Conference mini 2022 Autumn IN仙台它也用于公告中

这篇文章写了什么

如何使用 gqlgen 设置服务器

客户端详解

什么是 GraphQL

GraphQL、gqlgen を使って サーバ を立てる

  • 由 Facebook 创建的 OSS
  • 为 API 设计的查询语言
  • 查询现有数据的运行时

客户端

↓ 请看幻灯片。它还描述了 GraphQL 的优缺点。

什么是gqlgen

GraphQL、gqlgen を使って サーバ を立てる

  • gqlgen 是一个用于轻松构建 GraphQL 服务器的 Go 库。
  • gqlgen 基于模式优先的方法
  • Gqlgen 更喜欢类型安全
  • gqlgen 启用 Codegen

让我们尝试一下

设置服务器

https://github.com/99designs/gqlgen

1.创建工作目录并初始化

mkdir gqlgen-server

cd gqlgen-server

go mod init gqlgen-server

2.将github.com/99designs/gqlgen添加到tools.go

printf '// +build tools
package tools
import (_ "github.com/99designs/gqlgen"
 _ "github.com/99designs/gqlgen/graphql/introspection")' | gofmt > tools.go

go mod tidy

3.初始化gqlgen设置并生成模型

go run github.com/99designs/gqlgen init

4.启动gqlgen服务器

go run server.go

您现在已经启动了服务器。
如果输出看起来像 ↓ ,你就成功了!
GraphQL、gqlgen を使って サーバ を立てる
http://localhost:8080/当您访问时,您会像↓一样跳转到客户端屏幕。
在这里,您可以编写 GraphQL 请求 querymutation 来发出请求。
GraphQL、gqlgen を使って サーバ を立てる

目录结构

├── go.mod
├── go.sum
├── gqlgen.yml               - gqlgen の設定ファイル。生成されたコードを制御する
├── graph
│   ├── generated            - 生成されたランタイムのみが含まれるパッケージ
│   │   └── generated.go
│   ├── model                - すべての graph model 用のパッケージ
│   │   └── models_gen.go
│   ├── resolver.go          - root graph resolver タイプ。このファイルは再生成されない
│   ├── schema.graphqls      - スキーマが書かれているファイル。好きなようにいじって大丈夫
│   └── schema.resolvers.go  - schema.graphql の resolver 実装。
└── server.go                - エントリーポイント。カスタマイズできる

练习部分

看看文件

应该生成像↓ 这样的模式。

架构.graphqls
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!
}

要更改的文件

图/resolver.go
type Resolver struct{
    // ↓ の一行を追加 
	todos []*model.Todo
}

可能存在无法正常导入的包,请检查是否报错。

换个样子↓
实现自动生成的解析器函数的主体。
对于 CreateTodo,我们使用 math.rand 包返回一个带有随机生成 ID 的 Todo,并将其存储在内存中的 Todo 列表中。

图/schema.resolvers.go
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
	todo := &model.Todo{
		Text:   input.Text,
		ID:     fmt.Sprintf("T%d", rand.Int()),
		User: &model.User{ID: input.UserID, Name: "user " + input.UserID},
	}
	r.todos = append(r.todos, todo)
	return todo, nil
}

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

现在您已准备好将请求发送到服务器。

再次启动服务器

go run server.go

创建待办事项

http://localhost:8080/在这里写下您的要求

要求

mutation createTodo {
  createTodo(input: { text: "todo", userId: "3" }) {
    user {
      id
    }
    text
    done
  }
}

回复

{
  "data": {
    "createTodo": {
      "user": {
        "id": "3"
      },
      "text": "todo",
      "done": false
    }
  }
}

得到待办事项

http://localhost:8080/在这里写下您的要求

要求

query findTodos {
  todos {
    id
    text
    done
    user {
      name
    	id
    }
  }
}

回复

{
  "data": {
    "todos": [
      {
        "id": "T5577006791947779410",
        "text": "todo",
        "done": false,
        "user": {
          "name": "user 3",
          "id": "3"
        }
      }
    ]
  }
}

就这样! !

在最后

我第一次为qiita写了一篇文章。我学会了整理我的知识!我想如果我能在这种情况下输出就好了。
另外,我希望这篇文章对您有所帮助。

我想去博多。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308629694.html

相关文章:

  • 2021-09-03
  • 2022-01-15
  • 2021-12-26
  • 2022-02-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-07
  • 2022-12-23
  • 2021-08-21
  • 2021-12-21
  • 2021-04-11
  • 2021-10-31
  • 2022-01-11
相关资源
相似解决方案