1. 引言
随着我国高等教育的快速发展,教务管理工作成为高校日常校务的重要环节,高校教务查询系统的建设也成为完善高校教务信息管理的必经之路 [1] 。传统的高校教务信息查询系统开发时期较早,存在着诸多不便:登录使用流程复杂;仅支持PC端浏览器访问而不兼容手机和平板等移动端访问,移动适配性和兼容性较差;访问地域受限制,只支持校园内网访问等,这影响了在校的师生对教务查询系统的使用体验。高校师生经常使用教务信息系统去查询成绩、课表等信息,为了提升高校师生使用教务查询系统的体验,支持师生们随时随地的移动查询需求,设计一种便捷的移动教务查询系统势在必行。该移动系统满足几个基本需求:支持教务信息的移动查询访问、保持已有教务系统无变更情况下的无缝接入,它是移动互联网时代下传统B/S架构校园教务系统向移动智能终端的延伸。
HTTP是Hyper Text Transfer Protocol (超文本传输协议)的缩写,它的发展是万维网协会和Internet工作小组IETF (Internet Engineering Task Force)合作的结果,最终发布了一系列的HTTP RFC标准版本,其中最著名的就是RFC 2616标准版。RFC 2616定义了普遍使用的一个版本——HTTP 1.1。HTTP是一个属于应用层的面向对象的TCP/IP协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议的主要特点可概括为:支持B/S模式;服务简单高效;数据对象类型灵活;无连接通信方式;无状态工作协议。HTTP是一个基于请求与响应模式的、无状态的应用层协议,常基于TCP的连接方式,目前大多数的Web开发是构建在HTTP协议之上的Web应用。高校使用的教务信息系统主要是正方教务等HTTP Web应用 [2] ,HTTP分析模拟技术为实现这种Web查询系统提供了技术基础。通过对该HTTP Web教务系统的登录与查询等流程进行HTTP分析,解析提取HTML (Hypertext Markup Language)页面中用户需要的关键数据,经数据的清洗和整理,最后返回查询结果给移动端用户。基于这种HTTP分析模拟技术设计的教务查询代理系统,无需变更现有的教务系统架构设计,也不影响教务管理的正常运行,通过Android API [3] 或微信小程序 [4] 等移动开发技术提供对移动端的支持,拓展了教务查询系统的移动版,解决了用户使用流程繁琐、不适配移动端等痛点需求。
2. HTTP分析模拟方法
2.1. HTTP请求分析
HTTP协议是由Web客户端发起请求,服务器回送响应。一次HTTP交互操作称为一个事务,其工作过程可分为四个步骤。以Web教务查询为例,1) 首先客户机与Web服务器需要建立连接。当输入教务系统的URL (Uniform Resource Locator)网址或单击其超链接,则HTTP交互工作开始;2) 客户机发送一个请求给教务系统服务器,请求方式的格式为:URL网址、协议版本号、MIME信息(包括请求修饰符、客户机信息和其他可能的内容);3) 教务系统服务器给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和查询内容;4) 客户端接收Web服务器所返回的结果数据并通过浏览器界面显示,最后客户机与教务系统服务器断开连接。
HTTP请求由三部分组成,分别是:请求起始行、请求消息头、请求消息体 [5] 。请求起始行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF,其中Method表示HTTP请求方法如GET或POST等;Request-URI是一个URL访问网址;HTTP-Version表示请求的HTTP协议版本如HTTP/1.1;CRLF表示回车和换行。请求消息头允许浏览器客户端向服务器端传递请求的附加信息以及客户端自身的信息,常见的请求头域有Accept (浏览器可接受的MIME类型)、Referer (用户从该URL页面出发访问当前请求的页面)、User-Agent (浏览器类型,如果返回的内容与浏览器类型有关则该值很有用)等。HTTP请求消息体含有其他附加信息,移动端常见的请求体是任意类型,Web服务器不解析消息体,消息体的处理需由上层应用自行解析。
2.2. HTTP响应分析
在接收和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也是由三个部分组成,分别是:响应状态行、响应消息头、响应消息体。响应状态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF,其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。响应状态行包括了HTTP协议版本、HTTP状态码和状态等重要信息,其中HTTP状态码是判断请求结果的重要标准。响应消息头允许服务器传递不能放在响应状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。它包含各种属性,其中Cookie信息是较为重要的一个标记用户的属性,Cookie能让网站“记住”访问者的身份,如若有了Cookie,用户就不需要每次都输入密码进入系统,是Web应用保存用户身份的常见工具。响应消息体是服务器返回的HTML正文信息,通过解析响应消息体中的HTML就能获取需要的数据信息。
用户在使用教务系统应用时,通过多次这样的HTTP交互过程,完成教务HTML应用数据的传递和查询。因此,可以通过对交互过程中的浏览器向教务系统发出的HTTP请求以及教务系统返回的响应消息体进行HTTP分析,探究教务系统Web应用交互的规律。利用这种HTTP分析模拟技术,模拟用户发送HTTP请求到教务Web系统,并对Web教务系统HTML格式的响应消息体进行解析、清洗、定位,获取用户需要的目标数据,最终呈现于移动端用户界面,完成基于分析模拟的HTTP交互流程。
2.3. HTML消息体解析
Web教务系统服务器返回的HTTP响应消息体是一个HTML半结构化网页数据。HTML是用来描述多媒体网页的一种超文本标记语言,包含很多由尖括号包围的HTML标记,其含有所需的教务应用数据。HTML语法是由W3C组织创建的规范中进行定义的,其语法格式是由DTD (Document Type Definition)定义的,该格式定义了允许的元素、属性和层次结构。因为HTML响应数据的包容性语法特性,以及在解析过程中存在动态脚本如document.write()会改变HTML内容,导致无法使用自上而下或是自下而上的解析。HTML解析过程首先是词法分析即HTML标记化,整体算法的核心是解析状态机的改变,即解析过程中由状态机标识当前的状态到了哪一个解析阶段。其次,构建文档对象模型(Document Object Model,简称DOM)树 [6] ,将对应的HTML标记添加到DOM树上,此过程中也有一个状态机去维护对应的阶段。DOM树是HTML文档的映射关系和HTML元素对外的接口,每一个节点是由DOM元素和节点属性组成。如果遇见内部 标签,就会中断HTML解析,开始执行脚本,直到脚本执行完毕,而遇到外部的脚本,解析中断直到请求脚本回来,script解析模式在HTML 4/5规范中有详细描述。对于风格样式解 < script > 标签,就会中断HTML 解析,开始执行脚本,直到脚本执行完毕,而遇到外部 的脚本,解析中断直到请求脚本回来,script 解析模式在HTML 4/5 规范中有详细描述。对于风格样式解 析,由于解析样式不会影响DOM 树构建,也不包含关键的教务数据,所以文中不予考虑。我们的移动 教务查询系统采用,Jsoup [7]是一款基于Java 的HTML 解析器,可解析某个URL 网址和HTML 文本内 容。通过DOM 树以及近似jQuery [7]的简易操作方法取出教务数据,其操作步骤可归为三步:1) 基于 HTTP GET 请求获取对应HTML 页面数据;2) 利用 Jsoup 把HTML 页面数据解析为Document 对象;3) 利用 Document 对象的getElementById()、getElementsByTag()、select()等定位器方法依据教务数据特征定 位获取目标教务数据。/p>
3. 移动教务查询系统开发——以HTTP成绩查询为例
以我校正方教务系统的HTTP 成绩查询为例,讲述基于HTTP 分析模拟技术的Java 开发过程,重点 给出HTTP 学生成绩查询实现过程中的关键设计思想。移动端网络框架Java OKhttp [8]是一个适于处理 HTTP 交互操作的轻量级网络请求框架,它为实现移动教务查询系统提供了技术基础。不失一般性,其 他类型的教务系统如青果教务系统等[9]的设计及实现原理基本相同。
3.1. HTTP模拟登录开发
移动教务查询系统首先需要验证学生身份,包含一个HTTP模拟登录模块。通过对用户登录的HTTP交互报文分析,发现浏览器向中央认证服务器以POST的方式发送了一个HTTP请求。教务查询系统HTTP请求消息体中的HTML表单传递了username、password和service三个关键参数,其中,username代表用户的账号名,即在校学生的教务系统账号;password代表该账号的密码;service是一个固定的网址,表示登录到教务系统的管理页面。假若用户名及密码验证成功,认证服务器会返回一个含有JavaScript脚本的页面,它重定向到带有ticket属性的网址。由于HTTP模拟登录技术采用的移动端Java OKhttp网络框架不会自动执行JavaScript脚本,因此需要对JavaScript脚本进行内容分析以确定重定向网址,之后模拟执行URL跳转。首先,通过Java Jsoup组件获取此页面中JavaScript的网络地址URL,然后通过HTML GET方法访问URL网址,从而实现模拟重定向页面跳转。假若用户名及密码验证失败,则返回登录失败页面,此时可在用户界面上提示用户名密码错。
模拟重定向访问JavaScript所含URL网址后,教务服务器会返回一个状态码为302 (重定向)的HTTP响应报文,二次重定向地址正是该报文的HTML a标签中的URL地址。由于该二次重定向行为不是JavaScript脚本执行的,所以需要根据Java OKhttp网络框架的重定向自动与否属性设置来判断是否需要通过HTML GET访问该HTTP响应报文中a标签所含有的URL网址。二次重定向后,返回一个含有JavaScript脚本的HTML页面,分析该JavaScript脚本的含义,发现其将打开一个路径为/xs_main.aspx?xh=(/学号)的HTML页面。因此,在OKhttp网络框架中使用GET方法打开该URL网址,第三次URL重定向而进入教务系统个人主页,完成HTTP模拟登录。假若返回的HTML页面head标题为“正方教务管理系统”,且可以在id为xhxm的span 标签中发现学生的姓名,则表明移动端HTTP模拟登录成功。登录进入个人主页后,可缓存用户个人信息到个人Session对象中,以便跨功能模块使用,整个流程如图1所示。
Figure 1. HTTP simulation login flowchart
图1. HTTP 模拟登录流程图化
3.2. HTTP成绩查询开发
查询学期课程成绩是学生最常用的教务功能之一。HTTP成绩查询的前置条件是已登录。当移动端完成HTTP模拟登录后,在Session对象中保存着用户名、密码等个人信息,可直接获取Session对象中的个人信息进行查询。假若用户未登录,Java拦截器会拦截查询请求,并强制跳转到登录界面,要求用户执行HTTP登录。通过分析成绩查询的HTTP交互信息,发现浏览器向服务器以POST方式发出了一个HTTP请求,传递了ddlXN、ddlXQ、Button1、_VIEWSTATE四个HTML关键表单参数。此外,还以GET查询串方式向服务器提交了xh、xm和gnmkdm三个HTML关键参数。
HTML表单参数ddlXN和ddlXQ分别表示成绩查询的学年和学期。HTML表单参数Button1属于固定值,用于服务器标识查询的内容。_VIEWSTATE表单参数是ASP.NET的视图状态值,用于保存会话的Base64编码值,在HTML报文中是一个隐藏域表单数据,表示HTTP交互过程中需要向Web服务器中传递的_VIEWSTATE参数。GET查询串参数xh和xm分别表示学号和姓名,对于中文姓名,通过网络传递UTF-8类型的中文字符,会导致乱码。因此,HTML使用URLEncoder将xm参数进行URL编码,转换为application/x-www-form-urlencoded MIME字符串来传递。GET查询串参数gnmkdm作用同Button1。
在教务系统返回的HTTP响应报文中,查找class属性为datelist的table标签,含有对应学期、学年的成绩信息。每个tr标签包含一个课程成绩信息,每个td标签包含一个基本单元课程成绩信息。利用Java Jsoup可解析和定位目标成绩数据。首先使用Jsoup select选择器查找_VIEWSTATE参数值,然后向教务系统以POST方式提交查询表单,发出HTTP成绩查询请求。最后,系统返回成绩表响应报文,通过Jsoup定位HTML成绩表格,获取表格所有tr元素,循环遍历每个tr元素,可得课程成绩数据表。
RESTful API 是一个API 设计规范,适于HTTP 成绩查询这类轻量级的前后端数据接口设计,Java 技术实现RESTful 接口有三种方法:HttpClient 实现、HttpURLConnection 实现、SpringRestTemplate 实现 [10]。文中采用简洁的HttpClient 实现RESTful API 以完成移动客户端与Java 控制器端的代理数据交换。 为提高查询性能,考虑将查询获取的成绩数据缓存到高速NoSQL [11]数据库中,当MongoDB 数据库有 该学生成绩缓存时则直接高速取出使用,当成绩数据不在MongoDB 数据库中时则通过Web 教务服务器 取出学生成绩数据并缓存到MongoDB 数据库。选择MongoDB 这种基于分布式存储的高速NoSQL 数据 库来储存成绩数据,主要考虑是:1) 学生批量查阅成绩往往集中在学期末放假前,易产生成绩查询的高 并发瞬时峰值,MongoDB 数据库可支持大规模数据存储并较好支持高并发低延时的Web 查询,提高用 户响应度和用户查询体验;2) 成绩记录一旦产生,通常没有二次修改,适于成绩查询缓存;3) 高校教务 查询系统应用的复杂度不高,对数据完整性约束要求不强,适用于MongoDB 这种新型的、快速的NoSQL 数据库系统。
3.3. HTTP成绩查询测试
HTTP 成绩查询的前置条件是用户已登录,当Java 拦截控制器检测发现Session 对象未含有用户登录 信息,则拦截查询请求之后强行跳转至登录页面,要求移动客户执行HTTP 登录。当移动端已完成HTTP 模拟登录,Java 控制器可直接提取保存于Session 对象中的用户信息进行成绩查询。由于成绩查询RESTful API 返回的学生成绩数据格式,不是纯文本而是一个Json 通用数据交换格式[12],因此,Web 服务器响 应的HTTP 消息头的Content-Type 属性设置为application/json。使用PostMan HTTP 测试器工具测试成绩 查询API 接口,返回的一个JSON 格式的成绩数据示例如 图2 所示,成绩列表GradeList 属性中存放着多 个Grade 信息元素:学年、学期、课程名、学分、课程类型、成绩等。
通过Android SDK API或微信小程序API等移动开发技术提供对移动端开发支持,将返回的Json格式成绩列表GradeList以简洁便利的方式展示在移动终端如手机等,查询效果如图2所示。
Figure 1. An example of student score query
图1. 学生成绩查询示例
4. 结束语
为支持高校教务信息移动查询需求,设计了一种基于HTTP分析模拟技术的移动教务查询系统。文中以HTTP成绩查询为实例,讲解了HTTP分析模拟程序的关键思路与方法。类似地,还可开发HTTP课表查询、HTTP校园卡消费查询以及HTTP图书借阅查询等,最终实现多功能教务信息移动查询系统。
基金项目
2019年广东第二师范学院校级教学质量与教学改革工程项目(编号:2019jxgg18);广东第二师范学院软件工程重点学科建设项目(编号:9030-1700207);广东省自然科学基金项目(编号:2018A0303130169);广东省科技计划项目(编号:粤财农[2017]94号,2016A010106007);广东省应用型科技研发专项资金资助项目(编号:2016B090927010);2019年广东第二师范学院大学生创新创业训练计划项目(编号:201914278146)。
参考文献