WPF实战项目十五(客户端):RestSharp的使用
1、在WPF项目中添加Nuget包,搜索RestSharp安装

2、新建Service文件夹,新建基础通用请求类BaseRequest.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返回信息
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请求帮助类
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);elsereturn 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);elsereturn new WebApiResponse<T>(){Status = false,Message = response.ErrorMessage};}}
5、新增接口IBaseService,添加增删改查方法
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
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接口
public interface IToDoService:IBaseService<ToDoDto>{}
8、新增ToDoService类,继承BaseService类和接口IToDoService
public class ToDoService : BaseService<ToDoDto>, IToDoService{public ToDoService(HttpRestClient client) : base(client, "ToDo"){}}
9、在客户端App.xaml中注册httprestclient、注册默认服务的地址、注册服务
/// <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){//注册httprestclientcontainerRegistry.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 代码
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数据一样。


{"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}
}
相关文章:
WPF实战项目十五(客户端):RestSharp的使用
1、在WPF项目中添加Nuget包,搜索RestSharp安装 2、新建Service文件夹,新建基础通用请求类BaseRequest.cs public class BaseRequest{public Method Method { get; set; }public string Route { get; set; }public string ContenType { get; set; } &quo…...
C语言基础篇5:指针(二)
接上篇:C语言基础篇5:指针(一) 4 指针作为函数参数 4.1 指针变量作为函数的参数 指针型变量可以作为函数的参数,使用指针作为函数的参数是将函数的参数声明为一个指针,前面提到当数组作为函数的实参时,值传递数组的地址…...
「Verilog学习笔记」非整数倍数据位宽转换8to12
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 要实现8bit数据至12bit数据的位宽转换,必须要用寄存器将先到达的数据进行缓存。8bit数据至12bit数据,相当于1.5个输入数据拼接成一个输出数据&#…...
Qt_一个由单例引发的崩溃
Qt_一个由单例引发的崩溃 文章目录 Qt_一个由单例引发的崩溃摘要关于 Q_GLOBAL_STATIC代码测试布局管理器源码分析Demo 验证关于布局管理器析构Qt 类声明周期探索更新代码获取父类分析Qt 单例宏源码 关键字: Qt、 Q_GLOBAL_STATIC、 单例、 UI、 崩溃 摘要 今…...
P8A004-系统加固-磁盘访问权限
【预备知识】 访问权限,根据在各种预定义的组中用户的身份标识及其成员身份来限制访问某些信息项或某些控制的机制。访问控制通常由系统管理员用来控制用户访问网络资源(如服务器、目录和文件)的访问,并且通常通过向用户和组授予…...
数智赋能 锦江汽车携手苏州金龙打造高质量盛会服务
作为一家老牌客运公司,成立于1956年的上海锦江汽车服务有限公司(以下简称锦江汽车),拥有1200多辆大巴和5000多辆轿车,是上海乃至长三角地区规模最大的专业旅游客运公司。面对客运市场的持续萎缩,锦江汽车坚…...
kolla-ansible 部署OpenStack云计算平台
目录 一、环境 二、安装及部署 三、测试 一、环境 官方文档:https://docs.openstack.org/kolla-ansible/yoga/user/quickstart.html rhel8.6 网络设置: 修改网卡名称 网络IP: 主机名: 网络时间协议 配置软件仓库 vim docke…...
wireshark 抓包提示
[TCP Previous segment not captured] 在TCP的传输阶段,同一台主机发出的数据段应该是连续的,即后一个包的Seq等于前一个包的SeqLen(三次握手和四次挥手是个例外)。如果wireshark发现后一个包的Seq号大于前一个包的SeqLen…...
Redis未授权访问-CNVD-2019-21763复现
Redis未授权访问-CNVD-2019-21763复现 利用项目: https://github.com/vulhub/redis-rogue-getshell 解压后先进入到 RedisModulesSDK目录里面的exp目录下,make编译一下才会产生exp.so文件,后面再利用这个exp.so文件进行远程代码执行 需要p…...
汇编:常用的输入与输出
1.字符输出 使用int 21h中断的02h号功能可以在屏幕输出一个字符,dl中存放要输出字符的ascii码。 如下代码将在屏幕输出一个字符“a”: mov ah,02hmov dl,aint 21h 2.字符输入 使用int 21h中断的01h号功能可以接受一个字符,al存放输…...
MYSQL基础之【正则表达式,事务处理】
文章目录 前言MySQL 正则表达式MySQL 事务事务控制语句事务处理方法PHP中使用事务实例 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不…...
Mysql并发时常见的死锁及解决方法
使用数据库时,有时会出现死锁。对于实际应用来说,就是出现系统卡顿。 死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。就是所谓的锁资源请求产生了回路现象,即死循环,此时称系统处于…...
二十九、微服务案例完善(数据聚合、自动补全、数据同步)
目录 一、定义 二、分类 1、桶(Bucket)聚合: 2、度量(Metric)聚合: 3、管道聚合(Pipeline Aggregation): 4、注意: 参与聚合的字段类型必须是: 三、使用DSL实现聚合 聚合所必须的三要素: 聚合可配…...
vue 目录树的展开与关闭
目录 1、翻页方法中控制目录树节点的展开与关闭2、搜索目录树节点名称控制节点的展开与关闭 <el-tree:data"data_option"ref"tree":props"defaultProps"node-click"handleNodeClick":default-expanded-keys"needExpandedKeys&…...
【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI
一、Python环境编译 1、处理好venv环境 要生成正常的 requirements.txt 文件,我们就需要先将虚拟环境处理好 创建虚拟环境(可选): 在项目目录中,你可以选择使用虚拟环境,这样你的项目依赖将被隔离在一个…...
力扣labuladong——一刷day55
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣951. 翻转等价二叉树二、力扣124. 二叉树中的最大路径和三、力扣112. 路径总和(遍历)四、力扣112. 路径总和(分解&a…...
springboot实现验证码功能
转载自 : www.javaman.cn 1、编写工具类生成4位随机数 该工具类主要生成从0-9,a-z,A-Z范围内产生的4位随机数 /*** 产生4位随机字符串*/public static String getCheckCode() {String base "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn…...
内测分发平台是否支持应用的微服务化部署
内测分发平台的微服务化部署支持是现代应用开发和部署的一个重要特性。首先我们得知道什么是微服务化部署都有哪些关键功能,如何实施微服务化的部署。下文以我自己理解总结了几点。 图片来源:news.gulufenfa.com 微服务是一种基于独立运行的小型服务来构建应用程序…...
1140. 最短网络,prim算法,模板题
1140. 最短网络 - AcWing题库 农夫约翰被选为他们镇的镇长! 他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。 约翰的农场的编号是1…...
升级jdk17过程中,原来的jdk8下的webservice客户端怎样处理
背景:之前jdk8环境下,使用的cxf框架,而且是动态加载解析作为客户端。大家一直相处的很愉快。但是最近升级jdk17,发现cxf不好用了。网上百度,大部分都是说升级cxf版本,并且添加jaxb的相关依赖就可以了。但是…...
Phi-3 Forest Laboratory跨学科知识融合效果:解释STM32开发与Matlab仿真概念
Phi-3 Forest Laboratory跨学科知识融合效果:解释STM32开发与Matlab仿真概念 最近在试用Phi-3 Forest Laboratory这个模型,它有个特点让我印象挺深的,就是能把不同领域的知识串起来讲,讲得还挺明白。这有点像你身边那个“什么都懂…...
Cursor Pro 完整破解指南:开源工具实现永久免费使用的7个关键步骤
Cursor Pro 完整破解指南:开源工具实现永久免费使用的7个关键步骤 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reach…...
Python 基础教程:列表(第9篇)
什么是列表? 在python中列表(list)是一种有序、可变的数据类型,可以存储任意类型的对象(整数、浮点数、字符串甚至其他列表),使用方括号[]定义,元素之间用逗号分隔。 特点࿱…...
多线程:生产者消费者
本文展示了一个基于C的多线程生产者-消费者模型实现。核心组件ThreadSafeQueue是一个线程安全的队列模板类,使用互斥锁和条件变量实现同步机制,支持阻塞式push/pop操作。系统包含3个生产者线程(各生产10个产品)和2个消费者线程&am…...
CRLB求解中的Fisher信息阵:5个关键性质与推导技巧
CRLB求解中的Fisher信息阵:5个关键性质与推导技巧 在统计信号处理领域,Cramr-Rao下界(CRLB)是评估参数估计器性能的黄金标准。而Fisher信息矩阵作为CRLB的核心组成部分,其推导过程往往涉及复杂的矩阵运算和概率论知识。…...
elasticsearch-py完全指南:官方Python客户端的10个核心功能解析
elasticsearch-py完全指南:官方Python客户端的10个核心功能解析 【免费下载链接】elasticsearch-py Official Python client for Elasticsearch 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-py elasticsearch-py是Elasticsearch官方推出的Py…...
抖音直播WebSocket数据采集实战指南:从零搭建实时弹幕监控系统
抖音直播WebSocket数据采集实战指南:从零搭建实时弹幕监控系统 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2025最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 抖音直播数…...
前端工程化实战:项目亮点与技术难点深度解析
1. 前端工程化的核心价值与实践路径 十年前我刚入行时,前端开发还停留在"切图写jQuery"的阶段。如今随着业务复杂度提升,一个中型前端项目就可能涉及上百个组件、数十个第三方依赖。这种背景下,工程化不再是可选项,而是…...
Windows系统QT下载(保姆级教程,一步一步手把手教程!都能学会)
官网链接:https://www.qt.io/zh-cn/development/download 还有一个网盘链接:https://pan.baidu.com/s/1Ny1_MwhpwIuA_1ISt9AcWA?pwd6666 注:这不是主包分享的,是引用其他主包分享的了解,是《_清豆》这个主包的&#x…...
DevOps工具链选型新趋势:本土化适配与安全可控成企业核心考量
随着中国企业数字化转型进入深水区,DevOps工具链的选型标准正在发生深刻变革。传统以功能完备性为主导的评估体系,正逐步让位于对本土化适配深度与安全可控能力的综合考量。本文将深度解析主流DevOps平台的技术特性与行业适配性,为企业决策者…...
