挑战30天学完Python:Day29 API开发

news2024/11/17 9:51:22

🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点知识,但又没有系统学习的使用者。总之如果你想提升自己的Python技能,欢迎加入《挑战30天学完Python》

  • Day 29
  • API基础
    • HTTP
      • 请求头行
      • 响应头行
      • 头字段
      • 消息体
      • 请求方法
    • 构建API
      • 使用GET检索数据
      • 通过id获取学生详细
      • 使用POST创建数据
      • 使用PUT更新数据
      • 使用DELETE删除数据
  • 💻 第29天练习

📘 Day 29

API基础

英文全称 Application Programming Interface。在这个时代,大多数应用程序都需要使用 API(应用程序编程接口)来与其他应用程序或服务进行通信。

API是一种允许应用程序之间交互的方式。在互联网上,我们经常使用API从其他应用程序或服务中获取数据或执行某些操作。API允许我们从远程服务器获取数据,而不需要自己存储或管理数据。

例如,您可能会使用天气应用程序获取当地天气预报。该应用程序不会自己生成天气数据,而是使用第三方服务的API获取数据。这个API可能允许应用程序查询天气预报,然后将数据返回给应用程序。

API通常使用REST(Representational State Transfer)协议进行通信,该协议使用HTTP请求和响应来获取和返回数据。我们可以使用Python的requests库来发送HTTP请求,然后使用json模块解析响应。

在本小节中,我们将介绍一个RESTful API,它使用HTTP请求方法来GET、PUT、POST和DELETE数据。

HTTP

HTTP(Hypertext Transfer Protocol)超文本传输协,是客户端和服务器之间已经确立的通信协议。在这种情况下,客户端是浏览器,而服务器是访问数据的地方。HTTP是一种网络协议,用于传输资源,这些资源可以是世界范围内网站上的文件,无论它们是HTML文件、图像文件、查询结果、脚本或其他文件类型。

浏览器是HTTP客户端,因为它向HTTP服务器(Web服务器)发送请求,服务器然后将响应发送回客户端。

HTTP采用客户端-服务器模型。HTTP客户端打开连接并向HTTP服务器发送请求消息,HTTP服务器返回请求的资源响应消息。当请求-响应周期完成时,服务器关闭连接。

在这里插入图片描述

请求和响应消息的格式类似。这两种信息都有

  • 一个初始行,
  • 零个或多个头部行,
  • 一个空行(即一个独立的CRLF),
  • 一个可选的消息体(例如一个文件,或查询数据,或查询输出)。

让我们启动Day26时候我们写的一个web程序并请求其中一个接口,打开浏览器开发者工具查看下网络栏里接口信息。

在这里插入图片描述

注意:如果浏览器请求的信息和上方不太一样,可以看看是否有箭头处切换“源码(view source)”文本按钮,如果进行切换。否则默认优化过的显示。

请求头行

初始请求行与响应行不同。

请求行有三部分,用空格分隔:

  • 方法名 (GET, POST, HEAD)
  • 被请求资源的路径
  • 使用的HTTP版本 eg: GET / HTTP/1.1

方法中 GET是最常用的帮助获取或读取资源的, POST是创建资源的常用请求方法。

响应头行

初始响应行返回部分,也有由空格分隔的三部分:

  • HTTP 版本
  • 请求响应状态码,以及描述状态码的原因。状态行示例如下:
  HTTP/1.0 200 OK
  或
  HTTP/1.0 404 Not Found

最常见的状态码有:

  • 200 OK:请求成功,结果资源(例如文件或脚本输出)在消息体中返回。
  • 500 Server Error:服务器错误

