WinForm应用界面开发实战 - 如何在混合框架中整合外部API接口调用
在我们常规的业务处理中一般内部处理的接口多数都是以数据库相关的基于混合式开发的Winform开发框架虽然在客户端调用的时候一般选择也是基于Web API的调用不过后端我们可能不仅仅是针对我们业务数据库的处理也可以能是调用其他外部接口如物流、供应商接口等接口本文主要介绍基于混合式开发框架如何整合外部API接口的调用。PS给大家推荐一个C#开发可以用到的界面组件——DevExpress WinForms它能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任DevExpress新旧版本帮助文档获取可点击这篇文章查看——《界面控件DevExpress v26.1帮助文档大全CHM版本》1. 混合式框架的结构介绍混合式的框架是可以在客户端访问Web API服务、WCF服务或者直接连接数据库几种方式的综合而尤以Web API为最广泛的应用它的整个框架的结构如下所示。在客户端中通过统一的工厂类CallerFactoryT对相应的接口进行访问这里主要就是服务器端Web API服务接口的处理以及客户端对Web API接口的封装两部分通过一些基类进行简化处理可以极大提高开发效率。对于外部第三方的Web API接口我们也可以在自己的Web API接口中进行包装使得客户端通过相应的接口进行交互即可不需要理会内部还是外部的接口从而实现透明的接口调用。2. RFID外部接口的整合处理在一个客户的应用案例中需要整合服务商RFID接口实现相应的数据交互本文也是基于这个案例进行整个过程的分析和操作使得我们了解在混合框架中如何整合第三方Web API接口为我们内部框架所用。一般来说Web API接口需要明确API的URL、数据提交方式POST/GET、提交参数、返回集合以及一些特殊的数据等而一般接口的操作也是需要一个访问令牌的这些都是Web API接口调用的关键。基本上我们有了上面Web API的1/2/3步骤的信息就可以进行接口编程了这些是Web API开发非常重要的信息。我们需要特别主要到步骤1中的信息这里面的token是额外的接口信息是需要设置Http Request请求的头部信息里面的是用户身份的重要信息所以我们一般需要先通过指定的授权接口获取这个token信息。在这个外部的接口集合里面我们找到统一登录验证的接口定义如下所示。通过上面的分析我们首先需要需要处理好登录验证接口然后通过接口传递令牌token给其他接口进行数据处理的。结合我们的混合框架结构这里我以测试项目TestProject项目为例进行介绍我们调整WHC.TestProject.Caller项目的对应类如下所示。其中Facade层接口类IRFIDService.cs代码如下所示。/// summary /// RFID服务外部接口 /// /summary [ServiceContract] public interface IRFIDService { /// summary /// 终端用户统一登录验证 /// /summary [OperationContract] CheckinResult CheckIn(string username, string password, string device_uuid, string device_type, string last_app_version, string app_id); /// summary /// 获取标签发货通知单批量 /// /summary [OperationContract] TagOrderAsnResult TagOrderAsn(int brand_id, string factcode, string start_time, string end_time, PagerInfo pagerInfo, string token); /// summary /// 标签订单出库物流信息回写 /// /summary [OperationContract] CommonResult TagOutPost(string docno_asn, string factcode, string dest_factcode, ListFreightInfo freight, string token); }这里面的接口定义我们是根据输入参数、输出参数进行定义的另外token是额外增加的令牌参数用于请求头部写入信息的。这个接口的定义其实和我们常规的Web API接口定义没有太多的不同如下是一个内部客户信息接口定义。/// summary /// 客户信息的服务接口 /// /summary [ServiceContract] public interface ICustomerService : IBaseServiceCustomerInfo { /// summary /// 根据客户名称获取客户列表 /// /summary /// param namename客户名称/param /// returns/returns [OperationContract] ListCustomerInfo FindByName(string name); }差别就是它们接口继承类有所不同外部接口由于不需要和数据库打交道我们不需要继承IBaseService接口。根据这些接口的定义我们还需要实现我们具体的Web API 服务逻辑上它是对外部Web API接口的封装但是对于客户端来说并不需要知道是内部还是外部接口客户端只需要知道如果提交参数或者结果即可。由于Web API涉及多个参数的数据提交一般来说这种情况都是以POST方式处理的数据参数则统一在Web API端通过定义一个JObject对象来传递即可登录认证的Web API接口定义如下所示。/// summary /// 基于RFID的应用接口 /// /summary public class RFIDController : BaseApiController { /// summary /// 终端用户统一登录验证 /// /summary /// param nameparam包含多个属性的对象/param /// param nametoken访问令牌/param [HttpPost] public CheckinResult CheckIn(JObject param) { CheckinResult result null; dynamic obj param; if (obj ! null) { //使用POST数据 var postData param.ToJson(); //使用具体的URL var queryUrl https://***.***.***/api/v6/rfid/terminal/checkin/post; var helper new HttpHelper(); helper.ContentType application/json; var content helper.GetHtml(queryUrl, postData, true); RFIDBaseDataCheckinResult jsonResult JsonConvert.DeserializeObjectRFIDBaseDataCheckinResult(content); if (jsonResult ! null jsonResult.code 0) { result jsonResult.data; } return result; } else { throw new MyApiException(传递参数错误); } }其中输入的参数这里用了JObject param的参数我们提交给外部Web API接口的时候我们把这个参数再次序列号为JSON格式的字符串即可var postData param.ToJson();其中CheckinResult和RFIDBaseData是根据输入参数、输出结果进行的实体类定义目的是序列化为强类型的实体类方便数据处理操作。在客户端我们只需要对接好和Web API服务端的接口那么调用起来就非常方便其中对应的Web API接口客户端封装类 RFIDCaller 如下所示。/// summary /// 对RFID控制的接口调用封装 /// /summary public class RFIDCaller : NormalApiService, IRFIDService { public RFIDCaller() { this.ConfigurationPath ApiConfig.ConfigFileName; //Web API配置文件 this.configurationName ApiConfig.RFID; } public CheckinResult CheckIn(string username, string password, string device_uuid, string device_type, string last_app_version, string app_id) { var action System.Reflection.MethodBase.GetCurrentMethod().Name; string url GetNormalUrl(action); var postData new { username username, password password, device_uuid device_uuid, device_type device_type, last_app_version last_app_version, app_id app_id, }.ToJson(); var result JsonHelperCheckinResult.ConvertJson(url, postData); return result; }有了这些我们直接在客户端的界面里面就可以通过调用CallerFactoryT进行处理操作了如下是客户端窗体获取验证身份令牌数据的代码private string token null;//访问RFID接口的token /// summary /// 根据终端用户统一登录验证获取相关访问token /// /summary /// returns/returns private string GetRFIDToken() { string username wuhuacong; string password 123456; string device_uuid aaaaaaa; string device_type iphone; string last_app_version xxxxxxx; string app_id ntdf5543581a2f066e74cf2fe456; var result CallerFactoryIRFIDService.Instance.CheckIn(username, password, device_uuid, device_type, last_app_version, app_id); if(result ! null) { token result.token; } return token; }上面是认证身份的接口其他类型的接口类似的处理方式如增加了一个获取标签发货通知单批量操作后对应的客户端封装类如下所示。/// summary /// 对RFID控制的接口调用封装 /// /summary public class RFIDCaller : NormalApiService, IRFIDService { public RFIDCaller() { this.ConfigurationPath ApiConfig.ConfigFileName; //Web API配置文件 this.configurationName ApiConfig.RFID; } public CheckinResult CheckIn(string username, string password, string device_uuid, string device_type, string last_app_version, string app_id) { var action System.Reflection.MethodBase.GetCurrentMethod().Name; string url GetNormalUrl(action); var postData new { username username, password password, device_uuid device_uuid, device_type device_type, last_app_version last_app_version, app_id app_id, }.ToJson(); var result JsonHelperCheckinResult.ConvertJson(url, postData); return result; } public TagOrderAsnResult TagOrderAsn(int brand_id, string factcode, string start_time, string end_time, Pager.Entity.PagerInfo pagerInfo, string token) { var action System.Reflection.MethodBase.GetCurrentMethod().Name; string url GetNormalUrl(action) string.Format(?token{0}, token); var postData new { page pagerInfo.CurrenetPageIndex, pagesize pagerInfo.PageSize, brand_id brand_id, factcode factcode, start_time start_time, end_time end_time, }.ToJson(); var result JsonHelperTagOrderAsnResult.ConvertJson(url, postData); return result; }获取标签发货通知单批量的Web API接口如下代码定义/// summary /// 获取标签发货通知单批量 /// /summary /// param nameparam/param /// param nametoken/param /// returns/returns [HttpPost] public TagOrderAsnResult TagOrderAsn(JObject param, string token) { TagOrderAsnResult result null; dynamic obj param; if (obj ! null) { //使用POST方式 var postData param.ToJson(); var queryUrl https://***.***.***/api/v6/rfid/tag/tag_order_asn/get; var helper new HttpHelper(); helper.ContentType application/json; helper.Header.Add(token, token); var content helper.GetHtml(queryUrl, postData, true); RFIDBaseDataTagOrderAsnResult jsonResult JsonConvert.DeserializeObjectRFIDBaseDataTagOrderAsnResult(content); if (jsonResult ! null jsonResult.code 0) { result jsonResult.data; } return result; } else { throw new MyApiException(传递参数错误); }其中表头信息我们通过下面的代码指定设置特殊的token表头信息。var helper new HttpHelper(); helper.ContentType application/json; helper.Header.Add(token, token);而在客户端的调用窗体里面我们调用对应的接口就可以获取该接口的数据了。private TagOrderAsnResult asnResult; /// summary /// 根据参数获取标签生产订单批量信息 /// /summary /// returns/returns private TagOrderAsnResult GetResult() { PagerInfo pagerInfo new PagerInfo() { PageSize 50, CurrenetPageIndex 1 };//初始化一个分页条件 var brand_id this.txtbrand_id.Text.ToInt32(); var factcode this.txtfactcode.Text; var start_time this.txtstart_time.DateTime.ToString(yyyy-MM-dd HH:mm:ss); var end_time this.txtend_time.DateTime.ToString(yyyy-MM-dd HH:mm:ss); asnResult CallerFactoryIRFIDService.Instance.TagOrderAsn(brand_id, factcode, start_time, end_time, pagerInfo, Token); return asnResult; }通过上面的代码演示我们了解了在混合框架基础上增加外部Web API接口的方法通过增加Facade层接口增加Web API接口以及对应的客户端封装类具体处理参数根据Web API接口的输入参数、输出数据等信息进行综合处理即可。最后我们来看看数据的展示界面。本文转载自博客园 - 伍华聪

