WPF实战项目十五(客户端):RestSharp的使用

1、在WPF项目中添加Nuget包,搜索RestSharp安装

2、新建Service文件夹,新建基础通用请求类BaseRequest.cs

cs 复制代码
    public class BaseRequest
    {
        public Method Method { get; set; }
        public string Route { get; set; }
        public string ContenType { get; set; } = "application/json";
        public string Parameter { get; set; }
    }

3、在WPFProjectShared项目下新增类WebApiResponse.cs接收api返回信息

cs 复制代码
public class WebApiResponse
    {
        public string Message { get; set; }

        public bool Status { get; set; }

        public object Result { get; set; }
    }

    public class WebApiResponse<T>
    {
        public string Message { get; set; }

        public bool Status { get; set; }

        public T Result { get; set; }
    }

4、添加httpclient请求帮助类

cs 复制代码
public class HttpRestClient
    {
        public readonly string apiUrl;
        protected readonly RestClient client;

        public HttpRestClient(string apiUrl)
        {
            this.apiUrl = apiUrl;
            client = new RestClient();
        }

        public async Task<WebApiResponse> ExecuteAsync(BaseRequest baseRequest)
        {
            var request = new RestRequest(baseRequest.Method);
            request.AddHeader("Content-Type", baseRequest.ContenType.ToString());

            if (baseRequest.Parameter != null)
                request.AddParameter("param", JsonConvert.SerializeObject(baseRequest.Parameter), ParameterType.RequestBody);
            client.BaseUrl = new Uri(apiUrl + baseRequest.Route);
            var response = await client.ExecuteAsync(request);

            JsonSerializerSettings jsSetting = new JsonSerializerSettings();
            jsSetting.NullValueHandling = NullValueHandling.Ignore;

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
                return JsonConvert.DeserializeObject<WebApiResponse>(response.Content, jsSetting);

            else
                return new WebApiResponse()
                {
                    Status = false,
                    Result = null,
                    Message = response.ErrorMessage
                };

        }

        public async Task<WebApiResponse<T>> ExecuteAsync<T>(BaseRequest baseRequest)
        {
            var request = new RestRequest(baseRequest.Method);
            request.AddHeader("Content-Type", baseRequest.ContenType);
            if (baseRequest.Parameter != null)
                request.AddParameter("param", JsonConvert.SerializeObject(baseRequest.Parameter), ParameterType.RequestBody);
            client.BaseUrl = new Uri(apiUrl + baseRequest.Route);
            var response = await client.ExecuteAsync(request);

            JsonSerializerSettings jsSetting = new JsonSerializerSettings();
            jsSetting.NullValueHandling = NullValueHandling.Ignore;

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
                return JsonConvert.DeserializeObject<WebApiResponse<T>>(response.Content, jsSetting);

            else
                return new WebApiResponse<T>()
                {
                    Status = false,
                    Message = response.ErrorMessage
                };
        }
    }

5、新增接口IBaseService,添加增删改查方法

cs 复制代码
    public interface IBaseService<TEntity> where TEntity : class
    {
        Task<WebApiResponse<TEntity>> AddAsync(TEntity entity);
        Task<WebApiResponse<TEntity>> UpdateAsync(TEntity entity);
        Task<WebApiResponse> DeleteAsync(int id);
        Task<WebApiResponse<TEntity>> GetFirstOfDefaultAsync(int id);
        Task<WebApiResponse<PagedList<TEntity>>> GetAllPageListAsync(QueryParameter parameter);
    }

6、实现接口BaseService

cs 复制代码
public class BaseService<TEntity> : IBaseService<TEntity> where TEntity : class
    {
        private readonly HttpRestClient client;
        private readonly string serviceName;

        public BaseService(HttpRestClient client, string serviceName)
        {
            this.client = client;
            this.serviceName = serviceName;
        }

        public async Task<WebApiResponse<TEntity>> AddAsync(TEntity entity)
        {
            BaseRequest request = new BaseRequest();
            request.Method = RestSharp.Method.POST;
            request.Route = $"api/{serviceName}/Add";
            request.Parameter = entity;
            return await client.ExecuteAsync<TEntity>(request);
        }

        public async Task<WebApiResponse> DeleteAsync(int id)
        {
            BaseRequest request = new BaseRequest();
            request.Method = RestSharp.Method.DELETE;
            request.Route = $"api/{serviceName}/Delete?Id={id}";
            return await client.ExecuteAsync(request);
        }

        public async Task<WebApiResponse<PagedList<TEntity>>> GetAllPageListAsync(QueryParameter parameter)
        {
            BaseRequest request = new BaseRequest();
            request.Method = RestSharp.Method.GET;
            request.Route = $"api/{serviceName}/GetAllPageListToDo?pageIndex={parameter.PageIndex}" + $"&pageSize={parameter.PageSize}" + $"&search={parameter.Search}";
            return await client.ExecuteAsync<PagedList<TEntity>>(request);
        }

        public async Task<WebApiResponse<TEntity>> GetFirstOfDefaultAsync(int id)
        {
            BaseRequest request = new BaseRequest();
            request.Method = RestSharp.Method.GET;
            request.Route = $"api/{serviceName}/Get?Id={id}";
            return await client.ExecuteAsync<TEntity>(request);
        }

        public async Task<WebApiResponse<TEntity>> UpdateAsync(TEntity entity)
        {
            BaseRequest request = new BaseRequest();
            request.Method = RestSharp.Method.POST;
            request.Route = $"api/{serviceName}/Update";
            request.Parameter = entity;
            return await client.ExecuteAsync<TEntity>(request);
        }
    }

