当前位置: 首页 > news >正文

Python Web 开发:FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计

Python Web 开发:FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计

目录

  1. 🚀 HTTP 协议概述
  2. 🌐 HTTP 请求与响应的工作原理
  3. 🛠️ RESTful API 设计理念
  4. 🗂️ JSON 格式数据的传输与解析

1. 🚀 HTTP 协议概述

HTTP(HyperText Transfer Protocol)是现代互联网应用的基础协议,它定义了浏览器与服务器之间进行通信的规则。通过 HTTP 协议,客户端能够向服务器发送请求,服务器则根据请求内容返回响应数据。HTTP 协议的工作模型是请求-响应模式,客户端发出请求,服务器返回响应。

请求方法(Request Methods)

在 HTTP 协议中,请求方法决定了客户端希望对服务器上的资源执行何种操作。常见的请求方法包括:

  • GET:用于请求获取资源。GET 请求只用于获取数据,不会对服务器上的数据造成任何修改。

    @app.get("/items/{item_id}")
    def read_item(item_id: int):return {"item_id": item_id}
    
  • POST:用于向服务器提交数据,通常用于创建资源。POST 请求会将数据发送到服务器,并让服务器根据这些数据进行处理。

    @app.post("/items/")
    def create_item(item: Item):return {"name": item.name, "price": item.price}
    
  • PUT:用于更新资源。当客户端需要更新某个资源时,使用 PUT 请求来提交新数据。与 POST 请求不同,PUT 请求通常是幂等的,即多次提交相同数据的结果是一样的。

    @app.put("/items/{item_id}")
    def update_item(item_id: int, item: Item):return {"item_id": item_id, "name": item.name, "price": item.price}
    
  • DELETE:用于删除资源。DELETE 请求通常是幂等的,即删除相同资源多次,结果不会发生变化。

    @app.delete("/items/{item_id}")
    def delete_item(item_id: int):return {"message": f"Item {item_id} deleted"}
    

HTTP 状态码(Status Codes)

HTTP 状态码是服务器响应的核心部分,它指示了请求处理的结果。常见的状态码包括:

  • 2xx:成功类

    • 200 OK:请求成功,服务器返回所请求的资源或确认操作已完成。
    • 201 Created:请求成功且服务器创建了新的资源。
  • 3xx:重定向类

    • 301 Moved Permanently:请求的资源已永久迁移到新位置。
    • 302 Found:请求的资源暂时位于不同的位置。
  • 4xx:客户端错误类

    • 400 Bad Request:请求格式有误或缺少必要的参数。
    • 404 Not Found:请求的资源不存在。
  • 5xx:服务器错误类

    • 500 Internal Server Error:服务器发生了未预料的错误,导致请求无法完成。
    • 503 Service Unavailable:服务器暂时不可用,通常是由于服务器超载或正在进行维护。

在 FastAPI 中,你可以自定义 HTTP 状态码:

from fastapi import HTTPException@app.get("/items/{item_id}")
def read_item(item_id: int):if item_id == 42:raise HTTPException(status_code=404, detail="Item not found")return {"item_id": item_id}

HTTP 头部(Headers)

HTTP 请求和响应包含了许多有用的头部信息,如请求的内容类型、响应的格式、缓存策略等。常见的头部包括:

  • Content-Type:指定请求或响应的内容类型。例如,application/json 表示发送的内容是 JSON 格式。
  • Authorization:用于身份验证,常见的如 Bearer Token。
  • User-Agent:指定发起请求的客户端软件(如浏览器或应用)。

在 FastAPI 中,头部可以通过参数注入:

from fastapi import Header@app.get("/header/")
def read_header(user_agent: str = Header(...)):return {"User-Agent": user_agent}

2. 🌐 HTTP 请求与响应的工作原理

HTTP 协议的工作原理基于客户端和服务器之间的请求-响应模型。当客户端向服务器发出请求时,服务器解析请求并返回响应。整个过程分为以下几个步骤:

客户端发起请求