相关新闻

界面控件DevExpress WPF Splash Screen,让应用启动画面更酷炫!

界面控件DevExpress WPF Splash Screen,让应用启动画面更酷炫!

DevExpress WPF的Splash Screen组件可以为应用程序创建十分酷炫的启动屏幕,提高用户在漫长的启动操作期间的体验! P.S:DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress …

2026/7/31 17:53:32阅读更多 →
第二阶段 12 · range 范围查询

第二阶段 12 · range 范围查询

阶段&#xff1a;第二阶段 / 查询能力 ES 查询&#xff1a;range | PostgreSQL 对照&#xff1a;BETWEEN / > / <1. 概念 range 用于数值、日期、字符串的范围过滤。参数&#xff1a;参数含义SQL 对应gt大于>gte大于等于>lt小于<lte小于等于<range 通常放在 …

2026/7/31 17:51:32阅读更多 →
从金漪湖论剑看懂智能体OPC金华模式:AI生态浪潮下,一座地级市的产业创新样本

从金漪湖论剑看懂智能体OPC金华模式:AI生态浪潮下,一座地级市的产业创新样本

2026年&#xff0c;智能体正在颠覆整个产业&#xff0c;AIOPC一人成军、一将千军在智能体的助力下&#xff0c;正在迎来创新创业梦想的井喷。放眼全国&#xff0c;OPC赛道热潮奔涌。北上广深杭等一线科创城市凭借头部互联网企业、海量资本、顶尖人才先发入局&#xff0c;算力补…

