Golang 中的 GraphQL:校验输入数据

GraphQL 是一种用于 API 的查询语言,它提供了一种更高效、强类型、易于理解的 API 设计方式。在 Golang 中,我们可以使用 graphql-go 库来实现 GraphQL API。

在实现 GraphQL API 时,我们需要对输入数据进行校验,以确保数据的合法性和完整性。本文将介绍如何在 Golang 中使用 graphql-go 库来校验输入数据。

校验输入数据

在 GraphQL 中,我们可以使用输入类型(Input Type)来定义输入数据的结构。输入类型和对象类型(Object Type)类似,但是输入类型只用于输入参数,不能用于返回值。定义输入类型时,我们可以使用 Go 的结构体来表示输入数据的结构。

例如,我们可以定义一个输入类型来表示一个用户的信息:

type UserInput struct {
    Name     string `json:"name"`
    Email    string `json:"email"`
    Password string `json:"password"`
}

接着,我们可以定义一个 GraphQL 查询类型,该查询类型接受一个 UserInput 类型的参数:

var rootQuery = graphql.NewObject(graphql.ObjectConfig{
    Name: "Query",
    Fields: graphql.Fields{
        "user": &graphql.Field{
            Type: userType,
            Args: graphql.FieldConfigArgument{
                "input": &graphql.ArgumentConfig{
                    Type: graphql.NewNonNull(userInputType),
                },
            },
            Resolve: func(params graphql.ResolveParams) (interface{}, error) {
                userInput, ok := params.Args["input"].(map[string]interface{})
                if !ok {
                    return nil, errors.New("invalid input")
                }

                // 处理用户信息
            },
        },
    },
})

在上面的示例中,我们使用 graphql.NewNonNull() 函数来指定输入参数为必填参数。如果客户端没有提供该参数,GraphQL 会返回一个错误。

在 Resolve 函数中,我们首先将输入参数转换为 UserInput 类型,然后对数据进行校验。如果数据不合法,我们可以返回一个错误,GraphQL 会将该错误返回给客户端。

总结

在 Golang 中使用 graphql-go 库实现 GraphQL API 时,我们需要对输入数据进行校验,以确保数据的合法性和完整性。通过定义输入类型和使用 graphql.NewNonNull() 函数来指定必填参数,我们可以轻松地校验输入数据。在实际开发中,我们需要根据业务需求来定义输入类型和校验规则,以提高代码的可用性和可维护性。

示例代码

完整的示例代码如下:

package main

import (
    "errors"

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

type UserInput struct {
    Name     string `json:"name"`
    Email    string `json:"email"`
    Password string `json:"password"`
}

var userInputType = graphql.NewInputObject(graphql.InputObjectConfig{
    Name: "UserInput",
    Fields: graphql.InputObjectConfigFieldMap{
        "name": &graphql.InputObjectFieldConfig{
            Type: graphql.NewNonNull(graphql.String),
        },
        "email": &graphql.InputObjectFieldConfig{
            Type: graphql.NewNonNull(graphql.String),
        },
        "password": &graphql.InputObjectFieldConfig{
            Type: graphql.NewNonNull(graphql.String),
        },
    },
})

var userType = graphql.NewObject(graphql.ObjectConfig{
    Name: "User",
    Fields: graphql.Fields{
        "name": &graphql.Field{
            Type: graphql.String,
        },
        "email": &graphql.Field{
            Type: graphql.String,
        },
    },
})

var rootQuery = graphql.NewObject(graphql.ObjectConfig{
    Name: "Query",
    Fields: graphql.Fields{
        "user": &graphql.Field{
            Type: userType,
            Args: graphql.FieldConfigArgument{
                "input": &graphql.ArgumentConfig{
                    Type: graphql.NewNonNull(userInputType),
                },
            },
            Resolve: func(params graphql.ResolveParams) (interface{}, error) {
                userInput, ok := params.Args["input"].(map[string]interface{})
                if !ok {
                    return nil, errors.New("invalid input")
                }

                // 处理用户信息

                return &User{
                    Name:  userInput["name"].(string),
                    Email: userInput["email"].(string),
                }, nil
            },
        },
    },
})

func main() {
    schema, err := graphql.NewSchema(graphql.SchemaConfig{
        Query: rootQuery,
    })
    if err != nil {
        panic(err)
    }

    // 处理 GraphQL 请求
}

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658d6886eb4cecbf2d35d08c


纠错
反馈