带有 Python REST Web 服务示例的 REST API 快速入门指南

网友投稿 550 2022-05-30

REST 代表具象状态转移。

它是一种架构风格,一组用于标准化 Web 的规则,以保持全球 Web 应用程序的一致性。它旨在增强 Web 应用程序的可维护性、可扩展性、可靠性和可移植性。

REST 背后的主要思想是资源。您想要在 Web 应用程序中访问的所有内容都是一种资源,无论是您想要下载、更新、删除的媒体还是文档。REST 定义了一种访问、传输和修改这些资源的方法。

本篇涵盖以下三个高级概念:

REST 基本概念——本节解释了 6 个关键的 REST 架构约束

RESTful 实现的关键元素 – 本节介绍 RESTful 实现的 6 个不同元素

创建 Python REST Web 服务 – 本节提供有关在 Python 中创建基本 REST Web 服务的分步说明

REST 基本概念

正如 REST 的发明者 Roy Fielding 在他的研究论文中所讨论的,以下是一些架构约束,这些约束将使任何 Web 服务成为 RESTful 。

1. 客户端服务器

这个约束规定客户端和服务器的实现应该是独立的,两者都应该能够相互独立地扩展和发展。客户端应该只知道服务器上资源的 URI,别无其他。服务器应根据收到的客户端请求返回适当的响应。

2. 无国籍

客户端-服务器交互本质上应该是无状态的。服务器不应存储状态数据,响应应完全取决于客户端请求中存在的信息。然而,客户端可以存储保持会话状态数据。这增强了交互的可扩展性和可靠性。

3.缓存

缓存的出现是为了解决 REST 的无状态性问题。这个缓存是在客户端实现的,并且缓存了可缓存的响应。如果将来客户端请求一些它已经发送请求的数据,而不是再次向服务器发送请求,缓存可以重用缓存的响应。

4. 统一接口

这表明组件之间需要统一接口,服务器中的每个资源都应该只有一个逻辑 URI,并且应该公开访问该资源的方法,并且应该遵循标准的命名约定。应使用通用方法访问所有资源。这增强了 Web 界面的可见性。

5. 分层系统

分层系统方法指出Web 服务应该遵循分层方法,即我们应该将我们的Web 服务划分到不同的层中,这些层不能超越它们的直接层,例如身份验证层、数据访问层、消息处理器层。这降低了系统复杂性并提高了可扩展性。

6. 按需编码

这表明有时客户端可以下载可执行代码而不是静态数据,即 JSON/XML。它增加了系统的可扩展性。

RESTFul 实现的关键要素

1.资源

REST 背后的基本思想是资源,存储在 REST Web 服务数据存储中的所有内容都是资源。在当前上下文中,存储在 TGS 数据存储中的文章是一种资源。

2.请求动词

这些定义了访问资源的方式,客户端想要用它们做什么是用请求动词指定的,这些是基本方法

GET:这将用于从 TGS Web 应用程序的数据存储中获取文章。

POST:这将用于在 TGS Web 应用程序中创建新文章。

PUT:如果 TGS 数据存储中不存在,这将用于更新任何现有文章或创建新文章。

DELETE:这将用于从 TGS 数据存储中删除文章。

3. 请求头

发送到服务器的额外请求以指定响应类型、编码、内容类型和自定义参数。等等。

4. 请求体

尝试创建资源时,资源数据在放置请求的正文中发送。

5. 响应体

Web 服务器在响应正文中返回数据。假设客户端发送 GET 来查询 python 类别的数据,Web 服务器将在响应正文中返回数据。

6 响应代码

带有 Python REST Web 服务示例的 REST API 快速入门指南

这些编码与响应一起返回,并表示发送到服务器的请求的状态。这些类似于 HTTP 响应代码。例如,200 OK 表示请求成功,404 NOT FOUND 表示在服务器上找不到资源。

创建 Python REST Web 服务

让我们使用 python 中的烧瓶创建一个简单的 REST Web 服务,我们可以使用 Postman 工具或 Curl 命令行实用程序来使用这个 Web 服务。

我们在此服务中的资源将是文章,它将存储在 TGS 上发布的所有文章,格式如下

类别

观看次数

标题

我们将公开 REST 端点以添加、修改、删除和更新文章。基于 REST 的 CRUD 功能。

让我们一步一步开始:

1. 导入 Flask 模块

首先,在代码中导入flask 模块并将我们的Web 服务命名为如下所示。

from flask import Flask from flask_restful import Resource, reqparse , api TGS = Flask(__name__) api = Api(TGS)

2. 创建资源文章

接下来,创建资源文章,这将是一个简单的文章列表,我们也可以使用数据库来存储资源。

