private static async Task <GraphQlParameters> GetParametersAsync(HttpRequest request) { // http://graphql.org/learn/serving-over-http/#http-methods-headers-and-body string body = null; if (request.Method == "POST") { // Read request body using (var sr = new StreamReader(request.Body)) { body = await sr.ReadToEndAsync(); } } MediaTypeHeaderValue.TryParse(request.ContentType, out MediaTypeHeaderValue contentType); GraphQlParameters parameters; switch (contentType.MediaType) { case "application/json": // Parse request as json parameters = JsonConvert.DeserializeObject <GraphQlParameters>(body); break; case "application/graphql": // The whole body is the query parameters = new GraphQlParameters { Query = body }; break; default: // Don't parse anything parameters = new GraphQlParameters(); break; } string query = request.Query["query"]; // Query string "query" overrides a query in the body parameters.Query = query ?? parameters.Query; return(parameters); }
public async Task Invoke(HttpContext httpContext) { var sent = false; if (httpContext.Request.Path.StartsWithSegments("/graphql")) { var request = httpContext.Request; var response = httpContext.Response; // GraphQL HTTP only supports GET and POST methods. if (request.Method != "GET" && request.Method != "POST") { response.Headers.Add("Allow", "GET, POST"); response.StatusCode = 405; return; } GraphQlParameters parameters = await GetParametersAsync(request); var schema = new Schema { Query = new BookQuery(_bookRepository) }; var result = await new DocumentExecuter().ExecuteAsync(options => { options.Schema = schema; options.Query = parameters.Query; options.OperationName = parameters.OperationName; options.Inputs = parameters.GetInputs(); }); CheckForErrors(result); await WriteResult(httpContext, result); sent = true; } if (!sent) { await _next(httpContext); } }