RestSharp 的简单使用
目的:希望在WPF应用中发送HTTP请求,获取后台数据
方法:在网上的一些搜索结果中,推荐使用的方式有HttpClient、HttpClientFactory、refit和RestSharp,其中中间两个估计是属于在ASP下使用的库,找到的方法都是需要注册到IServiceCollection中,但是由于我的WPF使用的MVVM框架是Prism,Prism是使用DryIoc,而且不建议使用IServiceCollection,也就是ASP中默认的容器来扩展Prism的(试过几种方法,都无法成功注入),然后选用了RestSharp这个不依赖任何环境的,纯粹的.NET的第三方库
使用:
首先说明一下,RestSharp 提供了一些名字上符合Restful风格的API,但是在返回结果的时候,如果请求出错,会直接报错,所以要么需要加try-catch,或者使用比较原始的API请求(我选用这种)
- 首先是需要创建一个工厂来返回客户端,官方提醒,客户端应该是单例的,不然会有耗尽socket的风险
public class HttpClientFactory
{
private readonly RestClient _restClient;
public HttpClientFactory()
{
_restClient = new RestClient("http://localhost:5000");
}
}
- 然后将需要请求的内容一同放到工厂内部,更像是一个工具类,而不是工厂,可以为每一种API创建不同的工具类,来分割不同的请求
GET 请求
public async Task<ApiResponse<IEnumerable<ActionArg>>> GetAllActionArgs()
{
var request = new RestRequest("/action/getAll");
var response = await _restClient.ExecuteAsync<ApiResponse<IEnumerable<ActionArg>>>(request);
if (response.IsSuccessful)
{
return response.Data;
}
Logger.Warn($"请求失败:{response.StatusCode},错误原因: {response.Content}");
return new ApiResponse<IEnumerable<ActionArg>>(false, "请求失败");
}
POST 请求
public async Task<ActionArg> AddActionArgs(ActionArg actionArg)
{
var request = new RestRequest($"/action/add", Method.Post).AddJsonBody(actionArg);
var response = await _restClient.ExecuteAsync<ApiResponse<ActionArg>>(request);
if (response.IsSuccessful && response.Data is not null)
{
return response.Data.Result ? response.Data.Data : actionArg;
}
Logger.Warn($"请求失败:{response.StatusCode},错误原因:{response.Content}");
return actionArg;
}
DELETE 请求
public async Task<ApiResponse<object>> DeleteActionRule(MapActionRule rule)
{
var request = new RestRequest("/actionRule/delete", Method.Delete).AddJsonBody(rule);
var response = await _restClient.ExecuteAsync<ApiResponse<object>>(request);
if (response.IsSuccessful)
{
return response.Data;
}
Logger.Warn($"请求失败:{response.StatusCode},错误原因: {response.Content}");
return new ApiResponse<object>(false, "请求失败");
}
- 基本上对于返回结果的处理都差不多,但是好处是,它不会因为请求出错而抛出异常,可以通过检查响应结果并记录日志的方式,处理请求错误,而且不需要添加try-catch(个人不喜欢)