You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:07