我試圖在 Python 3.8 中運行以下示例代碼:
import socket
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com',80))
# since I need to send bytes and not a str. I add a 'b' literal also tried with encode()
mysock.send(b'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
if (len(data)) < 1:
break
print(data)
mysock.close()
但這會拋出 404 Not found 錯誤
b'HTTP/1.1 404 Not Found\r\nServer: nginx\r\nDate: Tue, 02 Nov 2021 04:38:35 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: close\r\n\r\n<html>\r\n<head><title>404 Not Found</title></head>\r\n<body>\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'
我用 urllib 也試過,它作業正常
import urllib.request
output= urllib.request.urlopen('http://www.py4inf.com/code/romeo.txt')
for line in output:
print(line.strip())
有誰知道如何解決這個問題?幫我弄清楚我在第一個塊代碼中哪里出錯了..提前致謝!
uj5u.com熱心網友回復:
mysock.send(b'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
由于以下幾個原因,這不是有效的 HTTP 請求:
- 它應該包含絕對路徑,而不是絕對 URL
- 它應該包含一個主機頭。盡管這對于 HTTP/1.0(但對于 HTTP/1.1)不是嚴格要求的,但通常還是可以預料的
- 行尾必須
\r\n不是\n
以下作業:
mysock.send(b'GET /code/romeo.txt HTTP/1.0\r\nHost: www.py4inf.com\r\n\r\n')
一般而言:雖然 HTTP 可能看起來很簡單,但實際上并非如此。不要僅僅通過查看一些流量來假設事情是如何運作的,而是要遵循實際標準。即使它最初似乎適用于特定服務器,但稍后可能會中斷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/347749.html
上一篇:使用套接字時的AllowAutoRedirect功能
下一篇:使用“查詢”httpapi后獲取{"code":"unauthorized","message":"unauthorizedacc
