Python socket发送HTTP请求出现bytes类型错误及400异常求助
问题修复方案
1. TypeError报错原因
Python3中socket.send()方法只接收字节类型数据,直接传入字符串就会触发TypeError: a bytes-like object is required, not 'str'报错。两种解决方案:
- 字符串末尾调用
.encode('utf-8')转为字节后再传入 - 直接用
b前缀定义字节串(仅适用于固定内容,不能拼接动态变量)
2. 400 Bad Request报错原因
你发送的HTTP报文格式完全错误:HTTP/1.1 200 OK是服务器返回给客户端的响应行格式,不是客户端发起请求的格式。同时HTTP/1.1协议强制要求请求头携带Host字段,否则服务器无法识别你要访问的站点,也会返回400错误。
正确的客户端GET请求报文格式为:
GET [请求路径] HTTP/1.1 Host: [目标站点域名] Connection: close [空行]
3. 修复后的可运行代码
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 输入内容为不带http前缀的纯域名,例如:www.baidu.com domain = input("请输入站点域名后按回车:") s.connect((domain, 80)) # 构造标准HTTP GET请求 request_content = f"GET / HTTP/1.1\r\nHost: {domain}\r\nConnection: close\r\n\r\n" # 字符串转字节后发送 s.send(request_content.encode("utf-8")) # 循环接收完整响应内容 response = b"" while True: chunk = s.recv(1024) if not chunk: break response += chunk s.close() # 字节转字符串打印输出 print(response.decode("utf-8"))
4. 注意事项
- 上述代码仅适用于HTTP站点(80端口),如果要访问HTTPS站点(443端口),需要引入
ssl模块包裹socket连接 - 拼接动态请求内容时,先统一拼接为完整字符串,再整体转字节,不要直接混合拼接字符串和字节类型数据,避免类型错误
- 如果要请求站点下的指定路径,把请求行里的
/替换为对应路径即可,例如GET /post/1.html HTTP/1.1
内容的提问来源于stack exchange,提问作者codeEater
相关产品推荐
相关产品推荐

