我正在使用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
)询问用户。另外,如果我跳过操作名称,则不应执行该请求。
我该怎么办?
答案 0 :(得分:0)
您将getAllUsers()映射到错误的位置,您应该将该方法映射为RootQuery中的ListGraphType,然后在调用类似的内容时,它应该返回所有用户。
query getAllUsers
{
users
items {
email
}
}
请注意,查询getAllUsers是任意的,您可以将其更改为查询getWhatEver,仍然会得到相同的结果。 但是,通过上面的此graphql查询,您将返回具有项目字段的用户列表,并且项目具有电子邮件字段。如果只想返回一个对象,则需要映射一个UserType字段,这实际上将返回您正在寻找的对象。
如果您这样编写查询,查询也将在没有查询GetAllUsers的情况下执行
{
users
items {
email
}
}
再检查一次文档和示例以得到更多说明。