通过操作名称查询graphql-dotnet

时间:2019-02-25 13:31:05

标签: c# graphql graphql-dotnet

我正在使用graphql-dotnet在Net Core 2.2 Web API中构建graphql服务器。

架构说明:

我有一个ObjectGraphType,如下所示

public class UserType
        : ObjectGraphType<Users>
    {
        public UserType()
        {
            Field(x => x.ContactNumber);
            Field(x => x.Email, true);
            Field(x => x.Fax);    
        }
    }
}

我有一个类似的查询定义

public class UserOperationNameQuery
         : ObjectGraphType
    {
        public UserOperationNameQuery()
        {
            Name = "getAllUsers";
            Field<ListGraphType<UserType>>(name: "items", description: "Get all users",
            resolve: context =>
            {
               // resolver
            });
        }

我的模式是

public class GraphQLSchema
        : Schema
    {
        public GraphQLSchema(IDependencyResolver resolver) 
            : base(resolver)
        {            
            Query = resolver.Resolve<UserOperationNameQuery>();
        }
    }

我的控制器方法是:

        [HttpPost]
        public async Task<IActionResult> Post([FromBody] GraphQLQuery query)
        {
            if (query == null) { throw new ArgumentNullException(nameof(query)); }
            var inputs = query.Variables.ToInputs();
            var executionOptions = new ExecutionOptions
            {
                Schema = _schema,
                Query = query.Query,
                Inputs = inputs,
                OperationName = query.OperationName,                
            };

            var result = await _documentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);

            if (result.Errors?.Count > 0)
            {
                return BadRequest(result);
            }

            return Ok(result);
        }

查询:

我发送此查询

query getAllUsers
{
    items {
      email
  }
}

是作品。
但是,如果我在任何值上更改操作名称,查询也会执行并获得用户。

query getAllCompanies
{
    items {
      email
  }
}

我可以在请求中写入任何操作名称,它将成功执行。


我只想通过可以在定义模式中设置的某些操作名称(在我的情况下为getAllUsers)询问用户。另外,如果我跳过操作名称,则不应执行该请求。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您将getAllUsers()映射到错误的位置,您应该将该方法映射为RootQuery中的ListGraphType,然后在调用类似的内容时,它应该返回所有用户。

query getAllUsers
   {
   users
   items {
     email
        }
   }

请注意,查询getAllUsers是任意的,您可以将其更改为查询getWhatEver,仍然会得到相同的结果。 但是,通过上面的此graphql查询,您将返回具有项目字段的用户列表,并且项目具有电子邮件字段。如果只想返回一个对象,则需要映射一个UserType字段,这实际上将返回您正在寻找的对象。

如果您这样编写查询,查询也将在没有查询GetAllUsers的情况下执行

   {
   users
   items {
     email
        }
   }

再检查一次文档和示例以得到更多说明。