В этой статье пример того, как создать GraphQL с использованием graphql-go и реализации GraphQL для Go/Golang.
Есть несколько интересных фреймворков, с которых вы можете начать при создании API-интерфейсов GraphQL с помощью Go. Вот некоторые из веб-сайта GraphQL :
- graphql-go : реализация GraphQL для Go/Golang.
- GQLGen - Go : генерирует основанную библиотеку GraphGL-сервера.
- graphql-relay-go : библиотека Go / Golang, помогающая создать сервер graphql-go с поддержкой response-relay.
- machinebox / graphql : низкоуровневый HTTP-клиент для GraphQL.
- samsarahq / thunder : реализация GraphQL с простым построением схемы, оперативными запросами и пакетированием.
В этом примере мы будем использовать graphql-go, первый в списке.
Ниже наша основная функция. В 3 строке мы создаем обработчик GraphiQL. Он включит GraphiQL для нашего сервера API, поэтому он не должен запускаться отдельно. GraphiQL - это браузерный инструмент для изучения API-интерфейсов GraphQL. Позже, когда мы закончим с кодом, мы сможем увидеть, как выглядит GraphiQL.
Поскольку мы хотели, чтобы наш сервер принимал запросы с использованием http, мы создали сервер в строке 10, работающий в порту 3000, с использованием стандартного пакета http. Нам также нужно обрабатывать запросы GraphQL, поэтому мы создали для него обработчик gqlHandler.
func main() {
graphiqlHandler, err := graphiql.NewGraphiqlHandler("/graphql")
if err != nil {
panic(err)
}
http.Handle("/graphql", gqlHandler())
http.Handle("/graphiql", graphiqlHandler)
http.ListenAndServe(":3000", nil)
}
Ниже приведен код обработчика. В этой функции мы получаем запрос и декодируем его в json. Если при синтаксическом анализе json произошла ошибка, мы возвращаем HTTP-ошибку 400.
После этого функция processQuery () вызывается передачей в запросе.
func gqlHandler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Body == nil {
http.Error(w, "No query data", 400)
return
}
var rBody reqBody
err := json.NewDecoder(r.Body).Decode(&rBody)
if err != nil {
http.Error(w, "Error parsing JSON request body", 400)
}
fmt.Fprintf(w, "%s", processQuery(rBody.Query))
})
}
Вот как выглядит наша функция Query (). Мы извлекаем данные из файла json на данный момент, используя функцию dataFromJSON (), но в идеале это должен быть запрос к базе данных. После получения данных, которые мы будем использовать, мы вызываем gqlSchema (jobsData), который создает схему GraphQL из наших данных. jobsData - это фрагмент структур Job, содержащий данные из нашего файла json.
func processQuery(query string) (result string) {
jobsData := dataFromJSON()
params := graphql.Params{Schema: gqlSchema(jobsData), RequestString: query}
r := graphql.Do(params)
if len(r.Errors) > 0 {
fmt.Printf("failed to execute graphql operation, errors: %+v", r.Errors)
}
rJSON, _ := json.Marshal(r)
return fmt.Sprintf("%s", rJSON)
}
Волшебство GraphQL происходит в функции gqlSchema (jobsData). В этом примере у нас есть поддержка 2 запросов, / jobs и jobs / {id}
- / jobs - возвращает все задания (строка 3)
- / jobs / {id} - поддерживает идентификатор одного аргумента и возвращает одно задание, отфильтрованное по идентификатору (строка 10)
Resolvers для обеих функций находятся в строках 6 и 18. Resolvers отвечают за возврат данных для запроса.
func gqlSchema(jobsData []Job) graphql.Schema {
fields := graphql.Fields{
"jobs": &graphql.Field{
Type: graphql.NewList(jobType),
Description: "All Jobs",
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
return jobsData, nil
},
},
"job": &graphql.Field{
Type: jobType,
Description: "Get Jobs by ID",
Args: graphql.FieldConfigArgument{
"id": &graphql.ArgumentConfig{
Type: graphql.Int,
},
},
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
id, success := params.Args["id"].(int)
if success {
for _, job := range jobsData {
if int(job.ID) == id {
return job, nil
}
}
}
return nil, nil
},
},
}
rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
schema, err := graphql.NewSchema(schemaConfig)
if err != nil {
fmt.Printf("failed to create new schema, error: %v", err)
}
return schema
}
Запустите сервер API GraphQL
git clone https://github.com/donvito/go-graphql-server-example.git
cd go-graphql-server-example/src/cmd/server/
go run main.go
Доступ к GraphiQL после запуска сервера
Теперь мы создали GraphQL API с помощью Go.
Полный исходный код доступен в репозитории github.
https://github.com/donvito/go-graphql-server-example
Рекомендации
https://github.com/graphql-go/graphql
https://github.com/friendsofgo/graphiql
https://graphql.org/code/#go
Надеюсь, что это поможет любому, кто начинает с Go и GraphQL!
0 комментариев
Добавить комментарий