http://localhost:49915/api/graphql не работает обновление контроллера Route GraphQL - PullRequest
0 голосов
/ 18 ноября 2018

Я обновил значение Route с [Route ("[controller]")] на [Route ("api / graphql")] для нижеупомянутого GraphQLController.

[Route("api/graphql")]
public class GraphQLController : Controller
{
    private readonly IDocumentExecuter _documentExecuter;
    private readonly ISchema _schema;
    public GraphQLController(ISchema schema, IDocumentExecuter documentExecuter)
    {
        _schema = schema;
        _documentExecuter = documentExecuter;
    }

    [HttpPost]
    public async Task<IActionResult> Post([FromBody] GraphQLQuery query)
    {
        if (query == null)
        {
            throw new ArgumentNullException(nameof(query));
        }

        if (string.IsNullOrWhiteSpace(query.Query))
        {
            throw new ExecutionError("A query is required.");
        }

        var inputs = query.Variables.ToInputs();
        var executionOptions = new ExecutionOptions{Schema = _schema, Query = query.Query, Inputs = inputs};
        var result = await _documentExecuter.ExecuteAsync(executionOptions).ConfigureAwait(false);
        if (result.Errors?.Count > 0)
        {
            return BadRequest(result);
        }

        return Ok(result);
    }
}

Здесь идет запуск.cs, который имеет код для Graphiql: //Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration
    {
        get;
    }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        //services.AddDbContext<NHLStatsContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:NHLStatsDb"]));
        services.AddDbContext<NHLStatsContext>(options => options.UseSqlServer(Configuration.GetConnectionString("NHLStatsDb")));
        services.AddTransient<IPlayerRepository, PlayerRepository>();
        services.AddTransient<ISkaterStatisticRepository, SkaterStatisticRepository>();
        services.AddSingleton<IDocumentExecuter, DocumentExecuter>();
        services.AddSingleton<NHLStatsQuery>();
        services.AddSingleton<NHLStatsMutation>();
        services.AddSingleton<PlayerType>();
        services.AddSingleton<PlayerInputType>();
        services.AddSingleton<SkaterStatisticType>();
        var sp = services.BuildServiceProvider();
        services.AddSingleton<ISchema>(new NHLStatsSchema(new FuncDependencyResolver(type => sp.GetService(type))));
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, NHLStatsContext db)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseGraphiQl();
        app.UseMvc();
        db.EnsureSeedData();
    }
}

С этими изменениями я выполнил APIServer, а затем перешел по URL: http://localhost:49915/api/graphql и нашел ошибку с сообщением:Эта локальная страница не может быть найдена

Если я пытаюсь открыть URL: http://localhost:49915/graphql,, он открывает редактор Graphiql, но схема отсутствует в левой части редактора Graphiql.

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 20 ноября 2018

В вашем GraphQLController добавьте метод HttpGet для обработки запросов GET.

[HttpGet("")]
public async Task<ContentResult> ExecuteGET([FromQuery] string query, [FromQuery] string variables = null, [FromQuery] string operationName = null)
 {
    //Put your execute code here...
}

Это позволит вашему API поддерживать запросы через URL.

Например, вот примерный URL, который вернул бы id из users.

http://localhost:49915/graphql?query={users{id}}
...