客户端发起 HTTP 请求时,包含以下主要信息:

  • 请求行:包括 HTTP 方法(如 GET、POST)、请求的资源路径和协议版本。例如:GET /items/123 HTTP/1.1
  • 请求头:包含请求的元数据,如 Content-TypeAuthorization 等。
  • 请求体(可选):在 POST、PUT 等方法中,请求体包含了客户端发送给服务器的数据,如 JSON 格式的对象。

在 FastAPI 中,HTTP 请求通常通过 HTTP 方法装饰器定义,例如 @app.get("/path")

服务器处理请求

服务器接收到 HTTP 请求后,会根据请求的 URL 路径、方法及参数进行处理。FastAPI 会根据请求的 URL 路径和 HTTP 方法匹配相应的视图函数。当请求包含参数时,FastAPI 会自动将这些参数提取并传递给函数。例如:

@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}

此时,item_id 就是从 URL 路径中提取的参数。

服务器返回响应

服务器根据处理结果构建一个 HTTP 响应,包含响应行、响应头和响应体。响应体通常是请求数据的结果,格式可能是 JSON、HTML、纯文本等。

在 FastAPI 中,响应数据通常是 JSON 格式:

from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}

当客户端接收到响应时,它将解析响应头和响应体,并根据需要进行处理。


3. 🛠️ RESTful API 设计理念

REST(Representational State Transfer)是一种基于 HTTP 协议的架构风格,用于设计可扩展和可维护的 API。RESTful API 是遵循 REST 架构风格设计的 API,它利用 HTTP 方法来定义操作,并通过 URL 进行资源标识。

资源的定义

在 RESTful API 中,一切内容都被视为资源。资源可以是数据实体,如用户、商品、订单等,也可以是服务或操作。每个资源都应该具有唯一的标识符,通常是 URL 路径。

例如,在一个电商平台中,可以定义以下资源:

  • 用户资源/users/{user_id}
  • 商品资源/products/{product_id}

资源的操作

RESTful API 通过 HTTP 方法对资源进行操作。常见的操作包括:

  • GET:用于查询资源。通过 GET 请求可以获取某个资源的详细信息,或者获取资源的列表。
  • POST:用于创建资源。通过 POST 请求,可以将新资源提交到服务器,并创建新的数据实体。
  • PUT:用于更新资源。通过 PUT 请求,可以修改现有资源的数据。
  • DELETE:用于删除资源。通过 DELETE 请求,可以删除某个资源。

RESTful URL 设计原则

RESTful API 的 URL 设计应该遵循以下原则:

  • 使用名词表示资源,而不是动词。比如,/items 表示所有的商品资源,而不是 /getItems
  • 使用层级结构来表示资源之间的关系。例如,/users/{user_id}/orders 表示某个用户的订单。
@app.get("/users/{user_id}/orders")
def get_orders(user_id: int):return {"user_id": user_id, "orders": orders}

4. 🗂️ JSON 格式数据的传输与解析

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。它在 Web 开发中广泛应用,尤其是在客户端与服务器之间的数据传输中。

JSON 数据格式

JSON 数据格式由键值对组成,键是字符串,值可以是字符串、数字、布尔值、数组、对象或 null。例如:

{"name": "John Doe","age": 30,"is_student": false,"courses": ["Math", "Science"]
}

在 FastAPI 中,客户端和服务器通过 JSON 格式进行数据交互。FastAPI 会自动处理 JSON 的解析和生成,客户端只需要发送符合 JSON 格式的数据即可。

FastAPI 中的 JSON 解析

FastAPI 使用 Pydantic 模型来验证和解析 JSON 数据。在请求

体中,FastAPI 会自动将 JSON 数据转换为 Python 对象,并根据定义的 Pydantic 模型进行验证。例如:

from pydantic import BaseModelclass Item(BaseModel):name: strprice: float@app.post("/items/")
def create_item(item: Item):return {"name": item.name, "price": item.price}

在客户端发送一个 JSON 请求时:

{"name": "Laptop","price": 1000.0
}

FastAPI 会自动解析这个 JSON 请求并将其转换为 Item 对象。

JSON 响应

