非连接模式下用户和服务器对话的一种通用方法
2019-10-21范新龙董奇
范新龙 董奇
【摘要】在使用微信公众号开发过程中,用户经常需要和服务器进行对话,后台需要知道用户提交信息的上文是什么,在连接状态下,可以通过整个页面的提交,比较容易的得到用户的请求信息并进行相应的处理。在微信公众号的开发模式下,由于服务器收到的用户信息是通过微信服务器转发的,对话时这些上下文信息的处理就需要采取其他手段来保存。文中介绍了一种在非连接模式下用户和服务器进行对话的通用处理方法,通过较为简单的方法实现了上下文信息的保存和处理,并通过php为例进行了实现。
【关键词】微信公众号 ; 会话 ; php ; 上下文信息保存
资金项目:陕西省教育厅2018年科学研究专项项目《钢轨焊缝探伤自动化中通信及大数据分析模块的研究与实现》,项目编号为18JK1113
一、问题的提出
利用微信公众号进行开发时,通常会采用开发模式,在开发模式下,用户提交的查询信息会通过微信服务器与应用服务器进行交互。(见图1)
在开发教学系统的课程信息查询模块时,有这样的需求:用户在微信企业号中输入课程的信息,会得到相关提示信息,用户根据提示信息输入相应的编号或更进一步的查询信息,一步一步的输入自己关注的信息,就可以查询到所需的信息。微信企业号将这些信息传递到后台,后台取出相应的结果发给查询用户。在实现时,产生了一个问题:因为服务器接口同时为很多用户服务,因此用户输入后续信息时,服务器接口必须能判断出来后续信息对应的先导信息是哪个,从上面的流程中,可以看出,如果仅仅用微信服务器的对话方式是无法满足上述需求的。
例如:用户想了解自己的某门课的开课情况,可以先输入“单片机原理”,服务器给出对应的提示信息后,用户可以再次输入“课表”,查询单片机原理的排课情况,也可以输入“教室”、“实验室”等查询单片机原理在那间教室上课或做实验,由于对话过程是通过用户和服务器之间一问一答的方式进行的,用户和服务器之间又处于非连接状态,因此服务器必须能够正确的判断出“课表”到底是要查询哪门课的课表,正确理解用户输入信息对应的上文以及相应的响应就需要进行上文分析,对有较多上文提示和经常变化提示的应用,这个处理过程就显得很繁琐。考虑到这些因素进行编程,程序开发就显得极为复杂,必须将操作流程的全过程进行通盘考虑,逻辑上不能有任何疏漏,还要考虑用户输入了程序不能处理信息的情况流程,对用户的使用也显得不友好,另外,在程序维护时,当层次多时,其逻辑组合关系会很富在,为维护带来困难。
二、会话信息存储处理方法
要保存上述中的会话信息,方法比较多,资料中也有称此为自制Session或Cookite保存的,这些方法主要不外乎这么几种:
(一)用文本文件保存:在收到用户提交的信息后,将其进行格式化后,以自定的一种格式,将其保存在文本文件中或.INI文件中。
(二)数据库保存:在数据库中专门开设一个表,在其中存放用户与后台交互的现状及历史信息。
(三)其他:存成Json或XML格式,这是类似文本的一种方法。
这些方法都能实现保存上下文的目的,主要存在的问题是,每次取出来的保存数据要进行多种判断处理才能搞清其输入所对应的上文,针对不同的应用,要编写不同的程序处理,降低了程序开发效率,那么能不能开发一个通用的程序解决这个问题呢?
通过多次测试,开发了一个通用处理类,将上下文现场数据和处理方法用类实现,并通过类的字符序列化,将类数据连同处理方法一并存储,使用时恢复现场,就好像类一直在工作一样。
三、利用类实现会话
现代程序设计语言大都支持类操作,在类中可以保存用户数据,同时在类中提供处理数据的方法或函数,这样实现的好处是在不同的应用中,只要进行少量修改,就可以用在不同的应用系统开发中,不需要为每个应用重新开发一种上下文的处理程序,下面介绍具体实现思路。
(一)定义上下文数组
定义一个上下文提示信息数组,这个内容在不同的应用中可以是不同的,根据需要设置,数组中主要定义了需要与用户输入匹配的关键词和对话的层级,这个数组基本是一个树形目录,每次根据当前所在层级和用户信息决定分支,如(图2)
上面的JSON数组定义了上下文的關系和处理方法,其中level定义了对话级别,在微信对话过程中,如果对话在30分钟内(这个时间可以自己定义)没有下文输入,对话回到结束,在输入的内容将与上面的数组中定义的1级进行比对,输入的,开启新的对话;order定义了显示的顺序;msg定义了对话信息;next:定义了下一步要执行的方法,如prompt则回显一个提示信息;process(n)表示执行程序n定义的函数。
(二)定义类变量及处理函数:
这部分主要处理收到用户信息后,进行比较所需要的变量和函数,包括了当前会话的层级levelStep、正在处理的关键字SessionKeyWord以及处理函数getNextPrompt,用于根据用户输入的信息得到返回给用户的提示并确定当前所在的层级。(见图三)
例如:当得到用户输入的信息时,判断其所在的层级(levelStep),从上述定义的内容数组中,查到对应的操作内容,如输入了“课表”,如果当前levelStep=1,则通过查找无法找到对应的项目,getNextPrompt()就将levelStep=1的内容都提取出来发送给用户,显示类似如下信息:(见图4)
如果用户输入了“课表”,而当前levelStep=3时,假设系统查到上文信息是“C语言”,则进行“Process(31)”,程序进行相应处理即可。
(三)保存和恢复类对象
类在生成对象后,一般情况下,会初始化所有变量,那么如果每次收到用户消息再进行初始化,则无法得到用户前期处理的上文消息,为此采用了对象字符序列化的方法保存和生成对象。在php中对象字符序列化和反序列化的函数为:serialize() 和unserialize() (其他编程语言请查询相应函数),每次处理完用户发送的信息后,用serialize()函数将对象直接进行字符序列化并保存,待下次收到消息时再用反序列化函数unserialize()得到已经实例化对象,无需初始化,恢复到上次处理时的现场数据。
四、结束语
文中介绍了一种通用的保存对话时上下文关系的类的实现方法,最大的特点是通用性强,通过对象字符序列化技术保存和恢复技术,使得程序结构简洁、清晰,通用性强,使用时只需要修改会话的数组和最后的处理程序即可,希望能为同类开发提供借鉴。
参考文献:
[1]沈思莹.交互设计在银行产品开发中的应用[J].中国金融电脑,2014(1):51-56.
[2]基于微信公众平台的分层教学模式的设计与研究[D].北京交通大学.2016
[3]黄宇.SOAP消息交互安全机制的研究[D].华中科技大学.2014
[4]谢轶.分布式消息总线中消息代理的设计与仿真[D].北京邮电大学.2014
[5]赵敬,李贝.微信公众平台发展现状初探[J].新闻实践.2013(08)8-10.
作者简介:范新龙:男 硕士 副教授,研究方向:通信技术、通信网络互联。董奇:男 硕士 副教授 ,研究方向:铁道通信信号、现代教育技术。