在Python 3中使用Socket获得400错误的请求错误

时间:2017-06-27 06:30:45

标签: python python-3.x sockets networking web

我刚开始使用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()

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

我已经测试过它可以完美地适应这种修改。

但是,鉴于HTTP并不像它看起来那么简单,我真的建议使用像访问目标的请求这样的库。如果这看起来像是太多的开销,请研究HTTP standard以正确实现它,而不是仅仅猜测HTTP如何从一些示例中工作 - 并猜测它是错误的。

另请注意,服务器对于像您这样的破坏实施的宽容程度有所不同。因此,曾经使用过一台服务器的东西可能无法与下一台服务器配合使用,甚至在某些软件升级后也无法使用同一台服使用强大且经过良好测试和维护的库而不是自己完成所有操作可能会在以后为您节省大量麻烦。

答案 1 :(得分:1)

您不会将协议发送到Web服务器,只能在Host标头中单独发送主机名,然后才会在HTTP 1.1中发送。

对于HTTP 1.0,它应该是:

mysock.send('GET /romeo.txt HTTP/1.0\r\n\r\n')

或者,您可以尝试发送HTTP 1.1请求:

mysock.send('GET /romeo.txt HTTP/1.1\r\n')
mysock.send('Host: data.pr4e.org\r\n\r\n')

答案 2 :(得分:1)

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

适合我。

答案 3 :(得分:0)

此代码对我有用:

GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n
  1. \n\n更改为\r\n\r\n
  2. 删除HTTP/1.0\r\n\r\n之间的空格