Python 无法理解来自 URL 的套接字 GET 请求的正确格式?
Python Socket GET request from URL not understood with correct format?
我正在尝试为作业设置一个 http 请求以连接到网络服务器并计算给定单词在页面中出现的次数。我正在处理这个的前半部分,每次我尝试发送带有最后修改日期的 header 信息请求时,它都会返回一个 400 错误请求错误
import socket,sys
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('162.246.156.195', 80)
client_socket.connect(server_address)
request = ''' GET / tests/a.html HTTP/1.1
HOST: 162.246.156.195
IF-MODIFIED-SINCE: <>
Conncection: keep-alive
''';
client_socket.send(request.encode())
mod_request = client_socket.recv(2048).decode()
print(mod_request)
client_socket.close()
这是我得到的,
HTTP/1.1 400 Bad Request
Date: Sat, 08 Feb 2020 20:53:36 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 328
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.29 (Ubuntu) Server at 2605:fd00:4:1000:f816:3eff:fe1e:9b1a Port 80</address>
</body></html>
我目前被困在这里,我只能使用 socket 和 sys 模块,所以其他第三方库在这里提供帮助。
如果有人能指出我哪里出错了,我将不胜感激,如果有人有任何计算单词的技巧。
提前致谢!
... not understood with correct format?
这不是正确的格式,即您在提问时最初的假设是错误的。服务器将其视为错误请求是正确的。
request = ''' GET / tests/a.html HTTP/1.1
HOST: 162.246.156.195
IF-MODIFIED-SINCE: <>
Conncection: keep-alive
'''
首先,您的请求以 <space>GET ...
开头,而不是 GET ...
。然后你在路径组件中有一个 space,即 /<space>test/a.html
。然后使用简单的换行符 (\n
) 而不是 \r\n
作为行分隔符。 If-Modified-Since
字段中给出的时间无效。您的 Connection
字段在字段名称中有错别字。
请注意,HTTP 比您想象的要复杂得多,它看起来很简单,因为它只是基于文本,但它有许多需要了解的陷阱和细节。如果您不想让现有的库来处理复杂性,请阅读实际的 HTTP 标准(很长)并且不要从您看到的几个示例中猜测 HTTP 是如何工作的。
我正在尝试为作业设置一个 http 请求以连接到网络服务器并计算给定单词在页面中出现的次数。我正在处理这个的前半部分,每次我尝试发送带有最后修改日期的 header 信息请求时,它都会返回一个 400 错误请求错误
import socket,sys
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('162.246.156.195', 80)
client_socket.connect(server_address)
request = ''' GET / tests/a.html HTTP/1.1
HOST: 162.246.156.195
IF-MODIFIED-SINCE: <>
Conncection: keep-alive
''';
client_socket.send(request.encode())
mod_request = client_socket.recv(2048).decode()
print(mod_request)
client_socket.close()
这是我得到的,
HTTP/1.1 400 Bad Request
Date: Sat, 08 Feb 2020 20:53:36 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 328
Connection: close
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.29 (Ubuntu) Server at 2605:fd00:4:1000:f816:3eff:fe1e:9b1a Port 80</address>
</body></html>
我目前被困在这里,我只能使用 socket 和 sys 模块,所以其他第三方库在这里提供帮助。 如果有人能指出我哪里出错了,我将不胜感激,如果有人有任何计算单词的技巧。 提前致谢!
... not understood with correct format?
这不是正确的格式,即您在提问时最初的假设是错误的。服务器将其视为错误请求是正确的。
request = ''' GET / tests/a.html HTTP/1.1
HOST: 162.246.156.195
IF-MODIFIED-SINCE: <>
Conncection: keep-alive
'''
首先,您的请求以 <space>GET ...
开头,而不是 GET ...
。然后你在路径组件中有一个 space,即 /<space>test/a.html
。然后使用简单的换行符 (\n
) 而不是 \r\n
作为行分隔符。 If-Modified-Since
字段中给出的时间无效。您的 Connection
字段在字段名称中有错别字。
请注意,HTTP 比您想象的要复杂得多,它看起来很简单,因为它只是基于文本,但它有许多需要了解的陷阱和细节。如果您不想让现有的库来处理复杂性,请阅读实际的 HTTP 标准(很长)并且不要从您看到的几个示例中猜测 HTTP 是如何工作的。