如何在Xamarin Forms PCL应用中用HttpClient接收ASP.NET WebAPI控制器返回内容
在Xamarin Forms PCL中使用HttpClient接收XML格式的WebAPI数据
没问题,我来一步步帮你搞定在Xamarin Forms PCL里获取这个XML格式的学校数据~
第一步:创建对应XML结构的模型类
首先得把WebAPI返回的XML结构映射成C#类,这样才能把XML反序列化成可操作的对象。根据你给的XML示例,咱们创建两个类:School和ArrayOfSchool,还要注意匹配XML的命名空间,用System.Xml.Serialization的特性来对应:
using System.Xml.Serialization; using System.Collections.Generic; [XmlRoot(ElementName = "ArrayOfSchool", Namespace = "http://schemas.datacontract.org/2004/07/MasterDetail.Models")] public class ArrayOfSchool { [XmlElement(ElementName = "School", Namespace = "http://schemas.datacontract.org/2004/07/MasterDetail.Models")] public List<School> Schools { get; set; } } public class School { [XmlElement(ElementName = "SchoolCode")] public string SchoolCode { get; set; } [XmlElement(ElementName = "SchoolId")] public int SchoolId { get; set; } [XmlElement(ElementName = "SchoolName")] public string SchoolName { get; set; } }
第二步:编写HttpClient调用逻辑
接下来就是用HttpClient发送请求并处理XML响应了。记得在Xamarin Forms里要使用异步方法,避免阻塞UI线程。
首先确保你的PCL项目里已经引用了System.Net.Http和System.Xml.Serialization(一般默认就包含,如果没有可以通过NuGet安装)。然后写调用代码,比如放在ViewModel或者页面的代码文件里:
using System.Net.Http; using System.Xml.Serialization; using System.IO; using System.Collections.Generic; using System.Threading.Tasks; public async Task<List<School>> GetSchoolsAsync() { var httpClient = new HttpClient(); // 注意:模拟器测试时要替换localhost:Android用10.0.2.2,iOS可直接用localhost string apiUrl = "http://localhost:50908/api/Schools/"; try { var response = await httpClient.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); // 确保请求返回成功状态 var xmlContent = await response.Content.ReadAsStringAsync(); var serializer = new XmlSerializer(typeof(ArrayOfSchool)); using (var reader = new StringReader(xmlContent)) { var result = (ArrayOfSchool)serializer.Deserialize(reader); return result.Schools; } } catch (Exception ex) { // 这里处理异常,比如网络错误、反序列化失败等 Console.WriteLine($"获取学校数据失败:{ex.Message}"); return new List<School>(); } }
第三步:关键注意事项
- 模拟器地址替换:如果用Android模拟器测试,不能直接写
localhost,要换成10.0.2.2(这个地址对应主机的localhost);iOS模拟器可以直接用localhost。 - 网络权限配置:Android项目需要在
AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET" />;iOS 9+要确保Info.plist里的ATS设置允许非HTTPS请求(因为你的API是HTTP协议)。 - UI线程调用:一定要用
async/await来调用GetSchoolsAsync,比如在页面的OnAppearing方法里:
protected override async void OnAppearing() { base.OnAppearing(); var schools = await GetSchoolsAsync(); // 把schools绑定到UI控件,比如ListView的ItemsSource }
这样就能成功获取并解析WebAPI返回的XML数据啦~
内容的提问来源于stack exchange,提问作者Tirth21896
相关产品推荐
相关产品推荐

