请求指引:在Visual Studio Mac中创建无平台依赖的Xamarin Forms SDK
打造无平台依赖的Xamarin Forms HTTP请求SDK
嗨,正好你要做的是纯HTTP请求的SDK,完全不用碰平台特定代码,那**.NET Standard类库+NuGet打包**就是最适合的方案了,我给你一步步讲怎么搞:
第一步:创建.NET Standard类库
直接用Visual Studio(或者Rider)新建一个**.NET Standard Class Library项目就行。版本选.NET Standard 2.0**就够了——这个版本兼容性拉满,几乎所有在用的Xamarin Forms项目都能支持,不用搞太高版本徒增兼容性问题。
给项目起个清晰的名字,比如AwesomeHttpSdk,接下来就可以写你的HTTP请求逻辑了。
第二步:实现纯跨平台的HTTP请求逻辑
不用找什么花里胡哨的库,.NET Standard自带的HttpClient就足够搞定所有HTTP请求需求。你可以封装一个易用的服务类,比如:
using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; namespace AwesomeHttpSdk { public class HttpService { // 最佳实践:HttpClient单例复用,避免频繁创建释放导致的socket耗尽问题 private static readonly HttpClient _httpClient = new HttpClient(); // 封装Get请求,自动反序列化返回结果 public async Task<TResult> GetAsync<TResult>(string url) { var response = await _httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); // 自动抛出HTTP错误状态码的异常 var responseContent = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<TResult>(responseContent); } // 封装Post请求,支持传入请求体 public async Task<TResult> PostAsync<TRequest, TResult>(string url, TRequest requestBody) { var jsonContent = new StringContent( JsonSerializer.Serialize(requestBody), System.Text.Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync(url, jsonContent); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<TResult>(responseContent); } // 你还可以根据需求添加Put、Delete、文件上传等方法 } }
如果你的项目需要更灵活的序列化(比如兼容老项目的Newtonsoft.Json),直接NuGet安装Newtonsoft.Json替换掉System.Text.Json就行,完全不影响跨平台特性。
第三步:打包成NuGet包
要让Xamarin Forms项目能方便引用,打包成NuGet是标准操作:
- 右键你的类库项目,选择属性,切换到打包标签页
- 填写必要信息:包ID(要唯一,比如你的名字+Sdk名)、版本号、作者、描述这些
- 勾选生成时创建NuGet包,或者直接右键项目选打包,就能在项目的
bin/Release目录下拿到.nupkg文件了
如果你喜欢用命令行,直接在项目根目录跑:
dotnet pack -c Release
第四步:在Xamarin Forms项目中使用
把生成的NuGet包添加到你的Xamarin Forms项目里(本地引用或者上传到NuGet.org共享),然后就可以在共享项目里直接用了:
// 在ViewModel或者业务逻辑里 var httpService = new HttpService(); try { var userData = await httpService.GetAsync<User>("https://your-api.com/users/1"); // 处理返回的数据 } catch (HttpRequestException ex) { // 处理HTTP请求异常,比如网络错误、状态码错误 }
如果你的项目用了依赖注入(比如Prism、MvvmCross或者原生DI),还可以把HttpService注册为单例,在需要的地方注入使用,更符合最佳实践。
一些额外小贴士
- 记得给
HttpClient设置合理的超时时间,避免请求挂太久:_httpClient.Timeout = TimeSpan.FromSeconds(30); - 可以添加请求头处理(比如统一加Authorization),在
HttpService的构造函数里配置_httpClient.DefaultRequestHeaders - 异常处理要全面,除了
HttpRequestException,还要考虑序列化失败的JsonException等
内容的提问来源于stack exchange,提问作者Nilesh Jha
相关产品推荐
相关产品推荐

