graphql学习(二)

简介:

昨天完成了hello world,今天接着做getAll和getOne,主要是学习传参和参数处理.

新建models目录,增加article.go文件,内容如下:

package models

import "errors"

type Article struct {
    ID      int    `json:"id"`
    Title   string `json:"title"`
    Content string `json:"content"`
}

// For this demo, we're storing the article list in memory
var articleList = []Article{
    Article{ID: 1, Title: "Article 1,文章1", Content: "Article 1 body,中国加油"},
    Article{ID: 2, Title: "Article 2,文章2", Content: "Article 2 body,武汉加油"},
}

// Return a list of all the articles
func GetAllArticles() []Article {
    return articleList
}

// Get article
func GetArticleByID(id int) (*Article, error) {
    for _, a := range articleList {
        if a.ID == id {
            return &a, nil
        }
    }
    return nil, errors.New("Article not found")
}

很简单,定义了Article结构体,然后初始化了一个slice,里面有两篇文章.定义了两个函数,一个是返回全部的文章,一个是根据id查找单篇文章.

接下来,新建schema目录,增加article.go文件:

package schema

import (
    "errors"
    "graphqldemo/models"

    "github.com/graphql-go/graphql"
)

// 定义查询对象的字段,支持嵌套
var articleType = graphql.NewObject(graphql.ObjectConfig{
    Name:        "Article",
    Description: "Article Model",
    Fields: graphql.Fields{
        "id": &graphql.Field{
            Type: graphql.Int,
        },
        "title": &graphql.Field{
            Type: graphql.String,
        },
        "content": &graphql.Field{
            Type: graphql.String,
        },
    },
})

// 处理查询请求,获取文章列表
var queryArticles = graphql.Field{
    Name:        "QueryArticles",
    Description: "Query Article List",
    Type:        graphql.NewList(articleType),
    // 无需处理参数
    // Resolve是一个处理请求的函数,具体处理逻辑可在此进行
    Resolve: func(p graphql.ResolveParams) (result interface{}, err error) {
        // 调用Article的models里面的方法查询数据
        result = models.GetAllArticles()

        return result, nil
    },
}

// 查询单篇文章
var queryArticle = graphql.Field{
    Name:        "QueryArticle",
    Description: "Query Article",
    Type:        articleType,
    // Args是定义在GraphQL查询中支持的查询字段,
    // 可自行随意定义,如加上limit,start这类
    Args: graphql.FieldConfigArgument{
        "id": &graphql.ArgumentConfig{
            Type: graphql.Int,
        },
    },
    // Resolve是一个处理请求的函数,具体处理逻辑可在此进行
    Resolve: func(p graphql.ResolveParams) (result interface{}, err error) {
        // Args里面定义的字段在p.Args里面,对应的取出来
        // 因为是interface{}的值,需要类型转换
        id, ok := p.Args["id"].(int)
        if !ok {
            return nil, errors.New("missing required arguments: id. ")
        }

        result, err = models.GetArticleByID(id)

        // 调用Hello这个model里面的Query方法查询数据
        return result, err
    },
}

// 定义根查询节点及各种查询
var rootQuery = graphql.NewObject(graphql.ObjectConfig{
    Name:        "RootQuery",
    Description: "Root Query",
    Fields: graphql.Fields{
        "articles": &queryArticles,  //分别对应前面定义的query
        "article":  &queryArticle,
    },
})

// 定义Schema用于http handler处理
var Schema, _ = graphql.NewSchema(graphql.SchemaConfig{
    Query:    rootQuery,
    Mutation: nil,
})

这个文件把昨天main.go里的很多关于graphql的有关内容,都移到这里.
这里的两个query,分别对应了返回所有文章和单篇文章,特别是单篇文章处理,增加了Args部分,同时增加了Resolve对于如何获取参数内容.

现在的main.go就变成了这样:

package main

import (
    "fmt"
    "graphqldemo/schema"
    "net/http"

    "github.com/graphql-go/handler"
)

// main
func main() {
    h := Register()
    http.Handle("/graphql", h)
    fmt.Println("Now server is running on port 8080")
    http.ListenAndServe(":8080", nil)
}

// 初始化handler
func Register() *handler.Handler {
    h := handler.New(&handler.Config{
        Schema:   &schema.Schema,
        Pretty:   true,
        GraphiQL: true,
    })
    return h
}

编译执行后,打开浏览器,
image
注意左侧的传参格式,还有最右侧的Docs.
graphql的优势之一来了,再也不用操心swagger了.

到现在为止,我们的目录结构如下:
image

除了使用浏览器,我们还可以使用postman来调试:
image

目录
相关文章
|
8月前
|
前端开发 数据管理 API
探究GraphQL在前端开发中的实际应用
在如今越来越复杂的前端应用程序中,数据管理变得更加困难,因此GraphQL成为了越来越受欢迎的解决方案。本文将介绍GraphQL在前端开发中的应用,以及它对开发过程所带来的好处。
|
5月前
|
API 开发者
GraphQL全面深度讲解
GraphQL是一种查询语言和运行引擎,允许开发者在一个请求中自定义并获取所有所需数据,提供准确且无冗余的数据返回,但可能需要开发者学习新的语言并投入更多时间来维护数据模型。
136 5
GraphQL全面深度讲解
|
1月前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 与 REST 比较
本文对比了REST和GraphQL两种流行的API设计风格,从概念、优缺点及C#实现角度进行了详细分析,并提供了代码示例。REST以其简单易懂和无状态特性著称,而GraphQL则通过精确获取和单次请求的优势,提高了数据获取效率。文章还讨论了常见问题与解决策略,帮助开发者根据实际需求选择合适的API设计风格。
60 10
|
8月前
|
SQL 前端开发 API
前端需要学GraphQL 吗?
前端需要学GraphQL 吗?
79 2
|
8月前
|
API 开发者 网络架构
从REST到GraphQL:探究GraphQL的概念与实践
RESTful API曾经是互联网应用程序的主流,但它也存在着一些限制。随着GraphQL的出现,开发者们可以更加自由地定义和查询API,提高了应用程序的灵活性和可扩展性。本文将深入探讨GraphQL的概念和实践,并介绍如何在应用程序中使用GraphQL。
49 6
|
8月前
|
前端开发 API UED
深入浅出GraphQL:理解与实践
本文将以清晰易懂的方式介绍GraphQL的概念及其实际应用。通过对比RESTful API和GraphQL的特点,阐述GraphQL在数据查询和交互方面的优势。同时,将探讨GraphQL在现代软件开发中的实际应用,并提供一些最佳实践指南。无论您是初学者还是有经验的开发者,都能从本文中获得有益的启发和指导。
|
API
GraphQL
GraphQL
71 0
|
JavaScript Go
搭建GraphQL服务
搭建GraphQL服务
94 0
|
存储 Java API
大厂都在实践的GraphQL,你了解吗?
大厂都在实践的GraphQL,你了解吗?
195 0
GraphQL 是干什么的?底层原理是什么?
GraphQL 是干什么的?底层原理是什么?
427 0