OpenCode 实践课:4 分钟用 Python 写出一个 HTTP 请求回显调试服务

项目介绍

后端开发调试 webhook、前端对接 API 时,经常需要一个能"照镜子"的服务——把收到的 HTTP 请求原样返回,方便查看客户端到底发了什么。今天用 OpenCode 写一个 HTTP 请求回显服务,约 80 行 Python 代码,零第三方依赖。

技术栈:Python 3 + http.server + argparse

核心功能:

  • 监听指定端口,接收任意 HTTP 请求
  • 以 JSON 格式返回请求的方法、路径、Headers、Query 参数、Body、来源 IP 和时间戳
  • 支持 CORS 跨域
  • 命令行参数自定义端口

启动后效果:

$ python echo_server.py --port 8080
[2026-08-06 12:00:01] POST /webhook - 127.0.0.1
{
  "method": "POST",
  "path": "/webhook",
  "query": {"key": ["value"]},
  "headers": {"Content-Type": "application/json", ...},
  "body": "{\"event\":\"test\"}",
  "client": "127.0.0.1",
  "timestamp": "2026-08-06T12:00:01.123456"
}

准备工作

  • Python 3.6+
  • 安装 OpenCode:pip install opencode 或参考 opencode.ai

在项目目录下打开终端,运行 opencode 进入交互模式。

实践过程

第一步:创建基础 HTTP 服务器

我对 OpenCode 说:

> 帮我用 Python 写一个 HTTP 回显服务器。启动后监听指定端口,收到任意 HTTP 请求后,把请求的方法、路径、请求头、查询参数、请求体以 JSON 格式返回给客户端。用标准库,不要第三方依赖。保存为 echo_server.py。

OpenCode 的响应:

OpenCode 直接创建了 echo_server.py,核心结构是一个继承 BaseHTTPRequestHandler 的 Handler 类,重写 do_GETdo_POST 方法,用 json.dumps 把请求信息序列化后写入响应。同时自动添加了 main() 入口和 KeyboardInterrupt 处理。

关键要点: OpenCode 不会问你"要不要加这个?",它默认选择最合理的实现。比如自动用了 self.headers 获取请求头、self.rfile.read() 读取 Body、Content-Type 设为 application/json。这就是 AI 编程的特点——你描述意图,它补全细节。

第二步:支持所有 HTTP 方法 + CORS

我对 OpenCode 说:

> 改一下,不要只支持 GET 和 POST,所有 HTTP 方法都统一处理(PUT、DELETE、PATCH、OPTIONS 等)。另外响应里加上 CORS 头 Access-Control-Allow-Origin: *,方便前端调用。JSON 输出加 indent=2 缩进美化。

OpenCode 的响应:

OpenCode 把 do_GETdo_POST 替换为一个通用的 _handle() 方法,然后用 do_GET = do_POST = do_PUT = ... = _handle 把所有 HTTP 方法映射到同一个处理逻辑。同时在响应头里加上了 Access-Control-Allow-Origin: *Access-Control-Allow-Methods: *

关键要点: OpenCode 在编辑时只改动需要改的部分,不会重写整个文件。这种增量修改的能力在多轮迭代中非常实用。

第三步:添加命令行参数和请求日志

我对 OpenCode 说:

> 用 argparse 加命令行参数:--port 指定监听端口,默认 8080;--quiet 静默模式不打印日志。另外每次请求在控制台打印格式化的日志:[时间] 方法 路径 - 来源IP

OpenCode 的响应:

OpenCode 在 import 区域添加了 argparse,在 main() 里添加了参数解析逻辑,在 Handler 的 _handle() 方法里添加了带时间戳的 print 日志。对 --quiet 参数,用了一个简单的 if not args.quiet 判断。

关键要点: 整个过程我只说了"我要什么",没有写一行代码。从参数定义到日志格式到条件判断,全部由 OpenCode 自动完成。

第四步:运行验证

我对 OpenCode 说:

> 帮我验证一下这个服务能不能正常跑。

OpenCode 的响应:

OpenCode 在后台启动了服务器,然后用 curl 发送测试请求:

$ python echo_server.py --port 8080 &
$ curl -s http://localhost:8080/api/test?name=hello | python -m json.tool

返回了格式完整的 JSON,包含 method、path、query、headers、body、client、timestamp 所有字段。

完整代码

import json
import argparse
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs


class EchoHandler(BaseHTTPRequestHandler):
    def _handle(self):
        parsed = urlparse(self.path)
        query = parse_qs(parsed.query)

        content_length = int(self.headers.get("Content-Length", 0))
        body = ""
        if content_length > 0:
            body = self.rfile.read(content_length).decode("utf-8")

        info = {
            "method": self.command,
            "path": parsed.path,
            "query": {k: v if len(v) > 1 else v[0] for k, v in query.items()},
            "headers": dict(self.headers),
            "body": body if body else None,
            "client": self.client_address[0],
            "timestamp": datetime.now().isoformat(),
        }

        if not args.quiet:
            ts = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            print(f"[{ts}] {self.command} {self.path} - {self.client_address[0]}")

        resp = json.dumps(info, ensure_ascii=False, indent=2)
        self.send_response(200)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "*")
        self.send_header("Access-Control-Allow-Headers", "*")
        self.end_headers()
        self.wfile.write(resp.encode("utf-8"))

    do_GET = do_POST = do_PUT = do_DELETE = do_PATCH = do_HEAD = do_OPTIONS = _handle


def main():
    parser = argparse.ArgumentParser(description="HTTP Request Echo Server")
    parser.add_argument("--port", type=int, default=8080, help="监听端口(默认 8080)")
    parser.add_argument("--quiet", action="store_true", help="静默模式,不打印请求日志")

    global args
    args = parser.parse_args()

    server = HTTPServer(("0.0.0.0", args.port), EchoHandler)
    print(f"Echo server running on http://0.0.0.0:{args.port}")
    print(f"Press Ctrl+C to stop")
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\nServer stopped.")
        server.server_close()


if __name__ == "__main__":
    main()

小结

从零到可运行的服务,全程只用了 4 分钟。我输入了 3 段中文描述,OpenCode 完成了:

  • 代码生成:自动选择正确的标准库模块、合理的类结构
  • 增量修改:每次只改相关部分,不重写整个文件
  • 细节补全:CORS 头、Query 参数扁平化、时间戳格式、错误处理——这些我都没提,它自己加了

相比手动开发,这种"描述即开发"的方式让效率提升 5-10 倍。你只需要知道想要什么,不需要记住具体 API 和语法细节——这正是 AI 编程助手的核心价值。

这个项目的代码只有 56 行(不含空行),但它是一个功能完整的生产级调试工具。下次调 webhook 不妨试试:python echo_server.py --port 8080