using System; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace FOICRInfoApp.Helpers { public class GraphQLClient { private class GraphQLQuery { // public string OperationName { get; set; } public string query { get; set; } public object variables { get; set; } } public class GraphQLQueryResult { private string raw; private JObject data; private Exception Exception; public GraphQLQueryResult(string text, Exception ex = null) { Exception = ex; raw = text; data = text != null ? JObject.Parse(text) : null; } public Exception GetException() { return Exception; } public string GetRaw() { return raw; } public async Task Get(string key) { if (data == null) return default(T); try { return await Task.Run(() => JsonConvert.DeserializeObject(this.data["data"][key].ToString())); } catch { return default(T); } } public async Task Get(string key) { if (data == null) return null; try { return await JsonConvert.DeserializeObject(this.data["data"][key].ToString()); } catch { return null; } } public async Task GetData() { if (data == null) return null; try { return await JsonConvert.DeserializeObject(this.data["data"].ToString()); } catch { return null; } } } private string url; public GraphQLClient(string url) { this.url = url; } public async Task Query(string query, object variables) { var fullQuery = new GraphQLQuery() { query = query, variables = variables, }; string jsonContent = JsonConvert.SerializeObject(fullQuery); //Console.WriteLine(jsonContent); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; UTF8Encoding encoding = new UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(jsonContent.Trim()); // request.ContentLength = byteArray.Length; request.ContentType = @"application/json"; using (var dataStream = await Task.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null)) { dataStream.Write(byteArray, 0, byteArray.Length); } long length = 0; try { using (var response = (HttpWebResponse)(await Task.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null))) { length = response.ContentLength; using (Stream responseStream = response.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); var json = reader.ReadToEnd(); return new GraphQLQueryResult(json); } } } catch (WebException ex) { WebResponse errorResponse = ex.Response; using (Stream responseStream = errorResponse.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); String errorText = reader.ReadToEnd(); // Console.WriteLine(errorText); return new GraphQLQueryResult(null, ex); } } } } }