RESTful Web API开发的核心任务

通过上节课的学习,我们已经知道了在当下的 Web 开发中 JSON 数据格式已经逐步取代了 XML 用来进行前后端之间的数据交互。但是前端的数据格式可能并不规范,不能直接为后端所用,这个时候就需要我们将数据进行序列化和反序列化,我们先来简单了解下什么是序列化和反序列化:

  • 序列化:按照前端需求,在数据库检索相应数据,转化为前端所需的数据形式(如 JSON),发给前端。

  • 反序列化:将前端发来的数据,按照数据库的要求,转化为数据库所能接受的形式,存入数据库。

而序列化和反序列化是 RESTful API 接口开发时的核心任务,这节课我们来学习下序列化和反序列化的概念。

1. 序列化(Serialization)

百度百科中对于序列化的定义:

序列化(serialization)在计算机科学的资料处理中,是指将数据结构或物件状态转换成可取用格式(例如存成档案,存于缓冲,或经由网络中传送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始物件相同语义的副本。对于许多物件,像是使用大量参照的复杂物件,这种序列化重建的过程并不容易。面向对象中的物件序列化,并不概括之前原始物件所关联的函式。这种过程也称为物件编组(marshalling)。从一系列字节提取数据结构的反向操作,是反序列化(也称为解编组, deserialization, unmarshalling)。

上面的概念有些晦涩,我们可以做如下的类比:

我们将不同数据存储体(如数据库)比作不同的网络游戏,而将数据看成是网络游戏中的虚拟货币。在不同的游戏中,这些虚拟货币是不通用的,不能从一个游戏传到另一个游戏,因为这些货币是不通用的。而如果我们在玩家市场,把手中的虚拟货币换成现实生活中的货币,然后再充入另一个游戏,就能购买想要的装备。将不通用的虚拟货币兑换成通用的真实货币的过程,就可以看成是一次序列化。

简而言之,我们可以将序列化理解为:

将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将 Django 中的模型类对象转换为 JSON 字符串,这个转换过程我们称为序列化。

2. 反序列化(DeSerialization)

反之,将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。

反序列化的过程,我们同样类比上述网络游戏:反序列化就是将现实生活中的货币兑换为游戏中可以使用的游戏币。

3. 案例演示

为了帮助大家理解序列化与反序列化,这里我们一起来完成一个小的案例,代码用 Python 语言编写:

>> import json
# 序列化(将python内部的字典结构转化为JSON字符串)
>> student = {'name': 'Xiao Ming', 'age': 12} # 未序列化前,数据是python字典形式
>> json.dumps(student)
# 输出结果
'{"name": "Xiao Ming", "age": 12}' # 经过序列化,数据已成为 python 字符串形式

# 反序列化(将JSON字符串转化为python内部的字典结构)
>> student_str = '{"name": "Xiao Ming", "age": 12}' # 未返回序列化前,数据类型为python字符串
>> json.loads(student_str)
# 输出结果
{'name': 'Xiao Ming', 'age': 12} # 序列化之后,数据类型为python字典形式

4. 小结

在开发 REST API 接口时,我们需要做的最核心的事情是:

  • 将数据库数据序列化为前端所需要的格式,并返回;
  • 将前端发送的数据反序列化为模型类对象,并保存到数据库中。