Ни один :)
HttpRequestInterceptor предназначен для обогащения запроса GraphQL контекстными данными.
С другой стороны, DiagnosticEventListener предназначен для ведения журнала или других инструментов.
Если вы хотите вести журнал аудита, вам следует использовать промежуточное ПО для запросов. Промежуточное ПО запроса может быть добавлено следующим образом.
services
.AddGraphQLServer()
.AddQueryType<Query>()
.UseRequest(next => async context =>
{
})
.UseDefaultPipeline();
Сложность здесь - проверить запрос в нужное время. Вместо добавления в конвейер по умолчанию вы можете определить свой собственный конвейер, как показано ниже.
services
.AddGraphQLServer()
.AddQueryType<Query>()
.UseInstrumentations()
.UseExceptions()
.UseTimeout()
.UseDocumentCache()
.UseDocumentParser()
.UseDocumentValidation()
.UseRequest(next => async context =>
{
// write your audit log here and invoke next if the user is allowed to execute
if(isNotAllowed)
{
// if the user is not allowed to proceed create an error result.
context.Result = QueryResultBuilder.CreateError(
ErrorBuilder.New()
.SetMessage("Something is broken")
.SetCode("Some Error Code")
.Build())
}
else
{
await next(context);
}
})
.UseOperationCache()
.UseOperationResolver()
.UseOperationVariableCoercion()
.UseOperationExecution();
Конвейер в основном является конвейером по умолчанию, но добавляет ваше промежуточное ПО сразу после проверки документа. На этом этапе ваш запрос GraphQL анализируется и проверяется. Это означает, что мы знаем, что на данном этапе может быть обработан действительный запрос GraphQL. Это также означает, что мы можем использовать свойство context.Document
, которое содержит проанализированный запрос GraphQL.
Чтобы преобразовать документ в форматированную строку, используйте context.Document.ToString(indented: true)
.
Хорошо то, что в промежуточном программном обеспечении мы находимся в асинхронном контексте, что означает, что вы можете легко получить доступ к базе данных и так далее. В отличие от этого, DiagnosticEvents синхронизируются и не рассчитаны на большую рабочую нагрузку.
Промежуточное ПО также можно обернуть в класс вместо делегата.
Если вам нужна дополнительная помощь, присоединяйтесь к нам в Slack.
Нажмите на поддержку сообщества, чтобы присоединиться к каналу Slack: https://github.com/ChilliCream/hotchocolate/issues/new/choose
person
Michael Ingmar Staib
schedule
07.05.2021