HTTP状态码的完整列表可以在这里(https://httpstatuses.com/)找到。

头字段

正如您在上面的请求返回截图中所看到的,标题行提供了关于请求或响应或者关于消息体中发送的对象的更多信息。

# 请求信息
GET /about HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: keep-alive
Host: 127.0.0.1:5000
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62
sec-ch-ua: "Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

# 响应信息
HTTP/1.1 200 OK
Server: Werkzeug/2.2.3 Python/3.8.10
Date: Wed, 05 Apr 2023 04:58:31 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1316
Connection: close
消息体

HTTP消息可以在头部行之后包含一段数据主体。在响应中,这是请求的资源返回给客户端的位置(消息主体最常见的用法),或者在出现错误时提供解释性的文本。在请求中,这是用户输入的数据或上传的文件发送到服务器的位置。

如果HTTP消息包含消息主体,则通常会有描述消息主体的头部行。特别是:

  • Content-Type:头部行给出了消息主体中数据的MIME类型(text/html,application/json,text/plain,text/css,image/gif)。
  • Content-Length:头部行给出了消息主体中字节数的数量。
请求方法

GET、POST、PUT 和 DELETE 是HTTP请求方法,我们可以用它们来实现API或CRUD操作应用程序。

  1. GET:GET方法用于通过给定的URI从给定的服务器检索和获取信息。使用GET的请求应该只检索数据,并且不应对数据产生其他影响。
  2. POST:POST请求用于创建数据并将数据发送到服务器,例如,使用HTML表单创建新的帖子、文件上传等。
  3. PUT:将上传的内容替换目标资源的所有当前表示,并使用它来修改或更新数据。
  4. DELETE:删除数据。

构建API

在这一部分,我们将介绍一个使用HTTP请求方法来获取(GET)、更新(PUT)、创建(POST)和删除(DELETE)数据的RESTful API。

RESTful API是一个应用程序接口(API),它使用HTTP请求来获取、更新、创建和删除数据。在之前的章节中,我们学习了Python、Flask和MongoDB。我们将利用所学知识来开发一个使用Python Flask和MongoDB的RESTful API。每个具有CRUD(创建、读取、更新、删除)操作的应用程序都有一个API,用于从数据库中创建数据、获取数据、更新数据或删除数据。

浏览器只能处理GET请求。因此,我们需要一个工具来处理所有请求方法(GET、POST、PUT、DELETE)。

这里先提一款接口流程测试工具叫 Postman,后边的内容我们将使用它进行演示。如果你的电脑上没有,请先到 https://www.getpostman.com 官方下载安装。

在这里插入图片描述

接下来,让我们综合之前所学的内容,开发一个关于学生信息的管理服务API。此信息存储在mongodb中包含:姓名, 国家, 城市, 生日, 技能 和 简历.

要实现这个API,我们将使用:

  • Postman
  • Python
  • Flask
  • MongoDB

使用GET检索数据

在这一步中,让我们使用虚拟数据并将其作为JSON返回。为了将其作为JSON返回,我们将使用json模块和Response模块。

from flask import Flask, Response
import os
import json

app = Flask(__name__)

@app.route('/api/v1.0/students', methods = ['GET'])
def students ():
    student_list = [
        {
            'name':'MegaQi',
            'country':'China',
            'city':'ShangHai',
            'skills':['JAVA', 'VUE','Python']
        },
        {
            'name':'David',
            'country':'UK',
            'city':'London',
            'skills':['Python','MongoDB']
        },
        {
            'name':'John',
            'country':'Sweden',
            'city':'Stockholm',
            'skills':['Java','C#']
        }
    ]
    return Response(json.dumps(student_list), mimetype='application/json')

if __name__ == '__main__':
    port = int(os.environ.get("PORT", 5000))
    app.run(debug=True, host='0.0.0.0', port=port)

当你通过浏览器请求此接口 http://localhost:5000/api/v1.0/students 后你将得到如下结果:

在这里插入图片描述

你也可通过pastman工具进行请求 http://localhost:5000/api/v1.0/students 它将得到同样的返回结果:

在这里插入图片描述

让我们进一步优化程序,将Mock的数据改为MongoDB获取。

from flask import Flask, Response
from bson import json_util
import pymongo
import os
import json

app = Flask(__name__)

MONGODB_URI = "mongodb://localhost:27017/"
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python']

@app.route('/api/v1.0/students', methods = ['GET'])
def students ():
    student_list = db.students.find() # 查询所有学生
    # 请注意此处使用一个json_util转换而非json,否则mongo查询所有字段所带_id会报错
    # return Response(json.dumps(student_list), mimetype='application/json')
    return Response(json_util.dumps(student_list), mimetype='application/json') 

if __name__ == '__main__':
    port = int(os.environ.get("PORT", 5000))
    app.run(debug=True, host='0.0.0.0', port=port)

如果之前的练习中你已经将学生数据删除了,请提前重新添加一些。再次通过postman请求数据你将得到从数据库查询的学生列表。

[
    {
        "_id": {
            "$oid": "642d17760e244123faad21ee"
        },
        "name": "David",
        "country": "UK",
        "city": "London",
        "age": 34
    },
    {
        "_id": {
            "$oid": "642d17760e244123faad21ef"
        },
        "name": "John",
        "country": "Sweden",
        "city": "Stockholm",
        "age": 28
    },
    {
        "_id": {
            "$oid": "642d17760e244123faad21f0"
        },
        "name": "MegaQi",
        "country": "China",
        "city": "ShangHai",
        "age": 25
    },
    {
        "_id": {
            "$oid": "642d17760e244123faad21f1"
        },
        "name": "Sami",
        "country": "Finland",
        "city": "Helsinki",
        "age": 25
    },
    {
        "_id": {
            "$oid": "642d17760e244123faad21f2"
        },
        "name": "Tom",
        "country": "Kroen",
        "city": "Seoul",
        "age": 26
    }
]

通过id获取学生详细

我们可以使用id访问单个文档,即写一个根据条件获取一名学生的详细信息。
http://localhost:5000/api/v1.0/students/<_id>

from flask import Flask, Response
from bson import json_util, ObjectId
import pymongo
import os
import json

app = Flask(__name__)

MONGODB_URI = "mongodb://localhost:27017/"
client = pymongo.MongoClient(MONGODB_URI)
db = client['thirty_days_of_python']

@app.route('/api/v1.0/students', methods = ['GET'])
def students ():
    student_list = db.students.find() # 查询所有学生
    # 请注意此处使用一个json_util转换而非json,否则mongo查询所有字段所带_id会报错
    # return Response(json.dumps(student_list), mimetype='application/json')
    return Response(json_util.dumps(student_list), mimetype='application/json') 

@app.route('/api/v1.0/students/<id>', methods = ['GET'])
def single_student (id):
    student = db.students.find({'_id':ObjectId(id)})
    return Response(json_util.dumps(student), mimetype='application/json')

if __name__ == '__main__':
    port = int(os.environ.get("PORT", 5000))
    app.run(debug=True, host='0.0.0.0', port=port)

请求新增根据ID的查询结果如下(注意ID信息根据你自己的数据进行替换):

在这里插入图片描述

使用POST创建数据

我们使用POST请求方法创建学生数据

@app.route('/api/v1.0/students', methods = ['POST'])
def create_student ():
    name = request.form['name']
    country = request.form['country']
    city = request.form['city']
    skills = request.form['skills'].split(', ')
    bio = request.form['bio']
    birthyear = request.form['birthyear']
    created_at = datetime.now()
    student = {
        'name': name,
        'country': country,
        'city': city,
        'birthyear': birthyear,
        'skills': skills,
        'bio': bio,
        'created_at': created_at

    }
    db.students.insert_one(student)
    return "create successful"

请求测试,为了更准确验证,一般还要在数据库确认是否正确落库。

在这里插入图片描述

使用PUT更新数据

@app.route('/api/v1.0/students/<id>', methods = ['PUT'])
def update_student (id):
    query = {"_id":ObjectId(id)}
    name = request.form['name']
    country = request.form['country']
    city = request.form['city']
    skills = request.form['skills'].split(', ')
    bio = request.form['bio']
    birthyear = request.form['birthyear']
    created_at = datetime.now()
    student ={
        '$set': {
            'name': name,
            'country': country,
            'city': city,
            'birthyear': birthyear,
            'skills': skills,
            'bio': bio,
            'created_at': created_at
        }
    }
    db.students.update_one(query, student)
    return "update successful"

在代码编写上述更新接口,并重启程序进行请求测试

在这里插入图片描述

最后在数据中查看下刚才增改两个操作是否正确

在这里插入图片描述

使用DELETE删除数据

@app.route('/api/v1.0/students/<id>', methods = ['DELETE'])
def delete_student (id):
    db.students.delete_one({"_id":ObjectId(id)})
    return "delete successful"

在本次数据演示中我们删除一条名叫 David 学生数据。

在这里插入图片描述

以上第二小部分内容中,我们实现了一个标准 RESTful 风格的API程序。在平常工作中可能大家见到的接口基本都是GET/POST两种,研发通过接口名区分其他操作,而不是用这种请求方法。

💻 第29天练习

  1. 阅读和了解 HTTP / RESTful API 基础知识的内容
  2. 参照学生学生管理操作,请写一些员工管理接口。

🎉 CONGRATULATIONS ! 🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1479472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Node.js中使用定时器

在Node.js中使用定时器是一项常见且重要的任务&#xff0c;特别是在需要执行定时任务或者轮询操作的情况下。Node.js提供了多种方式来实现定时器功能&#xff0c;包括setTimeout、setInterval和setImmediate等方法。本篇博客将介绍如何在Node.js中使用这些定时器&#xff0c;并…

【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录 文章目录 00. 目录01. WDG概述02. 独立看门狗相关API2.1 IWDG_WriteAccessCmd2.2 IWDG_SetPrescaler2.3 IWDG_SetReload2.4 IWDG_ReloadCounter2.5 IWDG_Enable2.6 IWDG_GetFlagStatus2.7 RCC_GetFlagStatus 03. 独立看门狗接线图04. 独立看门狗程序示例105. 独立看门…

mysql缓存机制面试题,学海无涯

二、我们先来看看这份笔记到底有什么 1、先把kubernetes跑起来&#xff08;先跑起来创建kubernetes集群部署应用访问应用Scale应用滚动更新&#xff09; 2、重要概念 3、部署kubernetes Cluster&#xff08;安装docker安装 kubelet.kubeadm和 kubectll用kubeadm 创建cluster&a…

【力扣hot100】刷题笔记Day18

前言 晚上巩固一下今天的回溯题&#xff0c;基础不牢地动山摇&#xff0c;po一张代码随想录总结的 组合补充 77. 组合 - 力扣&#xff08;LeetCode&#xff09; class Solution:def combine(self, n: int, k: int) -> List[List[int]]:path []res []def backtrack(star…

航拍无人机技术,航拍无人机方案详解,无人机摄影技术

航拍无人机是利用遥控技术和摄像设备&#xff0c;在空中进行拍摄和录像的无人机。这种无人机通常具有高清摄像设备、图像传输设备、GPS定位系统、智能控制系统等&#xff0c;可以轻松实现各种拍摄角度和高度&#xff0c;广泛应用于影视制作、旅游景区航拍、城市规划、环保监测等…

CryoEM - 使用 cryoSPARC 基于单颗粒图像从头重构蛋白质三维结构

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 基于冷冻电镜单颗粒图像重构蛋白质三维结构,利用冷冻电镜技术测定生物大分子结构的方法。原理是从冷冻电镜获得大量同一种蛋白质分子的二维投影图…

计算机组成原理-第一/二章 概述和数据的表示和运算【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下计算机组成原理中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 参考资料是王道的计算机组成原理和西电的计算机组成原理。 计算机组成原理系列文章传送门&#xff1a; 第一/二章 概述和数据…

适用Java SpringBoot项目的分布式锁

在分布式系统中&#xff0c;常用到分布式锁&#xff0c;它有多中实现方式&#xff0c;如&#xff1a;基于redis&#xff0c;database&#xff0c;zookeeper等。Spring integration组件有这三种服务的分布式锁实现&#xff0c;今天来看看用的比较多的redis和database实现方式。 …

ANTLR4规则解析生成器(三):遍历语法分析树

文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割&#xff0c;提取出其中的单词。 在antlr4中&#xff0c;词法规则的名称的首字母需要大写&#xff0c;右侧必须是终结符&#xff0c;通常将词法…

Tomcat布署及优化

1.Tomcat简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;Tomcat 属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。一般来说&…

数据结构:队列 || oj(l两个队列实现栈)

[TOC](数据结构&#xff1a;队列 || oj(l两个队列实现栈)) 一、队列的概念 1.什么是队列&#xff1f; //先说一下&#xff0c;队列跟栈一样都是很重要的数据结构&#xff0c;重要的不是说这个数据结构怎么实现&#xff0c;重要的是结构的优势&#xff01; //栈&#xff1a;是…

上海亚商投顾:沪指终结月线6连阴 北向资金净买入超160亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日低开高走&#xff0c;沪指重新站上3000点&#xff0c;深成指、创业板指大涨超3%。半导体产业链全…

协议和序列化反序列化

“协议”和序列化反序列化 “协议”的概念&#xff1a; “协议”本身是一种约定俗成的东西&#xff0c;由通讯双方必须共同遵从的一组约定&#xff0c;因此我们一定要将这种约定用计算机语言表达出来&#xff0c;此时双方计算机才能识别约定的相关内容 我们把这个规矩叫做“…

仿真科普|CAE技术赋能无人机 低空经济蓄势起飞

喝一杯无人机送来的现磨热咖啡&#xff1b;在拥堵的早高峰打个“空中的士”上班&#xff1b;乘坐水陆两栖飞机来一场“陆海空”立体式观光……曾经只出现在科幻片里的5D城市魔幻场景&#xff0c;正逐渐走进现实。而推动上述场景实现的&#xff0c;就是近年来越来越热的“低空经…

包管理工具之npm也慌了?

起因 因为npm的种种问题,我很早就换成了pnpm和yarn(但是其实npm也在使用),已经很久没有关注npm的功能更新了。最近无意间进入Node18版本的安装目录,发现其除了常规的node,npm等默认安装了一个新的包corepack,这个就是今天我要分享的东西了。 注: 我因为18版本的node上…

Docker技术概论(3):Docker 中的基本概念

Docker技术概论&#xff08;3&#xff09; Docker 中的基本概念 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

MySQL 用户账号迁移

文章目录 前言1. 工具安装1.1 下载安装包1.2 编译安装 2. 用户迁移后记 前言 有一个典型的使用场景&#xff0c;就是 RDS 下云大多数都是通过 DTS 进行数据传输的&#xff0c;用户是不会同步到自建数据库的。需要运维人员在自建数据库重新创建用户&#xff0c;如果用户数量很多…

kyuubi整合spark on yarn

目录 概述实践下载配置启动 结束 概述 目标: 1.实现kyuubi spark on yarn2.实现 kyuubi spark on yarn 资源的动态分配 注意&#xff1a;版本 kyuubi 1.8.0 、 spark 3.4.2 、hadoop 3.3.6 前置准备请看如下文章 文章链接hadoop一主三从安装链接spark on yarn链接 实践 …

【音视频处理】使用ffmpeg实现多个视频合成一个视频(按宫格视图)

先上结果 环境 硬件&#xff1a;通用PC 系统&#xff1a;Windows 测试有效 软件&#xff1a;ffmpeg 解决 0、命令 ffmpeg.exe -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v]scaleiw/2:ih/2,pad2*iw:2*ih[a]; [1:v]scaleiw/2:ih/2…

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…