在Winform混合式框架中整合外部API接口的调用

2023-11-10 21:30

本文主要是介绍在Winform混合式框架中整合外部API接口的调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是基于Web API的调用,不过后端我们可能不仅仅是针对我们业务数据库的处理,也可以能是调用其他外部接口,如物流、供应商接口等接口,本随笔就是主要介绍基于混合式开发框架如何整合外部API接口的调用。

1、混合式框架的结构介绍

 我们知道,混合式的框架是可以在客户端访问Web API服务、WCF服务或者直接连接数据库几种方式的综合,而尤以Web API为最广泛的应用,它的整个框架的结构如下所示。

在客户端中,通过统一的工厂类CallerFactory<T>对相应的接口进行访问,这里主要就是服务器端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, List<FreightInfo> freight, string token);}

这里面的接口定义,我们是根据输入参数、输出参数进行定义的,另外token是额外增加的令牌参数,用于请求头部写入信息的。

这个接口的定义其实和我们常规的Web API接口定义没有太多的不同,如下是一个内部客户信息接口定义。

    /// <summary>/// 客户信息的服务接口/// </summary>
    [ServiceContract]public interface ICustomerService : IBaseService<CustomerInfo>{               /// <summary>/// 根据客户名称获取客户列表/// </summary>/// <param name="name">客户名称</param>/// <returns></returns>
        [OperationContract]List<CustomerInfo> 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 name="param">包含多个属性的对象</param>/// <param name="token">访问令牌</param>
        [HttpPost]public CheckinResult CheckIn(JObject param){CheckinResult result = null;dynamic obj = param;if (obj != null){//使用POST数据var postData = param.ToJson();//使用具体的URLvar queryUrl = "https://***.***.***/api/v6/rfid/terminal/checkin/post";var helper = new HttpHelper();helper.ContentType = "application/json";var content = helper.GetHtml(queryUrl, postData, true);RFIDBaseData<CheckinResult> jsonResult = JsonConvert.DeserializeObject<RFIDBaseData<CheckinResult>>(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 = JsonHelper<CheckinResult>.ConvertJson(url, postData);return result;}

有了这些,我们直接在客户端的界面里面,就可以通过调用CallerFactory<T>进行处理操作了,如下是客户端窗体获取验证身份令牌数据的代码

        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 = CallerFactory<IRFIDService>.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 = JsonHelper<CheckinResult>.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 = JsonHelper<TagOrderAsnResult>.ConvertJson(url, postData);return result;}

获取标签发货通知单批量

 的Web API接口如下代码定义

 

        /// <summary>/// 获取标签发货通知单批量/// </summary>/// <param name="param"></param>/// <param name="token"></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);RFIDBaseData<TagOrderAsnResult> jsonResult = JsonConvert.DeserializeObject<RFIDBaseData<TagOrderAsnResult>>(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 = CallerFactory<IRFIDService>.Instance.TagOrderAsn(brand_id, factcode, start_time, end_time, pagerInfo, Token);return asnResult;}

通过上面的代码演示,我们了解了在混合框架基础上增加外部Web API接口的方法,通过增加Facade层接口,增加Web API接口,以及对应的客户端封装类,具体处理参数根据Web API接口的输入参数、输出数据等信息进行综合处理即可。

最后我们来看看数据的展示界面。

 

这篇关于在Winform混合式框架中整合外部API接口的调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/385359

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方