7、新增IToDoService接口,继承IBaseService接口

cs 复制代码
    public interface IToDoService:IBaseService<ToDoDto>
    {
    }

8、新增ToDoService类,继承BaseService类和接口IToDoService

cs 复制代码
    public class ToDoService : BaseService<ToDoDto>, IToDoService
    {
        public ToDoService(HttpRestClient client) : base(client, "ToDo")
        {
        }
    }

9、在客户端App.xaml中注册httprestclient、注册默认服务的地址、注册服务

cs 复制代码
/// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainView>();
        }
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //注册httprestclient
            containerRegistry.GetContainer().Register<HttpRestClient>(made: Parameters.Of.Type<string>(serviceKey: "webUrl"));
            //注册默认服务的地址
            containerRegistry.GetContainer().RegisterInstance(@"http://localhost:5000/", serviceKey: "webUrl");
            //注册服务
            containerRegistry.Register<IToDoService, ToDoService>();

            containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
            containerRegistry.RegisterForNavigation<MemoView, MemoViewModel>();
            containerRegistry.RegisterForNavigation<SettingsView, SettingsViewModel>();
            containerRegistry.RegisterForNavigation<ToDoView, ToDoViewModel>();
            containerRegistry.RegisterForNavigation<SkinView, SkinViewModel>();
            containerRegistry.RegisterForNavigation<AboutView, AboutViewModel>();
            containerRegistry.RegisterForNavigation<SystemSettingsView, SystemSettingsViewModel>();
        }
    }

10、修改ToDoViewModel的代码,添加ToDoService服务,修改CreateToDoList 代码

cs 复制代码
private readonly IToDoService toDoService;
        public ToDoViewModel(IToDoService toDoService)
        {
            ToDoDtos = new ObservableCollection<ToDoDto>();
            AddCommand = new DelegateCommand(Add);
            this.toDoService = toDoService;
            CreateToDoList();
        }

private async void CreateToDoList()
        {
            var todoResult = await toDoService.GetAllPageListAsync(new WPFProjectShared.Parameters.QueryParameter
            {
                PageIndex = 0,
                PageSize = 100
            });
            if (todoResult.Status)
            {
                toDoDtos.Clear();
                foreach (var item in todoResult.Result.Items)
                {
                    toDoDtos.Add(item);
                }
            }

        }

11、右击解决方案-属性,设置多项目同时启动

12、F5启动项目,点击【待办事项】,显示了待办事项的列表这和webapi中返回的待办事项Json数据一样。

cs 复制代码
{
  "message": null,
  "status": true,
  "result": {
    "pageIndex": 0,
    "pageSize": 100,
    "totalCount": 5,
    "totalPages": 1,
    "indexFrom": 0,
    "items": [
      {
        "title": "测试新增待办事项",
        "content": "测试新增待办事项",
        "status": 0,
        "id": 2009,
        "createDate": "2023-11-22T15:48:50.8859172",
        "updateDate": "2023-11-22T15:48:50.8861276"
      },
      {
        "title": "测试api",
        "content": "测试api",
        "status": 1,
        "id": 1009,
        "createDate": "2023-08-29T16:41:44.93631",
        "updateDate": "2023-11-22T15:20:45.5035496"
      },
      {
        "title": "测试AutoMapper",
        "content": "AutoMapper",
        "status": 1,
        "id": 1008,
        "createDate": "2023-08-09T05:58:46.957",
        "updateDate": "2023-08-24T14:05:58.0651592"
      },
      {
        "title": "周会",
        "content": "每周周会要参加",
        "status": 0,
        "id": 4,
        "createDate": "2023-07-25T03:42:51.686",
        "updateDate": "2023-07-25T03:42:51.686"
      },
      {
        "title": "3333",
        "content": "6666",
        "status": 1,
        "id": 2,
        "createDate": "2023-07-25T02:51:58.562",
        "updateDate": "2023-08-09T13:28:43.8087488"
      }
    ],
    "hasPreviousPage": false,
    "hasNextPage": false
  }
}
相关推荐
code bean1 小时前
【C#基础】函数传参大总结
服务器·开发语言·c#
shanshan20992 小时前
上位机系统架构 | 如何设计一个高效的多相机管理系统
c#·wpf·相机
ling1s4 小时前
C#基础(13)结构体
前端·c#
.Net Core 爱好者4 小时前
Redis实践之缓存:设置缓存过期策略
java·redis·缓存·c#·.net
云草桑4 小时前
逆向工程 反编译 C# net core
前端·c#·反编译·逆向工程
充值内卷6 小时前
WPF入门教学四 WPF控件概述
windows·ui·wpf
指尖流烟6 小时前
C#调用图表的使用方法
开发语言·c#
friklogff8 小时前
【无标题】云端之C#:全面解析6种云服务提供商的SDK
开发语言·flask·c#
c#上位机9 小时前
C#事件的用法
java·javascript·c#
chnyi6_ya9 小时前
一些写leetcode的笔记
笔记·leetcode·c#