2026/7/31 17:51:32阅读更多 →
论文降重和降 AI 是一回事吗?论双降模式的必要性与操作指南

论文降重和降 AI 是一回事吗?论双降模式的必要性与操作指南

在毕业论文撰写完毕后的自查和修改阶段&#xff0c;很多同学经常会被查重率&#xff08;Similarity rate&#xff09;和 AI 检出率&#xff08;AIGC rate&#xff09;这两个指标搞得焦头烂额。最常见的惨剧莫过于&#xff1a;有的人花了两天时间疯狂翻词典改句式&#xff0c;把…

2026/8/1 9:35:14阅读更多 →
品质看着过得去,客户却越来越少?工厂亏在“没有标准的质量”

品质看着过得去,客户却越来越少?工厂亏在“没有标准的质量”

很多中小工厂的品质管理&#xff0c;一直停留在一个误区&#xff1a;产品差不多就行、外观没大问题、功能不出故障&#xff0c;就算合格出货。车间全靠质检员眼力、师傅经验、员工自觉把控。每一批产品品质忽高忽低&#xff0c;时而稳定、时而翻车。看似能出货、能交付&#xf…

2026/8/1 9:35:14阅读更多 →
猫抓浏览器扩展技术解析:现代Web资源嗅探架构与流媒体处理方案

