UWP graphql-dotnet新版数据查询客户端的实现
之前写过一篇文章 UWP GraphQL数据查询客户端的实现,这次的标题基本差不多,只不过微软这个graphql-dotnet repo从1.x升级到了3.x,跨度有点大。
如果你用之前的项目,直接升级,那么所有的方法都报错,因为微软已经完全重写了这个graphql的实现🤣🤣🤣
所以为了能够跟上最新的步伐,当然他们肯定还会改进,最终的目的还是向之前说的,Apollo框架那样,简单易用。
这次更新加入了变量的引用,更加人性化一点了。
为了方便测试,我找了一个公开的graphQL的api end point.
https://graphql-weather-api.herokuapp.com/
更多的在线地址,参考http://apis.guru/graphql-apis/
GraphQLHttpClient graphQLClient = new GraphQLHttpClient("https://graphql-weather-api.herokuapp.com/", new NewtonsoftJsonSerializer()); var request = new GraphQLRequest { Query = @"query($name: String!){ getCityByName(name:$name){ id name country coord{ lon lat } weather{ summary{ title description icon } temperature{ actual feelsLike min max } wind{ speed deg } clouds{ all humidity visibility } timestamp } } }", Variables = new { name = "Beijing" } };
需要注意的一点是:
我们是根据name字段查询的,name的类型是String,并且非空,所以再query我们定义
$name: String!
如果有多个字段,那么需要一一列出
$id: Int!, $operation: OperationType!, $brand: String
其中OperationType为枚举。
当然这个query语句是加了变量了,变量在Variables种指定,你也可以按照之前的方式进行字符串拼接,不过使用变量语法出错的几率小很多。
然后执行query/mutation的语句是这样
//1. Define a reponse type var graphQLResponse = await graphQLClient.SendQueryAsync<getCityByNameResponse>(request); //2. Alternatively you could use an anonymous type: var graphQLResponse = await graphQLClient.SendQueryAsync( request, () => new { getCityByName = new GetCityByName() });
Debug.WriteLine("raw response:");
Debug.WriteLine(JsonSerializer.Serialize(graphQLResponse, new JsonSerializerOptions { WriteIndented = true }));
就这样,执行了之后就有结果了。
Model:
public class getCityByNameResponse { public GetCityByName getCityByName { get; set; } } public class GetCityByName { public string id { get; set; } public string name { get; set; } public string country { get; set; } public Coordinates coord { get; set; } public Weather weather { get; set; } } public class Weather { public Summary summary { get; set; } public Tempreature tempreature { get; set; } public Wind wind { get; set; } public Clouds clouds { get; set; } public long timestamp { get; set; } } public class Summary { public string title { get; set; } public string description { get; set; } public string icon { get; set; } } public class Tempreature { public float actual { get; set; } public float feelsLike { get; set; } public float min { get; set; } public float max { get; set; } } public class Wind { public float speed { get; set; } public int deg { get; set; } } public class Clouds { public int all { get; set; } public int visibility { get; set; } public int humidity { get; set; } } public class Coordinates { public float lon { get; set; } public float lat { get; set; } }