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. Datadog发布云成本现状报告:83%的容器支出被闲置资源浪费

    原文链接:https://www.datadoghq.com/state-of-cloud-costs/ 编译:CloudPilot AI 尽管灵活多样的云服务为云成本优化提供了诸多机会,但企业在提升 ...

  2. TypeScript 总结

    js 类型分为两种:基本数据类型和复杂数据类型 基本数据类型主要有:number.string.boolean.null.undefined.symbo(es6新增).BigInt(es10新增) t ...

  3. SpringSecurity认证流程分析

    重要组件 SecurityContext 上下文对象,Authentication(认证)对象会放在里面 SecurityContextHolder 用于拿到上下文对象的静态工具类 Authentic ...

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

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

  5. Spring Boot + K8S 中的滚动发布、优雅停机、弹性伸缩、应用监控、配置分离

    前言 K8s + SpringBoot实现零宕机发布:健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离(镜像复用) 配置 健康检查 健康检查类型:就绪探针(readiness ...

  6. shell之变量默认值

    {var:-default_value}当var 不存在,或者值为空时,返回default_value name不存在,返回了一个默认值,但是name并没有改变, 后续不可访问 $ set -u # ...

  7. macOS:无法打开“XXXX”,因为Apple无法检查其是否包含恶意软件。的解决办法

    今天在安装node.js的时候出现了如下错误 从网上找到两种解决方案: 第一种(不建议)在终端输入以下命令即可 sudo spctl --master-disable1按回车键,随后提醒你输入电脑密码 ...

  8. Qt音视频开发28-ffmpeg解码本地摄像头(yuv422转yuv420)

    一.前言 一开始用ffmpeg做的是视频流的解析,后面增加了本地视频文件的支持,到后面发现ffmpeg也是支持本地摄像头设备的,只要是原则上打通的比如win系统上相机程序.linux上茄子程序可以正常 ...

  9. pytorch模型降低计算成本和计算量

    下面是如何使用PyTorch降低计算成本和计算量的一些方法: 压缩模型:使用模型压缩技术,如剪枝.量化和哈希等方法,来减小模型的大小和复杂度,从而降低计算量和运行成本. 分布式训练:使用多台机器进行分 ...

  10. JVM实战—7.如何模拟GC场景并阅读GC日志

    大纲 1.动手模拟出频繁Young GC的场景 2.JVM的Young GC日志应该怎么看 3.代码模拟动态年龄判定规则进入老年代 4.代码模拟S区放不下部分进入老年代 5.JVM的Full GC日志 ...