asyncio流与同步流向客户端输出JSON的差异及报错排查
错误原因
你编写的asyncio侧代码完全缺失了HTTP协议要求的响应头和头体分隔符,客户端收到的只有纯JSON字符串,不符合HTTP响应格式规范,因此无法解析。
同步侧的代码完整遵循了HTTP响应的结构要求,按顺序发送了四个部分的内容:
- HTTP状态行:
HTTP/1.1 200 OK - 响应头字段:
Content-Type: application/json、Connection: close - 头体分隔符:两个连续的换行
\n\n,标识响应头结束、响应体开始 - JSON格式的响应体内容
而asyncio侧的代码跳过了前三个HTTP协议必要部分,直接发送响应体,自然会导致客户端读取失败。另外还要注意asyncio.StreamWriter.write()方法接收的是bytes类型参数,直接传入字符串会抛出类型错误。
修正后的asyncio代码
import ujson # 先发送HTTP响应头和分隔符 swriter.write(b"HTTP/1.1 200 OK\n") swriter.write(b"Content-Type: application/json\n") swriter.write(b"Connection: close\n\n") # 发送JSON响应体,注意要编码为bytes swriter.write(ujson.dumps(response).encode("utf-8")) await swriter.drain() # 关闭连接,匹配Connection: close的语义 swriter.close() await swriter.wait_closed()
内容的提问来源于stack exchange,提问作者srinivasa rao pedada
相关产品推荐
相关产品推荐

