title: 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南

date: 2025/2/26

updated: 2025/2/26

author: cmdragon

excerpt:

本文通过开汉堡店的趣味比喻,零基础讲解HTTP协议与RESTful API设计。你将:
用快递盒理解HTTP请求/响应的状态码/Header/Body
通过5个汉堡店API案例掌握RESTful设计精髓
亲手实现带验证的API(代码可直接复制运行)
获得错误调试锦囊(含422等9种常见错误解决方案)

categories:

  • 后端开发
  • FastAPI

tags:

  • HTTP协议入门
  • RESTful设计实战
  • API开发基础
  • 状态码图解
  • 请求响应结构
  • FastAPI快速上手
  • 错误调试手册

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

本文通过开汉堡店的趣味比喻,零基础讲解HTTP协议与RESTful API设计。你将:

  • 用快递盒理解HTTP请求/响应的状态码/Header/Body
  • 通过5个汉堡店API案例掌握RESTful设计精髓
  • 亲手实现带验证的API(代码可直接复制运行)
  • 获得错误调试锦囊(含422等9种常见错误解决方案)

第一章:3分钟理解HTTP协议(快递员视角)

1.1 快递单号:HTTP请求结构

POST /orders HTTP/1.1              寄件动作
Content-Type: application/json 物品清单格式
Authorization: Bearer token123 安全印章 {"item": "芝士汉堡", "quantity": 2} 包裹内容

1.2 物流追踪:HTTP响应结构

HTTP/1.1 201 Created              签收成功
Location: /orders/1001 新订单位置
X-RateLimit-Remaining: 99 剩余请求次数 {"id": 1001, "status": "烹饪中"} 返回的包裹

1.3 快递状态码速查表

状态码 比喻 常见场景
200 包裹完好送达 成功获取资源
404 收件地址不存在 请求路径错误
422 包裹内容不符合要求 参数校验失败

第二章:RESTful设计就像开餐厅 ️

2.1 餐厅四大基础服务(对应HTTP方法)

GET / 菜单  # 查看菜单
POST / 订单 # 下单
PUT / 订单 / 1001 # 修改订单
DELETE / 订单 / 1001 # 退单

2.2 第一个RESTful API:汉堡店系统

from fastapi import FastAPI

app = FastAPI()
fake_menu = [
{"id": 1, "name": "经典汉堡", "price": 30},
{"id": 2, "name": "辣味汉堡", "price": 35}
] # 获取全部汉堡
@app.get("/hamburgers")
async def get_hamburgers():
return fake_menu # 创建新汉堡
@app.post("/hamburgers")
async def create_hamburger(name: str, price: float):
new_item = {"id": len(fake_menu) + 1, "name": name, "price": price}
fake_menu.append(new_item)
return {"message": "汉堡已加入菜单", "data": new_item}

第三章:API安全与验证

3.1 必填参数验证(防止瞎填单)

from pydantic import BaseModel

class Hamburger(BaseModel):
name: str # 必须填写名称
price: float # 必须填写价格
spicy: bool = False # 可选参数 @app.post("/v2/hamburgers")
async def safe_create(hb: Hamburger):
if hb.price < 0:
raise HTTPException(422, "价格不能为负数")
# 保存到数据库...

3.2 常见错误诊疗室

问题:为什么返回422错误?

  1. 检查是否忘记写price字段
  2. 查看价格是否是负数
  3. 确认请求头包含Content-Type: application/json

第四章:课后实战工坊 ️

任务1:实现订单系统

# 你的代码在这里!
@app.get("/orders/{order_id}")
async def get_order(order_id: int):
# 实现根据ID查订单
pass @app.post("/orders")
async def create_order(items: list):
# 实现创建订单
pass

任务2:防御披萨注入攻击

# 危险代码(可被SQL注入)
def get_user(input):
cursor.execute(f"SELECT * FROM users WHERE name = '{input}'") # 你的任务:改写为安全代码(使用参数化查询)

结语

通过这份指南,你已掌握HTTP协议的核心机制与RESTful API设计精髓。现在打开VS Code,用python -m uvicorn main:app --reload

启动你的第一个API吧!遇到问题随时回来看错误锦囊,编程就像做汉堡,多练习才能成为大厨


余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 | cmdragon's Blog

往期文章归档:

