想象一下,一個開發人員團隊正在開發適用于iOS和Android的移動應用程序,并且需要一個RESTful Web服務來執行toys的CRUD操作。 我們確定不想使用模擬Web服務,并且不想花費時間來選擇和配置ORM(對象關系映射的簡稱)。 我們希望快速構建一個RESTful Web服務,并盡快準備好開始在移動應用程序中與它進行交互。
我們希望toys能夠存儲在數據庫中,但我們還不準備立即把它用在生產環境中。 因此,我們可以使用最簡單的關系數據庫,這樣我們就不必花太多時間執行復雜的安裝或配置。
Django REST框架(也稱為DRF)將允許我們輕松完成此任務,并開始向我們的RESTful Web服務的第一個版本發出HTTP請求。 在這種情況下,我們將使用一個非常簡單的SQLite數據庫,這是一個新的Django REST框架項目的默認數據庫。
首先,我們必須指定主要資源的要求:一個 ‘toy’。 我們需要toy實體的以下屬性或字段:
- 整數標識符
- 一個名字
- 可選的描述
- 玩具類別描述,例如動作人物,玩偶或玩具
- 發布日期
- 一個bool值,表示玩具是否已經在網上商店的主頁上至少一次
此外,我們希望有一個時間戳,其中包含玩具添加到數據庫表中的日期和時間。
在RESTful Web服務中,每個資源都有自己唯一的URL。 在我們的網絡服務中,每個玩具都有自己唯一的URL。
注:下面所說的http請求方法即 GET,PUT,POST,DELETE等
下表顯示了我們的第一個Web服務版本需要支持的方法,HTTP 請求方法,作用范圍和和含義。 每個方法都由HTTP 請求方法和范圍組成。 所有方法對toy和集合都有明確的含義:
HTTP verb | Scope | Semantics |
---|---|---|
GET | Toy | 請求單個數據 |
GET | Collection of toys | 取回所有存儲在數據庫中的toy數據,并根據名字按照升序排列 |
POST | Collection of toys | 創建一個新的toy |
PUT | Toy | 更新一個已經存在的toy |
DELETE | Toy | 刪除一個toy |
在上表中,GET 出現兩次,但有兩個不同的范圍:toys 和collection of toys。 第一個顯示應用于玩具的GET,即請求單個資源。 第二行顯示應用于玩具集合的GET,即應用于資源集合的請求。
我們希望我們的Web服務能夠區分URL中集合的單個資源。 當我們引用一個集合時,我們將使用斜杠(/)作為URL的最后一個字符,如http:// localhost:8000 / toys /
。 當我們引用單個資源時我們不會使用斜杠(/)作為URL的最后一個字符,如http:// localhost:8000 / toys / 5
。
讓我們考慮一下http:// localhost:8000 / toys /
是玩具集合的URL。 如果我們在前一個URL中添加一個數字,我們會識別一個ID或主鍵等于指定數值的特定玩具。 例如,http:// localhost:8000 / toys / 42
,標識了ID等于42的玩具。
POST
我們必須使用POST方法和http:// localhost:8000 / toys /
request URL編寫和發送HTTP請求,以創建新toy并將其添加到toys集合中。 在此示例中,我們的RESTful Web服務將使用JSON(JavaScript Object Notation的簡稱),因此我們必須提供帶有字段名稱和值的JSON鍵值對來創建新玩具。 作為請求的結果,服務器將驗證字段的提供值,確保它是一個有效的toy,并將其保存在數據庫中。 服務器將在適當的表中插入帶有新玩具的新行,然后將返回201 Created狀態代碼和一個帶有剛剛添加成功的并且序列化為JSON的toy數據,該JSON數據包括由數據庫自動生成并分配ID和toy對象:
POST http:// localhost:8000 / toys /
GET
我們需要使用GET方法和http:// localhost:8000 / toys / {id}
的請求 URL來發送HTTP請求,以檢索ID與{id}中指定數值匹配的玩具。 例如,如果我們使用請求URL http:// localhost:8000 / toys / 25
,服務器將檢索ID為25的玩具。作為請求的結果,服務器將從中檢索具有指定ID的玩具。作為請求的結果,服務器將從數據庫中檢索具有指定ID的玩具,并用Python創建適當的toy對象。如果找到玩具,服務器會將toy對象序列化為JSON,返回200 OK狀態代碼,并返回帶有序列化toy對象的JSON正文。如果沒有玩具與指定的ID匹配,則服務器將僅返回404 Not Found狀態:
GET http:// localhost:8000 / toys / {id}
PUT
我們需要使用PUT方法,來編寫并發送HTTP請求,并請求URLhttp:// localhost:8000 / toys / {id}
,通過檢索ID與{id}中的值匹配的玩具,然后用提供的數據來替換它。此外,我們還需要提供帶有字段名稱和值的JSON鍵值對,來創建并替換現有玩具的新玩具。作為請求的結果,服務器將驗證字段的提供值,確保它是有效玩具,然后用新的數據替換匹配ID的toy。更新操作后,玩具的ID將相同。服務器將更新相應表中的現有行,它將返回200 OK狀態代碼和JSON主體如果我們沒有為新玩具提供所有必要字段,服務器將返回400 Bad Request狀態代碼。如果服務器找不到具有指定ID的玩具,則服務器將僅返回404未找到狀態:
PUT http:// localhost:8000 / toys / {id}
DELETE
我們需要使用DELETE 方法 ,來編寫并發送HTTP請求,并請求URLhttp:// localhost:8000 / toys / {id}
以刪除ID與{id}中指定數字值匹配的玩具。例如,如果我們通過請求URL http:// localhost:8000 / toys / 34
,服務器將刪除ID為34的玩具。作為請求的結果,服務器將從數據庫中檢索具有指定ID的玩具并在Python中創建適當的玩具對象。 如果找到玩具,服務器將請求ORM刪除與此玩具對象關聯的玩具行,并且服務器將返回204 No Content狀態代碼。 如果沒有玩具與指定的ID匹配,則服務器將僅返回404 Not Found狀態:
DELETE http:// localhost:8000 / toys / {id}