Lab1 · 购物清单(Socket 手写服务器)

一句话:不用任何框架,用 socket 从零手写 HTTP 服务器,实现"待买 / 已买"两栏购物清单,全部靠表单提交 + 服务端渲染 + 整页刷新工作。 HTTP 报文结构:请求行 → 头(\r\n 分隔,空行结束)→ 体(长度由…

This article is only available in Chinese for now. The interface is translated; the prose is still on the way.

代码:CSSE280 HW\280Lab\|所属课程:CSSE280 总览|进化版:Lab2 - 购物清单(Flask REST API)

一句话:不用任何框架,用 socket 从零手写 HTTP 服务器,实现"待买 / 已买"两栏购物清单,全部靠表单提交 + 服务端渲染 + 整页刷新工作。

文件结构

文件作用
httpserver.py手写 HTTP 服务器:解析请求行/头/体,静态文件 + API 路由
dataservice.py数据层:to_get / gotten 两个 list,提供增删移动函数
public/shopping.html页面模板,含 {to_get} {got} 占位符
public/scripts/script.jsAJAX 练习 stub(未启用,HTML 里 script 标签被注释掉了)

请求处理流程(httpserver.py 的骨架)

accept 连接 → 读请求行(方法 + 路径)→ parse_headers 逐行读到空行
→ 命中 API 路由?
   ├ GET  /shopping.html            → 读模板 + str.format 填入两栏列表 → 返回
   ├ POST /add_new_item             → 解析表单体 → dataservice.add → 重新渲染整页
   ├ POST /item_added_to_cart       → 移到"已买" → 重新渲染整页
   └ POST /item_removed_from_cart   → 移回"待买" → 重新渲染整页
→ 否则按扩展名查 Content-Type,直接回文件字节
→ 写响应头(状态行/Content-Type/Content-Length)+ 响应体 → 关连接

核心知识点

注意 / 遗留问题

运行

cd "CSSE280 HW\280Lab"
python httpserver.py
# → http://localhost:8080/shopping.html