.Net core 3.1 + GraphQL ==> "ошибка": "Неожиданный конец ввода JSON"
Я разработал веб-API.net core 3.1 и добавил к нему GraphQL и PlayGround. Когда я пытаюсь запустить Playground, я столкнулся с этой скучной ошибкой. Я слишком много раз гуглил, читал много статей и форумов об этом, пробовал их предлагаемые способы, но проблема все же существует. Кроме того, я должен сказать, что у меня нет этой проблемы с.net core 2.2.
Я решил упростить свое решение и удалить лишнюю листву из своего проекта и загрузить его вам, чтобы вы могли мне помочь. Упрощенная версия этого проекта, над которым я сейчас работаю, доступна здесь, на Google Диске.
Кроме того, я нашел решение с.net core 3.1, которое не имеет этой проблемы, но все же я не могу найти свою ошибку (и). Я загрузил это правильное решение здесь.
В этой упрощенной версии я не подключался к базе данных и не добавлял в проект никаких связанных с ней пакетов. Я возвращаю данные в памяти в этой упрощенной версии вместо обращения к базе данных.
Это изображение ошибки, с которой я столкнулся:
И файл .csproj упрощенного проекта выглядит следующим образом:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>NetCore3._1GraphQL</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="graphiql" Version="1.2.0" />
<PackageReference Include="GraphQL" Version="3.0.0-preview-1352" />
<PackageReference Include="GraphQL.Server.Ui.Playground" Version="3.4.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.1" />
<PackageReference Include="RandomNameGeneratorLibrary" Version="1.2.2" />
</ItemGroup>
</Project>
2 ответа
В зависимости от упрощенного и ошибочного проекта, на самом деле он настроен с маршрутизацией, которая сопоставляет конечную точку с контроллером, но не содержит соответствующего контроллера. Итак, сервер возвращает ответ 404, а игровая площадка graphql выдает сообщение об ошибке. Добавление контроллера (или промежуточного программного обеспечения) заставило его работать.
Ниже приведены изменения в упрощенном и ошибочном проекте, которые заставили его работать:
- Добавьте соответствие контроллера API
/graphql
маршрутизация.
// GraphqlController.cs
// using statements are omitted
namespace NetCore3._1GraphQL.Controllers
{
[ApiController]
[Route("[controller]")]
public class GraphqlController : ControllerBase
{
private readonly IServiceProvider _provider;
private readonly IDocumentExecuter _executer;
private readonly IDataLoaderContextAccessor _loader;
public GraphqlController(
IDocumentExecuter executer,
IServiceProvider provider,
IDataLoaderContextAccessor loader)
{
_executer = executer;
_provider = provider;
_loader = loader;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] GraphQLRequest graphQLRequest)
{
if (graphQLRequest == null)
{
throw new ArgumentNullException(nameof(graphQLRequest));
}
var _query = graphQLRequest.Query;
var _inputs = graphQLRequest.Variables?.ToObject<Inputs>();
var _options = new ExecutionOptions
{
Schema = new GraphQLSchema(_provider)
{
Query = new GraphQLQuery(_loader),
},
Query = _query,
Inputs = _inputs,
FieldNameConverter = new PascalCaseFieldNameConverter()
};
try
{
var result = await _executer.ExecuteAsync(_options).ConfigureAwait(false);
if (result.Errors?.Count > 0)
{
return BadRequest(result);
}
return Ok(result);
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
}
}
Раскомментировать строку
public JObject Variables { get; set; }
вBaseGraphQLQuery.cs
.class является реализацией запроса GraphQL, а не запроса GraphQL. Переименуйте его как
GraphQLRequest
или измените имя параметра в почтовом действии контроллера наBaseGraphQLQuery
.
добавить в startup.cs
public void ConfigureServices(IServiceCollection services)
{
//add this
services.AddSingleton<MyAppSchema>();
}