FastAPI 在返回响应时也会使用 JSON 格式。默认情况下,FastAPI 会将返回的数据自动转换为 JSON 格式:

@app.get("/items/{item_id}")
def get_item(item_id: int):return {"item_id": item_id, "name": "Laptop", "price": 1000.0}

客户端接收到的响应将会是:

{"item_id": 1,"name": "Laptop","price": 1000.0
}

以上内容涵盖了 HTTP 协议基础、请求与响应的工作原理、RESTful API 设计理念以及 JSON 格式的数据传输与解析,为 FastAPI 入门打下了坚实的基础。通过这些知识,可以更好地理解 FastAPI 的工作机制,进而高效地构建 Web 应用。

相关文章:

Python Web 开发:FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计

Python Web 开发:FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计 目录 🚀 HTTP 协议概述🌐 HTTP 请求与响应的工作原理🛠️ RESTful API 设计理念🗂️ JSON 格式数据的传输与解析 1. 🚀 HTTP 协议概…...

uniapp实现组件竖版菜单

社区图片页面 scroll-view scroll-view | uni-app官网 (dcloud.net.cn) 可滚动视图区域。用于区域滚动。 需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 <template><view class"pics"><scroll-view class"left"…...

osg、osgearth源码编译(二)

如果比较懒&#xff0c;也可以不看这篇文章&#xff0c;网上应该有很多编译好的库。也可以找我要。 本人还是建议学会编译&#xff0c;因为其他人电脑上编译好的&#xff0c;可能在你的电脑环境上&#xff0c;出现这样那样奇怪的问题&#xff0c;所以&#xff0c;最好还是自己能…...

从单一设备到万物互联:鸿蒙生态崛起的未来之路

目录 一、引言&#xff1a;开启智能时代的钥匙 二、鸿蒙生态概述&#xff1a;跨设备协同的核心价值 三、开发者机遇与挑战&#xff1a;抓住鸿蒙崛起的机会 四、鸿蒙生态崛起的前景&#xff1a;万物互联的未来 五、开发者在鸿蒙生态中的实践机遇与挑战 1. 跨设备开发的机遇…...

Kotlin的object修饰符定义类似Java的静态类/静态方法

Kotlin的object修饰符定义类似Java的静态类/静态方法 //类似Java的static类 object StaticCls {//类似Java静态变量private var num 0//类似Java的静态方法fun updateVal(n: Int) {num n}fun getVal(): Int {return num} }class MyTest() {fun setVal() {StaticCls.updateVal…...

html 中的 <code>标签

定义和用途 <code> 标签是HTML中的一个内联元素&#xff0c;用于定义计算机代码片段。当你需要在网页内容中展示代码&#xff0c;比如编程语言代码&#xff08;如JavaScript、Python、Java等&#xff09;、命令行指令、标记语言代码&#xff08;如HTML、XML等&#xff09…...

【Oracle11g SQL详解】GROUP BY 和 HAVING 子句:分组与过滤

GROUP BY 和 HAVING 子句&#xff1a;分组与过滤 在 Oracle 11g 中&#xff0c;GROUP BY 子句用于根据一个或多个列对查询结果进行分组&#xff0c;而 HAVING 子句用于对分组后的结果进行过滤。这两者常结合聚合函数使用&#xff0c;用以实现复杂的数据统计和分析。本文将系统…...

SSE基础配置与使用

什么是 Server-Sent Events (SSE) **Server-Sent Events (SSE) **是一种轻量的服务器向客户端推送消息的机制&#xff0c;基于 HTTP 协议实现单向通信&#xff0c;适用于需要实时更新的场景。 与 WebSocket 不同&#xff0c;SSE 只允许服务器向客户端发送数据&#xff0c;因此…...

Android -- 简易音乐播放器

Android – 简易音乐播放器 播放器功能&#xff1a;* 1. 播放模式&#xff1a;单曲、列表循环、列表随机&#xff1b;* 2. 后台播放&#xff08;单例模式&#xff09;&#xff1b;* 3. 多位置同步状态回调&#xff1b;处理模块&#xff1a;* 1. 提取文件信息&#xff1a;音频文…...