从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐的更多相关文章

  1. 使用 SpringBoot 构建一个RESTful API

    目录 背景 创建 SpringBoot 项目/模块 SpringBoot pom.xml api pom.xml 创建 RESTful API 应用 @SpringBootApplication @C ...

  2. [译]Spring Boot 构建一个RESTful Web服务

    翻译地址:https://spring.io/guides/gs/rest-service/ 构建一个RESTful Web服务 本指南将指导您完成使用spring创建一个“hello world”R ...

  3. 做一个通过dockerfile从零构建centos7.4

    今天做一个dockerfile从零构建centos7.4镜像 废话不多说,很简单. 需要的软件包:centos7.4的rootfs 链接:提取码:usnu 下载以后我们打开看看里面是什么呢: 可以看的 ...

  4. 在 Docker 上运行一个 RESTful 风格的微服务

    tags: Microservice Restful Docker Author: Andy Ai Weibo:NinetyH GitHub: https://github.com/aiyanbo/d ...

  5. 从零构建JavaScript的对象系统

    一.正统的类与继承 类是对象的定义,而对象是类的实例(Instance).类不可直接使用,要想使用就必须在内存上生成该类的副本,这个副本就是对象. 以Java为例: public class Grou ...

  6. 使用 AngularJS 从零构建大型应用

    0.导言 1.准备工作 2.构建框架 3.丰富你的directives 4.公用的services 5.用controllers组织业务 导言 纵览线上各种AngularJS教程,大部分都是基础与一些 ...

  7. 在GlassFish应用服务器上创建并运行你的第一个Restful Web Service【翻译】

    前言 本人一直开发Android应用,目前Android就业形势恶劣,甚至会一路下滑,因此决定学习服务器开发.采用的语言是java,IDE是Intellij,在下载Intellij的同时看到官网很多优 ...

  8. 基于SpringBoot开发一个Restful服务,实现增删改查功能

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  9. 用Spring Tools Suite(STS)开始一个RESTful Web Service

    spring.io官方提供的例子Building a RESTful Web Service提供了用Maven.Gradle.STS构建一个RESTFul Web Service,实际上采用STS构建 ...

  10. 译:3.消费一个RESTful Web Service

    这节课我们根据官网教程学习如何去消费(调用)一个 RESTful Web Service . 原文链接 https://spring.io/guides/gs/consuming-rest/ 本指南将 ...

随机推荐

  1. Ubuntu22.04安装cuda12.1+cudnn8.9.2+TensorRT8.6.1+pytorch2.3.0+opencv_cuda4.9+onnxruntime-gpu1.18

    说来话长,我想配一个一劳永逸的环境,方便以后复用.省的以后反复查教程重新装了 1. 安装miniconda+py3.10 cd /root wget -q https://repo.anaconda. ...

  2. Navicat连接Oracle数据库报错:oracle library is not loaded解决方法

    连接Oracle时提示"oracle library is not loaded". 去Oracle官网下载Oracle Instant Client Downloads. htt ...

  3. 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程

    前言 最近线上服务经常出现一些奇奇怪怪的问题,比如网页上的静态资源加载不出来,或者请求后端莫名报错,又或者 Redis 报错- 当我 SSH 登录到服务器上时,更不对劲了,敲个命令都卡顿- 如果是以前 ...

  4. 为什么C#越来越恶心

    看看这个 再看这些 more 老子声明个空函数,没有访问数据请改为 static,真是越来越智障 为什么一个活泼的语言越搞越像 C++? C# 发明了各种可爱的小玩意儿,尤其是 async/await ...

  5. [转]ptp(precision time protocol)时钟同步

    一.介绍1:什么是ptpPTP(Precision Time Protocol) 是一个通过网络同步时钟的一个协议.当硬件支持时,PTP 精度能达到亚微秒,比 NTP(Network Time Pro ...

  6. [转]升级/重装win10系统--提示无法验证密钥的解决办法

    在由win7系统升级到win10时,出现了无法验证密钥的问题(还未提示输入密钥的时候就直接提示无法验证密钥),英文版报错为:Windows 10 setup has failed to validat ...

  7. 16. C++快速入门--模板和Concept

    待修改 1 定义模板 1.1 模板形参 模板参数 模板可以有两种参数, 一种是类型参数, 一种是非类型参数 这两种参数可以同时存在, 非类型参数 的类型 可以是 模板类型形参 template < ...

  8. Solution -「NEERC 2016」Delight for a Cat 的一个尝试

    \(\mathscr{Description}\)   Link.   给定 \(n,k,m_s,m_e\) 和两个长为 \(n\) 的序列 \(\{s\},\{e\}\), 选择一个 \(S\sub ...

  9. 控制反转(Inversion of Control,IoC)

    依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IoC)是软件工程中两个相关但不同的概念.它们都旨在提高代码的模块化.可维护性和可测试性 ...

  10. atomic 包底层实现原理

    一.概念介绍(一)volatile关键字 Java 因为指令重排序,优化我们的代码,让程序运行更快,也随之带来了多线程下,指令执行顺序的不可控. 1.volatile关键字的作用: 内存可见性,修饰的 ...