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

举报
Tiamo_T 发表于 2021/10/06 11:25:18 2021/10/06
【摘要】 REST 代表具象状态转移。它是一种架构风格,一组用于标准化 Web 的规则,以保持全球 Web 应用程序的一致性。它旨在增强 Web 应用程序的可维护性、可扩展性、可靠性和可移植性。REST 背后的主要思想是资源。您想要在 Web 应用程序中访问的所有内容都是一种资源,无论是您想要下载、更新、删除的媒体还是文档。REST 定义了一种访问、传输和修改这些资源的方法。本篇涵盖以下三个高级概念:...

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.请求动词

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

  1. GET:这将用于从 TGS Web 应用程序的数据存储中获取文章。
  2. POST:这将用于在 TGS Web 应用程序中创建新文章。
  3. PUT:如果 TGS 数据存储中不存在,这将用于更新任何现有文章或创建新文章。
  4. DELETE:这将用于从 TGS 数据存储中删除文章。

3. 请求头

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

4. 请求体

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

5. 响应体

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

6 响应代码

这些编码与响应一起返回,并表示发送到服务器的请求的状态。这些类似于 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/<string: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/<string: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"
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。