GET 请求的格式

问题描述

我在 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)