问题描述
我在 python 中的 TCP 客户端中发送数据,我遵循的教程告诉我发送这个:
<div class="parent">
<div class="Box functions"><span class="material-icons green">emoji_people</span><span>Remember including:
<ul>
<li>Your name.</li>
<li>Your nationality.</li>
<li>Your place of residence.</li>
<li>Your profession.</li>
<li>Your phone number.</li>
<li>Your email.</li>
</ul>
</span></div>
</div>
我尝试在此处查找有关格式的信息,但对 GET 实际请求的内容或此请求将发送回的数据感到困惑,以及回车和换行符的目的是什么?
解决方法
如果想在 Python 中编写低级 HTTP GET,那么您可以创建一个 TCP 套接字并选择性地编写带有标头参数的 GET 命令,然后读取响应。
HTTP 请求以请求行开始(例如 GET / HTTP/1.1 带有终止 CRLF 或“\r\n”)。请求行后跟零个或多个标头,每个标头以 CRLF 结尾。最终的 CRLF 序列标记请求行和 HTTP 请求的标头部分的结束,后跟可选的消息正文。请求结构在 HTTP 1.1 spec
的第 5 节中定义import socket
# host and port map to URL http://localhost:8000/
host = "localhost"
port = 8000
try:
sock = socket.socket()
sock.connect((host,port))
sock.sendall("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n".encode())
# keep reading from socket until no more data in response
while True:
response = sock.recv(8096)
if len(response) == 0:
break
print(response)
except Exception as ex:
print("I/O Error:",ex)
HTTP 响应的第一行是状态行,包括以 \r\n 终止的状态代码,后跟响应标头。
HTTP/1.1 200 OK\r\n
Content-type: text/plain\r\n
Content-length: 14\r\n
\r\n
This is a test
您需要解析状态行和标头以确定如何解码 HTTP 响应的消息体。
HTTP 响应的详细信息在 HTTP 1.1 Spec 的第 6 部分。
或者,requests 模块在简单的 API 中实现 HTTP 规范。
使用请求 API 进行 HTTP GET 的示例。
import requests
url = 'http://localhost:8000/'
response = requests.get(url)
print("Status code:",response.status_code)
print("Content:",response.text)