明天开始就是五一小长假了,祝大家假期愉快,玩得开心。
今天的内容不难,常用。讲一讲C#如何从WebApi获取并处理数据。
演示环境:windows 11,VS 2022,.NET 6
需要使用两个库:NewtonSoft.json,RestSharp。
到本文写作时,RestSharp最新稳定版本110.2.0,如果是.Net FrameWork,需要4.7.1以上。不同版本的RestSharp使用方法可能会略有差异。.
首先我们需要一个WebApi,才能从中获取数据。(关于如何创建一个WebApi,可以看之前的文章:WebAPI入门学习,这会是一个系列的文章,陆续更新内容)。这次我会建好并直接开始获取数据。
我们借用之前的一个例子:WPF中的DataGrid,一文全都告诉你
这个里面DataGrid的数据,我们是直接使用SqlSugar(ORM)从SqlServer获取的。这一次,我们改为WebApi获取数据,客户端程序去调用WebApi。
现在我已经创建好了WebApi,除了Swagger文档形式,我们可以使用Postman,或者Apifox进行接口测试。
接口测试工具一个非常好用的点在于,可以自动生成接口代码或者业务代码,修改一下拿来用。如开头所说,提供的模块是RestSharp,版本之间略有差异。
var client = new RestClient("https://localhost:44374/DouPoStudents/GetStudentInfo?className=斗破一班");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
client.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
Post方法如果参数较多,也可以修改代码,接受传json数据。
接口请求代码,也需要做出对应调整
var client = new RestClient("https://localhost:44374/DouPoStudents/GetStudentInfo");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
client.UserAgent = "Apifox/1.0.0 (https://www.apifox.cn)";
request.AddHeader("Content-Type", "application/json");
var body = @"{
" + "\n" +
@" ""className"": ""斗破一班""
" + "\n" +
@"}";
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
WebApi测试获取数据功能OK,下面就开始修改程序。
两个接口获取的数据大致如下,返回的都是json格式的字符串。
{
"code": "0",
"message": "数据请求成功",
"data": "斗破一班,"
}
{
"code": "0",
"message": "数据请求成功",
"data": [
{
"Name": "萧炎",
"Gender": "男",
"Class": "斗破一班",
"Grade": "斗帝"
},
{
"Name": "熏儿",
"Gender": "女",
"Class": "斗破一班",
"Grade": "斗帝"
},
{
"Name": "彩铃",
"Gender": "女",
"Class": "斗破一班",
"Grade": "斗帝"
},
{
"Name": "药老",
"Gender": "男",
"Class": "斗破一班",
"Grade": "斗帝"
}
]
}
Json数据的处理,我常用的方法,一种是解析成Json格式,然后使用Json[key]的方式获取值。
还有就是转化为C#实体,key就是属性,value对应属性值。如果Json数据格式比较复杂,可以借助一些转换工具。
屏蔽掉之前从数据库获取数据的代码。新建WebApi类,把APifox生成的代码复制过来,然后就发现提示错误了。因为使用的Restsharp是最新版本,有变更。
要用起来,修改一下代码。
namespace DataGridDemo.DAL
{
public static class WebApi
{
public static string GetClassInfo()
{
var client = new RestClient("https://localhost:44374/DouPoStudents/GetClassInfo");
var request = new RestRequest("",Method.Get);
RestResponse response = client.Execute(request);
return response.Content;
}
public static string GetStudentInfo(string className)
{
var client = new RestClient("https://localhost:44374/DouPoStudents/GetStudentInfo");
var request = new RestRequest("",Method.Post);
request.AddHeader("Content-Type", "application/json");
var body = new { className= className };
request.AddParameter("application/json", JsonConvert.SerializeObject(body), ParameterType.RequestBody);
RestResponse response = client.Execute(request);
return response.Content;
}
}
}
这样,我们就可以使用这两个方法获取数据了。
public MainView()
{
InitializeComponent();
this.DataContext = new MainViewModel();
//string ConnectionStr = "Server=localhost;Database=master;Trusted_Connection=True;";
//DataGridDemo.DAL.SqlConnection conn = new DataGridDemo.DAL.SqlConnection();
//var classes = conn.QueryClass();
var classeInfo = WebApi.GetClassInfo();
var jsonBack = JObject.Parse(JsonConvert.DeserializeObject(classeInfo).ToString());
List<string> classes = jsonBack["data"].ToString().Split(',').ToList();
foreach (var c in classes)
{
if (c == "") return;
string js = WebApi.GetStudentInfo(c);
Data da = JsonConvert.DeserializeObject<Data>(js);
wrapPanel.Children.Add(new StudentControl(da.data, c));
}
}
最终结果如下:
PS:以上内容仅作为演示,用于实际生产环境,需要修正完善的点还很多。
代码分享地址:
https://www.aliyundrive.com/s/wwmPYgdvqap
提取码: ky83