articles = [ { "category": "python", "views": 100, "title": "Dictionary" }, { "category": "java", "views": 200, "title": "java10" }, { "category": "elastic", "views": 300, "title": "elasticsearch" } ]

3. 创建 API 端点和 REST 方法

接下来,我们需要创建 api 端点和所需的 REST 方法,如下所示。

GET 方法将在文章列表中搜索请求的类别,如果找到则返回数据以及响应代码 200 OK。否则 404 未找到

class Article(Resource): def get(self, category):

POST 方法将在文章列表中插入新的文章数据,并返回插入的数据并创建响应代码 201。如果记录已存在,则返回错误代码 400 错误请求。

def post(self,category):

PUT 方法将覆盖记录并返回数据以及响应代码 200 OK。如果记录不存在,它会创建数据并返回它并创建响应代码 201。

def put(self,category):

DELETE 方法删除记录(如果存在)并返回响应代码为 200 OK 的数据。否则 404 未找到。

def delete(self,category):

4.注册资源并分配URI

我们的最后一步是将我们的资源注册到 REST API 并为其分配一个 URI。

api.add_resource(Article, "/category/") TGS.run(debug=True,port=8080)

完整的 REST 示例程序

创建rest.py文件:

vi rest.py

将以下内容复制/粘贴到 rest.py 文件中:

from flask import Flask from flask_restful import Resource, reqparse ,Api TGS = Flask(__name__) api = Api(TGS) articles = [ { "category": "python", "views": 100, "title": "Dictionary" }, { "category": "java", "views": 200, "title": "java10" }, { "category": "elastic", "views": 300, "title": "elasticsearch" } ] class Article(Resource): def get(self, category): for article in articles: if(category == article["category"]): return article, 200 return "category not found", 404 def post(self, category): parser = reqparse.RequestParser() parser.add_argument("views") parser.add_argument("title") args = parser.parse_args() for article in articles: if(category == article["category"]): return "category {} already exists".format(category), 400 article = { "category": category, "views": args["views"], "title": args["title"] } articles.append(article) return article, 201 def put(self, category): parser = reqparse.RequestParser() parser.add_argument("views") parser.add_argument("title") args = parser.parse_args() for article in articles: if(category == article["category"]): article["views"] = args["views"] article["title"] = args["title"] return article, 200 article = { "category": category, "views": args["views"], "title": args["title"] } articles.append(article) return article, 201 def delete(self, category): global articles articles = [article for article in articles if article["category"] != category] return "{} is deleted.".format(category), 200 api.add_resource(Article, "/category/") TGS.run(debug=True,port=8080)

测试 REST 程序

让我们使用 Curl 实用程序对此进行测试,我们可以使用 postman 实用程序,它也是一个很棒的工具。

启动 python glass REST 服务器

$ python rest.py * Serving Flask app "rest" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on * Restarting with stat * Debugger is active! * Debugger PIN: 145-292-899 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)

1.从TGS的python类中获取文章

$ curl -XGET http://127.0.0.1:8080/category/python % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 74 100 74 0 0 74000 0 --:--:-- --:--:-- --:--:-- 74000{ "category": "python", "views": 100, "title": "Dictionary" }

2. 向TGS发布新分类文章

$ curl -XPOST http://127.0.0.1:8080/category/c++ -H "Content-Type: application/json" --data '{ "category": "c++", "views": "199", "title": "tuples" }' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 125 100 69 100 56 1468 1191 --:--:-- --:--:-- --:--:-- 2659{ "category": "c++", "views": "199", "title": "tuples"

3. PUT一篇,修改C++类文章

$ curl -XPUT http://127.0.0.1:8080/category/c++ -H "Content-Type: application/json" --data '{ "category": "c++", "views": "201", "title": "tuples" }' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 125 100 69 100 56 69000 56000 --:--:-- --:--:-- --:--:-- 122k{ "category": "c++", "views": "201", "title": "tuples" }

$ curl -XGET http://127.0.0.1:8080/category/c++ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 69 100 69 0 0 4312 0 --:--:-- --:--:-- --:--:-- 4312{ "category": "c++", "views": "201", "title": "tuples" }

如您所见,C++ 类别记录已更新。

4. 从 C++ 类别中删除一篇文章

$ curl -XDELETE http://127.0.0.1:8080/category/c++ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 18 100 18 0 0 18000 0 --:--:-- --:--:-- --:--:-- 18000"c++ is deleted." $ curl -XGET http://127.0.0.1:8080/category/c++ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 21 100 21 0 0 21000 0 --:--:-- --:--:-- --:--:-- 21000"category not found"

API Python web前端

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:中科大研二学生,深度学习放弃,浅度学习入门!?
下一篇:Node.js学习笔记(十六、Express 框架)
相关文章