gpt4 book ai didi

python - 在 Python 3 中使用套接字获取 400 Bad Request 错误

转载 作者:行者123 更新时间:2023-11-28 21:41:25 25 4
gpt4 key购买 nike

我刚开始使用 Python 3.6.1 中的 Python Web 数据。我正在学习套接字,我的代码有一个我无法弄清楚的问题。我的代码中的网站工作正常,但是当我运行这段代码时,出现 400 Bad Request 错误。我不太确定我的代码有什么问题。提前致谢。

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

mysock.connect(('data.pr4e.org', 80))

mysock.send(('GET http://data.pr4e.org/romeo.txt HTTP/1.0 \n\n').encode())

while True:
data = mysock.recv(512)
if ( len(data) < 1 ):
break
print (data)

mysock.close()

最佳答案

GET http://data.pr4e.org/romeo.txt HTTP/1.0 \n\n

欢迎来到 HTTP 的美妙世界,大多数用户认为这是一个简单的协议(protocol),因为它是人类可读的,但实际上它可能是一个非常复杂的协议(protocol)。鉴于您的上述要求,存在几个问题:

  • 路径不应是完整的 URL 而只是 /romeo.txt。只有在向代理发出请求时才会使用完整的 URL。
  • 行尾必须是\r\n 而不是\n
  • HTTP/1.0 之后的行尾之前不应有空格。
  • 虽然只有 HTTP/1.1 才需要主机 header ,但许多服务器(包括您尝试访问的服务器)在 HTTP/1.0 中也需要它,因为它们在同一 IP 地址上有多个主机名,并且需要区分您使用的是哪个名称想要。

考虑到这一点,您发送的数据应该改为

GET /romeo.txt HTTP/1.0\r\nHost: data.pr4e.org\r\n\r\n

而且我已经测试过它与此修改完美配合。

但是,考虑到 HTTP 并不像看起来那么简单,我真的建议使用像请求这样的库来访问目标。如果这对您来说开销太大,请研究 HTTP standard正确地实现它,而不是仅仅从一些例子中猜测 HTTP 是如何工作的——然后猜错了。

另请注意,服务器对像您这样的损坏实现的宽容程度不同。因此,曾经在一台服务器上工作的东西可能无法在下一台服务器上工作,甚至在某些软件升级后也无法在同一台服务器上工作。使用一个健壮且经过良好测试和维护的库,而不是自己做所有事情,这样也可以在以后为您省去很多麻烦。

关于python - 在 Python 3 中使用套接字获取 400 Bad Request 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44773601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com