明確REST接口開發的核心,初步理解序列化

分析一下上節的案例,可以發現,在開發REST API接口時,視圖中做的最主要有三件事:

  • 將請求的數據(如JSON格式)轉換爲模型類對象

  • 操作數據庫

  • 將模型類對象轉換爲響應的數據(如JSON格式)

序列化Serialization

維基百科中對於序列化的定義:

序列化(serialization)在計算機科學的資料處理中,是指將數據結構或物件狀態轉換成可取用格式(例如存成檔案,存於緩衝,或經由網絡中傳送),以留待後續在相同或另一臺計算機環境中,能恢復原先狀態的過程。依照序列化格式重新獲取字節的結果時,可以利用它來產生與原始物件相同語義的副本。對於許多物件,像是使用大量參照的複雜物件,這種序列化重建的過程並不容易。面向對象中的物件序列化,並不概括之前原始物件所關聯的函式。這種過程也稱爲物件編組(marshalling)。從一系列字節提取數據結構的反向操作,是反序列化(也稱爲解編組, deserialization, unmarshalling)。

序列化在計算機科學中通常有以下定義:

​ 在數據儲存與傳送的部分是指將一個對象)存儲至一個儲存媒介,例如檔案或是記億體緩衝等,或者透過網絡傳送資料時進行編碼的過程,可以是字節或是XML等格式。而字節的或XML編碼格式可以還原完全相等的對象)。這程序被應用在不同應用程序之間傳送對象),以及服務器將對象)儲存到檔案或數據庫。相反的過程又稱爲反序列化。

簡而言之,我們可以將序列化理解爲:

將程序中的一個數據結構類型轉換爲其他格式(字典、JSON、XML等),例如將Django中的模型類對象裝換爲JSON字符串,這個轉換過程我們稱爲序列化。

  • 如:
books = BookInfo.objects.all()
# [Bookinfo,BookInfo,BOokinfo]

#json: [{"id":1,"name":"abc"},{"id":1,"name":"abc"}]
#將對象轉換爲JSON數據
list = []

for book in books:
    list.append({
        'id':book.id,
        'name':book.name,
        'pub_date':book.pub_date
    })


#返回json數據
return JsonResponse(list,safe=False)

反之,將其他格式(字典、JSON、XML等)轉換爲程序中的數據,例如將JSON字符串轉換爲Django中的模型類對象,這個過程我們稱爲反序列化。

 #獲取post 的數據
json_bytes = request.body
json_str = json_bytes.decode()

json_dict = json.loads(json_str)
#將POST的數據保存到庫裏
book = BookInfo.objects.create(
    name=json_dict.get('name'),
    pub_date = json_dict.get('pub_date')
)

我們可以看到,在開發REST API時,視圖中要頻繁的進行序列化與反序列化的編寫。

總結

在開發REST API接口時,我們在視圖中需要做的最核心的事是:

  • 將數據庫數據序列化爲前端所需要的格式,並返回;

  • 將前端發送的數據反序列化爲模型類對象,並保存到數據庫中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章