猫抓浏览器扩展技术解析:现代Web资源嗅探架构与流媒体处理方案

猫抓浏览器扩展技术解析&#xff1a;现代Web资源嗅探架构与流媒体处理方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓浏览器资源嗅探扩展…

2026/8/1 9:35:14阅读更多 →
从ADC到DDC:DNA可编程药物如何引领计算医疗新纪元

从ADC到DDC:DNA可编程药物如何引领计算医疗新纪元

1. 从ADC到DDC&#xff1a;一场靶向治疗范式的深层跃迁最近和几位做新药研发的朋友聊天&#xff0c;话题总绕不开ADC。这个领域现在太火了&#xff0c;火到几乎所有的Biotech公司都在布局&#xff0c;火到资本市场听到“ADC”三个字母就兴奋。但聊着聊着&#xff0c;大家也开始…

2026/8/1 9:35:14阅读更多 →
小熊猫Dev-C++:从零开始学习C++的终极轻量级开发环境指南

小熊猫Dev-C++:从零开始学习C++的终极轻量级开发环境指南

小熊猫Dev-C&#xff1a;从零开始学习C的终极轻量级开发环境指南 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 你是否曾经因为复杂的开发环境配置而放弃学习C&#xff1f;或者被臃肿的IDE搞得头晕眼花&a…

2026/8/1 9:35:14阅读更多 →
Seraphine:英雄联盟智能辅助工具 - 自动BP与战绩查询完整指南

Seraphine:英雄联盟智能辅助工具 - 自动BP与战绩查询完整指南

Seraphine&#xff1a;英雄联盟智能辅助工具 - 自动BP与战绩查询完整指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 你是否厌倦了在英雄联盟排位赛中手忙脚乱地查询对手信息&#xff1f;是否希望有一个智…

2026/8/1 9:33:14阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

&#x1f539; 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具&#xff0c;凭借本地离线运行、可视化图形操作和任务自动化三大核心特性&#xff0c;赢得了众多用户的青睐。与普通在线对话AI工具不同&#xff0c;它属于能够直接操控本机软硬件的智能数字员工…

2026/7/31 20:44:05阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接&#xff0c;是用激光束对阀座壳体&#xff08;通常为不锈钢或铝合金&#xff09;进行密封焊接&#xff0c;使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/31 17:41:43阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX&#xff1a;三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/31 20:44:05阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南&#xff1a;如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域&#xff0c;视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时&#xff0c;光是文献检索就花了整整两周时间&#xff0c;打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化&#xff0c;合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统&#xff1a;从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南&#xff1a;如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域&#xff0c;视频编辑处理的质量损…

2026/8/1 0:00:10阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时&#xff0c;光是文献检索就花了整整两周时间&#xff0c;打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化&#xff0c;合理使用这些工具可以节省80%以…

2026/8/1 0:00:10阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统&#xff1a;从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/1 0:00:10阅读更多 →