想象一下,一个开发人员团队正在开发适用于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}