后端开发调试 webhook、前端对接 API 时,经常需要一个能"照镜子"的服务——把收到的 HTTP 请求原样返回,方便查看客户端到底发了什么。今天用 OpenCode 写一个 HTTP 请求回显服务,约 80 行 Python 代码,零第三方依赖。
技术栈:Python 3 + http.server + argparse。
核心功能:
启动后效果:
$ 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"
}
pip install opencode 或参考 opencode.ai在项目目录下打开终端,运行 opencode 进入交互模式。
我对 OpenCode 说:
> 帮我用 Python 写一个 HTTP 回显服务器。启动后监听指定端口,收到任意 HTTP 请求后,把请求的方法、路径、请求头、查询参数、请求体以 JSON 格式返回给客户端。用标准库,不要第三方依赖。保存为 echo_server.py。
OpenCode 的响应:
OpenCode 直接创建了 echo_server.py,核心结构是一个继承 BaseHTTPRequestHandler 的 Handler 类,重写 do_GET 和 do_POST 方法,用 json.dumps 把请求信息序列化后写入响应。同时自动添加了 main() 入口和 KeyboardInterrupt 处理。
关键要点: OpenCode 不会问你"要不要加这个?",它默认选择最合理的实现。比如自动用了 self.headers 获取请求头、self.rfile.read() 读取 Body、Content-Type 设为 application/json。这就是 AI 编程的特点——你描述意图,它补全细节。
我对 OpenCode 说:
> 改一下,不要只支持 GET 和 POST,所有 HTTP 方法都统一处理(PUT、DELETE、PATCH、OPTIONS 等)。另外响应里加上 CORS 头 Access-Control-Allow-Origin: *,方便前端调用。JSON 输出加 indent=2 缩进美化。
OpenCode 的响应:
OpenCode 把 do_GET 和 do_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 完成了:
相比手动开发,这种"描述即开发"的方式让效率提升 5-10 倍。你只需要知道想要什么,不需要记住具体 API 和语法细节——这正是 AI 编程助手的核心价值。
这个项目的代码只有 56 行(不含空行),但它是一个功能完整的生产级调试工具。下次调 webhook 不妨试试:python echo_server.py --port 8080。