WPF开发中遇到的新知识 -- 2

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(个人不喜欢)
posted @   huang1993  阅读(318)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示