如何使用Python http.server/http.client传输字典或JSON数据
核心结论
HTTP协议仅支持字节流传输,无法直接传递Python原生字典对象。你当前使用str(dictionary).encode("utf-8")的方案存在严重的转义、解析容错问题,最优方案是将字典序列化为标准JSON格式传输。
服务端实现
需要使用Python内置的json模块完成序列化,同时正确设置响应头,避免客户端解析异常:
import json from http.server import BaseHTTPRequestHandler class CrawlHandler(BaseHTTPRequestHandler): def do_GET(self): # 你的爬虫逻辑,执行后得到结果字典 crawl_dict = {"status": "success", "data": {"title": "测试内容", "count": 10}} # 发送响应头 self.send_response(200) self.send_header("Content-Type", "application/json; charset=utf-8") self.end_headers() # 序列化为JSON字节流后发送 # ensure_ascii=False 避免中文被转义为Unicode编码 json_bytes = json.dumps(crawl_dict, ensure_ascii=False).encode("utf-8") self.wfile.write(json_bytes)
客户端实现
收到响应后直接用json模块反序列化即可得到原生Python字典,无需自行解析字符串:
import json from http.client import HTTPConnection # 连接服务端 conn = HTTPConnection("127.0.0.1", 8000) conn.request("GET", "/your_api_path") resp = conn.getresponse() # 反序列化得到字典 resp_content = resp.read() result_dict = json.loads(resp_content.decode("utf-8")) # 可直接操作字典 print(result_dict["data"]["title"])
特殊场景处理
如果你的字典包含JSON不支持的类型(比如datetime对象、自定义类实例等),可以通过json.dumps的default参数自定义序列化规则,示例:
from datetime import datetime custom_dict = {"create_time": datetime.now(), "content": "test"} json_str = json.dumps(custom_dict, default=lambda obj: obj.isoformat() if isinstance(obj, datetime) else str(obj))
内容的提问来源于stack exchange,提问作者user16241255
相关产品推荐
相关产品推荐

