搜索架构之道:App中的搜索系统设计与优化实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2.3 搜索建议的数据处理

客户端通过网络通信把用户当前输入的关键字上报到服务端,并在接到来自服务端的搜索建议后对建议进行解析及展现。在这个过程中,客户端和服务端需要对网络通信数据进行结构化的封装、压缩、加解密及数据校验等,以实现安全有效的数据传输。

1.数据封装

常用的数据封装及解析格式有可扩展标记语言(XML)、JavaScript对象表示法(JSON)及协议缓冲区(PB),在日常工作中使用JSON的情况相对多一些。

1)XML(eXtensible Markup Language):标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言,具有可扩展性良好、内容与形式分离、遵循严格的语法要求、保值性良好等优点。

2)JSON(JavaScript Object Notation):一种轻量级的数据交换格式,具有简洁和清晰的层次结构,这使得它成为理想的数据交换语言,不仅易于相关人员阅读和编写,还易于机器解析和生成,并且能够有效地提升网络传输效率。

3)PB(Protocol Buffers):Google公司开发的一种数据交换的格式,它独立于具体的语言和平台。并支持多种语言,如Java、C#、C++、Go和Python等,每一种语言都有相应的编译器以及库文件。相较于XML和JSON,PB序列化之后的数据是二进制的,不可读,更适合大数据量的传输。

这3种数据封装格式,iOS及Android均有支持。在实际的应用过程中,可参考数据传输场景、服务端支持情况等信息来确定使用哪一种。

2.数据压缩

数据压缩的目的是减少传输过程中的数据量,从而间接地减少网络传输时间。数据压缩常用gzip,gzip是常见的数据压缩及解压缩算法,在HTTP中也有使用,同时它还是UNIX系统默认的文件压缩格式。

3.数据加解密

加解密算法分为对称及非对称两类,常用的为Base64及RSA算法。

1)Base64:一种对称的加解密算法,所谓对称,就是指该算法加密和解密所用的密钥是相同的,Base64基于64个可打印字符来表示二进制数据,由于64=26,所以可打印字符每6位(比特)为一个描述单元;Base64通常用于文本数据处理的场合,用来表示或存储数据,常见于页面中的二进制数据描述;为了保证所输出的编码为可读字符,Base64制定了一个编码表。编码表有64个字符,这也是Base64名称的由来;Base64编码把原来每3个8位的字节(3×8=24)转化为4个6位的字节(4×6=24),字节前两位均为0,常用的编码表如表2-1所示;对于私有内容的加解密,也可以自建编码表来实现。

表2-1 Base64编码表

2)RSA:一种非对称加解密算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密;基于这个特性,RSA常用于客户端与服务端的数据传输,在客户端及服务端分别存放加密及解密的密钥,如图2-4所示,客户端发送数据时使用公钥对数据加密,然后通过网络传输加密后的数据,服务端收到数据后使用私钥对数据解密,这样即便加密的公钥被公开了,数据传输的保密性也是有保障的。

图2-4 RSA发送数据加解密过程

4.数据校验

数据校验常用的算法为MD5。MD5是一种广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值,用于确保被传输信息的完整性和一致性。它常用于数据完整性的校验,例如在客户端与服务器的数据传输过程中,先生成数据的MD5值,然后将数据及其MD5值一同传输。服务端在收到数据后,对其进行MD5计算,并将结果与收到的MD5值进行比较,以确定数据是否丢失或被篡改。

5.展现及交互

客户端收到服务端返回的搜索建议数据后,使用UI控件对搜索建议内容进行展现,常见的UI控件如TableView、ConllectionView等都支持列表的展现形式。系统一般会提供很多的UI控件供开发者使用,如按钮、文本框、进度条、文本绘制、图片绘制等,这些控件通常在App中展现内容及或提供App与用户交互的能力,是离用户最近的一层。