【问题标题】:Python3 compose HTTP GET messagePython3 编写 HTTP GET 消息
【发布时间】:2018-04-10 14:55:38
【问题描述】:

我正在尝试通过 TCP 连接向服务器发送 HTTP GET 消息,但似乎我做错了什么。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((server, port))

message = 'GET /' + direction + ' HTTP/1.1'    

s.send(message.encode('utf-8'))

while True:
    webpage = s.recv(1024)

    print(webpage)

    if not webpage:
        break

    with open('step3.txt', 'wb') as file:
        file.write(webpage.decode('utf-8').content)

这里重要的是变量message的组成,因为问题是服务器显然无法识别HTTP请求消息。

谢谢

【问题讨论】:

  • 你不能使用更高级别的库,例如http.clientrequests
  • 问题是这个练习是为了不使用那些库哈哈
  • 呃,为什么更努力而不是更聪明呢?他们的底层代码使用socket
  • 我知道,但这不是我的选择:)。老师的东西……

标签: python python-3.x http networking get


【解决方案1】:

服务器拒绝您的 HTTP 请求可能是因为您的请求正文无效。看看这个有效的请求:

GET / HTTP/1.1
Host: www.test.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
(empty line)

第一件事:您的请求必须以空行结束 (\r\n)。在您的上下文中,这意味着 message = 'GET /' + direction + ' HTTP/1.1\n'

然后,缺少一些标题:

使用类似这样的方式进行拍摄,将www.test.com 替换为您要与之通信的实际主机名:

message = ''
message += 'GET /' + direction + ' HTTP/1.1\r\n'
message += 'Host: www.test.com\r\n'
message += 'User-Agent: my agent\r\n'
message += '\r\n'

最后,除非你需要写使用socket,否则我推荐使用requestsurllib。这些包封装了手工处理 TCP/UDP 套接字背后的艰辛工作。

【讨论】:

  • @t.m.adam 你是对的。我刚刚更新了我的答案。谢谢!
  • 非常感谢@matheus-portela。这是发出 HTTP 请求的正确选项!
猜你喜欢
  • 1970-01-01
  • 2019-07-01
  • 2018-06-20
  • 2016-08-27
  • 2018-09-08
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多