关于 Python 使用套接字的 HTTP GET 请求的问题
Question regarding Python HTTP GET request using sockets
想知道为什么在使用套接字发送 HTTP GET 请求时出现 408 请求超时。我刚刚复制了通过 Chrome 发送的 GET 请求,然后将其粘贴到 python 中,以为我会收到 200 响应,但很明显,我遗漏了一些东西。
def GET():
headers = ("""GET / HTTP/1.1\r
Host: {insert host here}\r
Connection: close\r
Cache-Control: max-age=0\r
DNT: 1\r
Upgrade-Insecure-Requests: 1\r
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r
Accept-Encoding: gzip, deflate\r
Accept-Language: en-US,en;q=0.9\r
Cookie: accept_cookies=1\r\n""").encode('ascii')
payload = headers
return payload
def activity1():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
user = GET()
sock.sendall(user)
poop = sock.recv(10000)
print(poop)
sock.close()
假设主机名和端口定义正确,此请求是否有任何问题导致超时?谢谢
最初的问题是 HTTP header 没有正确完成,即缺少最后的 \r\n
(空行)。完成此操作后,您可能 运行 会遇到多个其他问题,例如:
- 您假设所有内容都可以在一个
recv
中阅读,这只适用于简短的回答。
- 您可能假设 body 是单字节缓冲区。但它可以分块传输,因为 HTTP/1.1 支持 Transfer-Encoding.
- 您可能认为 body 是普通的。但它可以被压缩,因为你明确接受 gzip-compressed 响应。
HTTP 并不像它看起来的那样简单。请在实施之前阅读实际标准,参见 RFC 7230。或者只使用一个为您完成繁重工作的库。
想知道为什么在使用套接字发送 HTTP GET 请求时出现 408 请求超时。我刚刚复制了通过 Chrome 发送的 GET 请求,然后将其粘贴到 python 中,以为我会收到 200 响应,但很明显,我遗漏了一些东西。
def GET():
headers = ("""GET / HTTP/1.1\r
Host: {insert host here}\r
Connection: close\r
Cache-Control: max-age=0\r
DNT: 1\r
Upgrade-Insecure-Requests: 1\r
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r
Accept-Encoding: gzip, deflate\r
Accept-Language: en-US,en;q=0.9\r
Cookie: accept_cookies=1\r\n""").encode('ascii')
payload = headers
return payload
def activity1():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
user = GET()
sock.sendall(user)
poop = sock.recv(10000)
print(poop)
sock.close()
假设主机名和端口定义正确,此请求是否有任何问题导致超时?谢谢
最初的问题是 HTTP header 没有正确完成,即缺少最后的 \r\n
(空行)。完成此操作后,您可能 运行 会遇到多个其他问题,例如:
- 您假设所有内容都可以在一个
recv
中阅读,这只适用于简短的回答。 - 您可能假设 body 是单字节缓冲区。但它可以分块传输,因为 HTTP/1.1 支持 Transfer-Encoding.
- 您可能认为 body 是普通的。但它可以被压缩,因为你明确接受 gzip-compressed 响应。
HTTP 并不像它看起来的那样简单。请在实施之前阅读实际标准,参见 RFC 7230。或者只使用一个为您完成繁重工作的库。