精华内容
下载资源
问答
  • 在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是...1、混合式框架结构介绍 我们知道,混合框架是可以在客户端...
    在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的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();
                    //使用具体的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);
                    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">www.mhylpt.com/ </param>
            /// <param name="token">www.dashuju178.com </param>
            /// <returns></returns>
            [HttpPost]
            public TagOrderAsnResult TagOrderAsn(JObject param, dasheng178.com 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(www.hjshidpt.com/);
                    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 == www.longboshyl.cn0)
                    {
                        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接口的输入参数、输出数据等信息进行综合处理即可。
    展开全文
  • 本文以重庆某框架式码头为例,利用有限元软件ANSYS建立空间三维模型,对其进行静力计算并得出单一荷载工况下不同构件的各单元力学响应值。结合MATLAB软件对这些力学响应值进行组合计算,整理出各构件的最不利荷载组合...
  • unredux:交互应用程序的无框架体系结构
  • 预制装配高层框架结构抗震性能动力分析,刘士彬,段磊,以某九层新型全预制装配钢筋混凝土框架结构为工程背景,对其抗震性能进行动力弹塑性数值模拟分析,得到结构层间剪力、层间位移
  • 采用模型模态试验方法对汽轮发电机组框架式基础的振动特性进行了研究
  • 为了在安全开采的前提下实现经济效益最大化,从矿山开采工程状况及岩石力学条件出发,建立不同框架式采场结构参数的有限元数值计算模型。通过有限元计算结果建立应力约束的体系应变能最大化的目标函数,应用Matlab编程...
  • 目的 研究蜂窝框架结构的受力特点、破坏模式以及抗震性能.方法 对单层单跨蜂窝框架结构进行水平低周反复加载试验,控制蜂窝梁扩高比K=1.5,对蜂窝框架结构的受力特点、破坏模式以及抗震性能等因素进行...
  • 结合略阳县城狮子山滑坡的治理,讨论了格构锚杆框架结构治理松散堆积体滑坡设计的全过程。根据防治区的工程地质情况和相应的规范要求,确定了防治工程的安全等级。利用格构锚杆框架结构所采用的小间距、小吨位...
  • 根据翼体结构的承载形变特征,通过有限元拓扑优化和理论分析,认为增设斜支撑肋板可有效提高翼体结构的弯/扭刚度。对此,建立了简化理论分析模型,探讨了斜支撑肋板对结构刚度的影响,然后提出了含斜支撑肋板的改进翼体...
  • 逆流机械通风冷却塔框架结构静力学分析,马昆,高顶,冷却塔是通过一个热、质交换的综合过程使水得到冷却的设备,广泛用于工业生产的热能环节。冷却塔的可靠性、稳定性和安全性与塔的
  • SELF:因果发现的结构方程可能性框架
  • 预制装配建筑的发展是我国建筑业"十三五"期间重要战略之一,而框架结构则是其应用较多的结构体系。基于此,运用系统可靠度理论指导并借助高效率的寻优算法对预制装配混凝土框架结构进行优化具有重要的理论与现实...
  • 装配全轻页岩陶粒混凝土墙板-框架结构抗震性能研究,王宗元,王建强,为研究装配全轻页岩陶粒混凝土墙板-框架结构的抗震性能,对空框架、墙板与框架柱连接、墙板与框架梁连接的试件进行了有限元分�
  • Spring框架体系结构

    2020-11-27 16:08:29
    Spring框架的体系结构 核心容器: 核心容器组成的核心,Beans,上下文和表达式语言模块,其细节如下: 核心模块提供了框架的基本组成部分,包括IoC和依赖注入功能。 Bean模块提供BeanFactory是工厂模式的经典实现。...

    Spring有可能成为所有企业应用程序的一站式服务,然而,Spring是模块化的,使您可以挑选哪些模块是适用的,而不必把在余下的也引入。以下部分给出详细介绍在Spring框架中所有可用的模块。

    Spring框架提供约20个模块,可以根据应用程序的要求来使用。

    Spring框架的体系结构

    在这里插入图片描述

    核心容器:
    核心容器组成的核心,Beans,上下文和表达式语言模块,其细节如下:

    核心模块提供了框架的基本组成部分,包括IoC和依赖注入功能。

    Bean模块提供BeanFactory是工厂模式的经典实现。

    Context 上下文模块建立在由核心和Bean类模块提供了坚实的基础,它是访问定义和配置的任何对象的媒介。在ApplicationContext接口是上下文模块的焦点。.

    表达式语言模块提供了在运行时查询和操作对象图的强大的表达式语言。

    数据访问/集成:
    数据访问/集成层包括JDBC,ORM,OXM,JMS和事务处理模块,其细节如下:

    JDBC模块提供了不再需要冗长的JDBC编码相关了JDBC的抽象层。

    ORM模块提供的集成层。流行的对象关系映射API,包括JPA,JDO,Hibernate和iBatis。

    OXM模块提供了一个支持对象/ XML映射实现对JAXB,Castor,使用XMLBeans,JiBX和XStream 的抽象层。

    Java消息服务JMS模块包含的功能为生产和消费的信息。

    事务模块支持编程和声明式事务管理实现特殊接口类,并为所有的POJO。

    Web:
    在Web层包括网络,Web-Servlet,Web-Struts和网络的Portlet 组件,其细节如下:

    Web模块提供了基本的Web开发的集成特性,例如多方文件上传功能和使用的servlet监听器的IoC容器初始化和针对Web的应用程序上下文。

    Web-Servlet 模块包含Spring的模型 - 视图 - 控制器(MVC)实现Web应用程序。

    Web-Struts 模块包含支持类内的Spring应用程序集成了经典的Struts Web层。

    Web-Portlet 模块提供了MVC实现在portlet环境中使用和镜子Web的Servlet的模块的功能。

    其他:
    还有像AOP,切面,规范,网络和测试模块,其详细情况如下其他一些重要的模块:

    AOP模块提供了面向方面编程实现,允许您定义方法拦截器和切入点,以干净解耦,实现的功能,应该分开的代码。

    Aspects 模块提供与AspectJ的集成这又是一个功能强大且成熟的面向方面编程(AOP)框架。

    Instrumentation 模块提供了一定的应用服务器中使用类工具的支持和类加载器实现。

    测试模块支持Spring 组件使用 JUnit 或 TestNG 框架的测试。

    展开全文
  • 最近在改版网站,采用了响应设计,也是刚刚开始学习,现在遇到了一个问题,就是顶部的导航每页都是一样的,如果每页一写,将来如果需要修改的话,一页页改太麻烦了,以前HTML有框架结构,直接引入一个页面即可,有...

    最近在改版网站,采用了响应式设计,也是刚刚开始学习,现在遇到了一个问题,就是顶部的导航每页都是一样的,如果每页一写,将来如果需要修改的话,一页页改太麻烦了,以前HTML有框架结构,直接引入一个页面即可,有需要修改的直接改一个页面,网站所有调用的就一起更新了,但是看了网上的一些模板,好象导航都是每页单独写的,不知道对于向应式网站是否也有这种简便的方式?请了解的前辈指点,谢谢

    展开全文
  • 目的研究装配式框架剪力墙结构体系中柱与墙之间的连接方法及受力性能,为该类结构施工与设计方法的建立提供依据。方法提出U型筋连接、直型筋连接、连环扣连接和直u型筋连接4种装配柱-墙连接构造方式,采用有限元...
  • 结合实际工程的结构方案分析,探讨了多层砖混结构房屋采用整体式框架剪力墙加层后结构的抗震性能和计算方法,编制了考虑楼层刚度变化的计算程序.计算分析结果表明,加层后的结构性能发生明显变化,砖混结构部分的最...
  • 为了解决传统双框架陀螺结构,驱动和检测采用同一质量块,以及加工等所引起的误差,提出了一种三框架的硅微机械陀螺结构。此结构由三个框架组成,其中外框架为驱动框架,在x轴方向驱动,内框架为检测框架,当在z轴...
  • 为了获得模块化装配斜支撑节点钢框架结构体系的受力性能和设计方法,采用有限元分析方法,考虑结构整体对核心模块新型斜支撑柱的约束作用,在结构整体中研究斜支撑柱的承载能力,通过极限承载力反推得到了斜支撑柱的...
  • 日期:2012-9-28来源:GBin1.com 当你开始初建一个新的项目时,你可能需要一个不太复杂的基础框架,Kube框架应该是你最好的选择。一个独立的CSS文件,帮助你更简单的创建响应的的布...

    日期:2012-9-28  来源:GBin1.com

    当你开始初建一个新的项目时,你可能需要一个不太复杂的基础框架,Kube框架应该是你最好的选择。一个独立的CSS文件,帮助你更简单的创建响应式的的布局设计。

    kube框架

    Kube Framework包括网格、按钮、表、排版的样式和一些其它你用得上的内容,比如链接或者图像等。对于一个开发人员来说,足够的灵活性和完整的自定义是非常有必要的。如果你也正处于新建一个项目时,不妨也来使用一下Kube框架吧。

    浏览器兼容:

    • 最新版Chrome
    • 最新版Firefox
    • 最新版Safari
    • 最新版Opera
    • IE 8+
    • 兼容性:所有现代浏览器

    .....

    来源:【简报】kube框架结构-一个小型响应式CSS框架

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8288/viewspace-745893/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/8288/viewspace-745893/

    展开全文
  • Spring框架学习(本人整理,非原创) ...简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站) 轻量级开源框架。---- 百度百科 如果作为一个整体,这些模块为你提供了开发企业应用所需的一切。但你...
  • 开源框架GPUImage结构分析

    千次阅读 2018-04-26 14:26:12
    GPUImage是IOS上基于opengl的图像、视频处理开源框架,里面带有大量的滤镜,同时也很方便在原有基础上加入自己的滤镜Filter,所有滤镜是基于opengl ... GPUImage基本架构是chain式结构,主要由一个GPUImageOutput i...
  • 采用基于反应谱理论的振型分析方法和有限元分析方法对新型预制装配楼盖进行了空间结构分析,在对比分析的基础上探讨了该新型楼盖的平面内变形特征和合理的抗震设计方法。 引入了考虑楼盖实际刚度的串并联多质点系...
  • Spring基本框架结构

    2021-05-08 18:05:24
    Spring基本框架结构 Spring是一种JavaEE开发中的一站解决方案,所以其中包含的内容比较多,为了避免在应用中添加无用功能,所以Spring采用了非强制性的模块化结构,在具体应用中,可以根据应用所需要的功能进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,890
精华内容 1,956
关键字:

框架式结构