Запрос graphql-dotnet по имени операции
Я использую https://graphql-dotnet.github.io/ для построения сервера graphql в Net Core 2.2 Web API.
Описание схемы:
у меня есть 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 ответов
Вы сопоставляете getAllUsers() не в том месте, вы должны сопоставить этот метод как ListGraphType в RootQuery, тогда, когда вы вызываете что-то подобное, он должен вернуть вам всех пользователей.
query getAllUsers
{
users
items {
email
}
}
Обратите внимание, что запрос getAllUsers является произвольным, и вы можете изменить его на запрос getWhatEver, и вы все равно получите тот же результат. Но с помощью этого запроса graphql выше вы возвращаете список пользователей, у которых есть поле элементов, а у элементов есть поле электронной почты. Если вы хотите вернуть только объект, вам нужно сопоставить поле UserType, которое, по сути, вернет вам объект, который вы ищете.
Запрос также будет выполняться без запроса GetAllUsers, если вы напишете его так
{
users
items {
email
}
}
Проверьте документацию и примеры еще раз для получения дополнительных разъяснений.