【问题标题】:400 Bad Request (practicing socket python)400 Bad Request(练习socket python)
【发布时间】:2021-10-28 07:28:24
【问题描述】:

我正在从 youtube 上的某个人那里尝试以下代码(我仍在练习 phyton 上的套接字)。该代码返回 400 错误请求。有人可以帮忙吗?

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org',80)) #ring web and assign extension
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if (len(data)<1): #len data 0 means the end of string which means zero data received
        break
    print(data.decode())
mysock.close()

【问题讨论】:

  • 您可能想了解:1. HTTP 中哪些标头是强制性的,以及 2. 语言的实际拼写方式。
  • 问题与缺少标题或拼写无关。

标签: python sockets server bad-request


【解决方案1】:

我认为您的问题是您在请求中使用\n 分隔行,而不是\r\n。行尾标记记录在 RFC 2616 中。

这很好用:

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()

mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if not data:
        break
    print(data.decode())
mysock.close()

更新

正如 cmets 中所指出的,此请求在技术上是不正确的。以下内容也可以使用,并且更能代表 HTTP 请求的外观:

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET /romeo.txt HTTP/1.0\r\nHost: data.pr4e.org\r\n\r\n'.encode()

mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if not data:
        break
    print(data.decode())
mysock.close()

与前面的示例不同,这确实包含 Host 标头。这 原始请求有效的唯一原因是由于配置 远程服务器。

【讨论】:

  • 好收获!它在任何一种情况下都有效,这让我分心了:)。
  • 谢谢老兄:) :)
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多