【开源免费】基于Vue和SpringBoot的技术交流分享平台(附论文)

博主说明&#xff1a;本文项目编号 T 053 &#xff0c;文末自助获取源码 \color{red}{T053&#xff0c;文末自助获取源码} T053&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

Python异步编程新写法:asyncio模块的最新实践

Python异步编程新写法&#xff1a;asyncio模块的最新实践 引言1. 异步编程基础2. 旧写法的问题3. 最新的写法4. 代码解析5. 最佳实践6. 总结7. 参考资料 引言 在现代编程中&#xff0c;异步编程已经成为提高程序性能和响应能力的重要手段。Python的asyncio模块为开发者提供了一…...

【Docker】Docker配置远程访问

配置Docker的远程访问&#xff0c;你需要按照以下步骤进行操作&#xff1a; 1. 在Docker宿主机上配置Docker守护进程监听TCP端口 Docker守护进程默认只监听UNIX套接字&#xff0c;要实现远程访问&#xff0c;需要修改配置以监听TCP端口。 ‌方法一&#xff1a;修改Docker服务…...

网络安全入门之网络安全工具分享-含初期所有工具(附百度网盘链接)

网络安全基础工具 抓包工具 burpsuite 这是一款十分经典的抓包改包工具&#xff0c;在全球范围内使用十分广泛&#xff0c;并且其内置各种插件&#xff0c;具有爆破&#xff0c;自动识别验证码&#xff0c;加解密发包等多种功能 专业版破解网盘链接&#xff1a; 通过百度网…...

玩转 uni-app 静态资源 static 目录的条件编译

一. 前言 老生常谈&#xff0c;了解 uni-app 的开发都知道&#xff0c;uni-app 可以同时支持编译到多个平台&#xff0c;如小程序、H5、移动端 App 等。它的多端编译能力是 uni-app 的一大特点&#xff0c;让开发者可以使用同一套代码基于 Vue.js 的语法编写程序&#xff0c;然…...

Docker 容器隔离关键技术:Seccomp

Docker 容器隔离关键技术&#xff1a;Seccomp 在 Docker 容器中&#xff0c;Seccomp&#xff08;Secure Computing Mode&#xff09; 是一种内核安全机制&#xff0c;用来限制容器内的程序可以调用哪些系统调用&#xff08;Syscalls&#xff09;。通过列清单的方式&#xff0c…...

【大模型】深度解析 NLP 模型5大评估指标及 应用案例:从 BLEU、ROUGE、PPL 到METEOR、BERTScore

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;无论是机器翻译、文本生成&#xff0c;还是问答系统开发&#xff0c;模型性能评估指标始终是开发者绕不开的工具。BLEU、ROUGE、PPL&#xff08;困惑度&#xff09;、METEOR 和 BERTScore 是五个最具代表性的指标&am…...

LinuxC高级

gdb调试工具 gdb调试的作用 gdb用于调试代码中逻辑错误&#xff0c;而非语法错误 gdb调试流程 生成可以使用gdb调试的执行文件 gcc -g xxx.c ---> 生成的文件可以使用gdb调试 进入gdb工具 gdb 可执行文件 ---> 使用gdb工具开始调试可执行文件 r/run&#xff1a;运行代码 …...

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我&#xff0c;能不能做个文档加密功能&#xff0c;就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了&#xff0c;那必须可以。 需求&#xff1a;将pdf文档经过加密处理&#xff0c;客户下载pdf文档&#xff0c;打开文档需要…...

LangChain——加载知识库文本文档 PDF文档

文档加载 这涵盖了如何加载目录中的所有文档。 在底层&#xff0c;默认情况下使用 UnstructedLoader。需要安装依赖 pip install unstructuredpython导入方式 from langchain_community.document_loaders import DirectoryLoader我们可以使用 glob 参数来控制加载特定类型文…...

深度学习2:从零开始掌握PyTorch:数据操作不再是难题

文章目录 一、导读二、张量的定义与基本操作三、广播机制四、索引与切片五、内存管理六、与其他Python对象的转换本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...