Python使用http.client判断GET请求响应体是否为空的方法咨询
使用http.client判断响应体是否为空的正确姿势
首先得指出你之前两种写法的问题:
- 第一种里**两次调用
conn.getresponse()**是错误的,每个HTTP连接只能获取一次响应对象,第二次调用会触发异常或获取无效响应;而且length属性并不靠谱——如果响应没有返回Content-Length头,这个值会是-1,直接判断<1会把有效响应误判为空。 - 第二种里**两次调用
read()**也有问题,响应体是流式数据,第一次read()已经把所有内容读取完毕,第二次read()只会返回空的b'',哪怕原本有有效内容,也会导致后续json.loads报错。
然后回答你的核心疑问:b'{}'不会被视为空值。在Python的布尔判断逻辑中,只有空字节对象b''会被判定为False,任何非空的字节对象(包括b'{}'、b' '这类空白内容)都会被判定为True。而且b'{}'是合法的空JSON对象,json.loads可以正常解析它。
正确的做法是先一次性获取响应对象,读取一次响应体并保存,再做判断和解析:
import http.client import json conn = http.client.HTTPConnection("example.com") conn.request("GET", "/your-target-endpoint") # 仅获取一次响应对象 resp = conn.getresponse() # 仅读取一次响应体并保存 response_body = resp.read() if not response_body: print("Error: empty response") else: try: data = json.loads(response_body.decode()) # 处理解析后的JSON数据 print(data) except json.JSONDecodeError: print("Error: response is not valid JSON") conn.close()
这种写法既避免了重复读取/获取响应的问题,也能准确判断真正的空响应,同时还能处理非JSON格式的响应异常。
内容的提问来源于stack exchange,提问作者Barbi
相关产品推荐
相关产品推荐

