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. 编写bash脚本快速kill或启动tomcat

    ​假设tomcat安装路径为 /home/tomcat,示例如下: 1. kill tomcat进程 vim kill-tomcat-force.sh set fileformat=unix path ...

  2. COSBrowser iOS 版 | 如何不打开 App 查看监控数据?

    您是否有遇到这样的场景?当需要实时查看存储监控数据.查看某个存储桶的对象数量,又或者想了解某一个存储类型文件的下载量在当前与前一天的对比情况,是上涨了还是下降了,这时您是否也在经历频繁的打开关闭 Ap ...

  3. 对象存储 COS 推出一站式内容审核服务,助力打造绿色互联网

    今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...

  4. showModalBottomSheet setState 无法更新ui和高度设置问题

    showModalBottomSheet setState 无法更新ui问题 首先理解showModalBottomSheet,本质上可以理解为路由入栈,在show之后弹出的页面其实是另一个页面了,此 ...

  5. Podman与docker兼容性问题

    使用Podman最好的地方就是支持rootless,也就是说用户不需要为root权限即可进行容器的管理操作.因此现在在CentOS 8及以后的版本中,默认使用Podman替代Docker,如果使用do ...

  6. Shiro安全框架【认证】+【授权】

    1.Shiro的核心架构 Subject:程序主体 Security Manager:安全管理器 Authentication:做认证 Authorizer:做授权 Session Manager:会 ...

  7. 若依多模块版本,Linux下用Tomcat部署

    若依多模块版本 简介 下载地址 https://gitee.com/y_project/RuoYi 下载项目,打war包 下载项目 到 Gitee 下载项目 用 idea 打开,会自动下载 pom 依 ...

  8. Qt编写视频播放器(支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多种内核)

    一.前言 花了一年多的时间,终于把这个超级播放器做成了自己想要的架构,用户的需求是一方面,自己架构方面的提升也是一方面,最主要是将界面和解码解耦了,这样才能动态的挂载不同的解码内核到不同的视频监控窗体 ...

  9. Spring Data JPA中使用Example进行动态查询

    Spring Data JPA中使用Example进行动态查询主要涉及:实体对象.ExampleMatcher和Example等三种类类型.基于实例的动态查询所包含的三要素如下:1.实体对象:在ORM ...

  10. 百万架构师的第二课:设计模式:Spring 源码版本命名规则及下载安装

    第二章--SpringWeb应用开发篇 二.Spring 源码版本命名规则及下载安装 2.1.Spring源码版本命名规则 (1) 首先看看某些常见软件的版本号: Linux Kernel: 0.0. ...