前言:HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于在互联网上传输超文本的协议 --由一个请求和响应组成,一个完整的 HTTP 请求由请求行(Request Line)、请求头(Headers)和可选的请求体(Body)组成,一个 HTTP 响应由状态行(Status Line)、响应头(Headers)和响应体(Body)组成。
1 HTTP请求
Request Line<CRLF>
Header-Name: header-value<CRLF>
Header-Name: header-value<CRLF>
//一个或多个,均以<CRLF>结尾
<CRLF>
body//请求正文
1.1 请求行
以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下
Method Request-URI HTTP-Version CRLF
1.1.1 请求方法
其中Method表示请求方法,主要有这些方法:
请求方法 | 描述 |
---|---|
GET | 请求获取由 Request - URI 所标识的资源 |
POST | 在 Request - URI 所标识的资源后附加新的数据 |
HEAD | 请求获取由 Request - URI 所标识的资源的响应消息报头 |
PUT | 请求服务器存储一个资源,并用 Request - URI 作为其标识 |
DELETE | 请求服务器删除 Request - URI 所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
** 使用场景**
- GET :访问网页:当你在浏览器的地址栏输入一个 URL 并回车时,浏览器会向服务器发送一个 GET 请求,请求该 URL 对应的网页资源。例如,访问 https://www.example.com。
搜索数据:在搜索引擎中输入关键词进行搜索时,浏览器会将关键词作为查询参数附加在 URL 后面,向服务器发送 GET 请求。例如,https://www.google.com/search?q=apple。 - POST:用户在网站的注册或登录表单中输入用户名、密码等信息,点击提交按钮后,浏览器会向服务器发送一个 POST 请求,将用户输入的数据发送到服务器进行处理。
上传文件:当用户在网页上选择一个文件并点击上传按钮时,浏览器会使用 POST 请求将文件数据发送到服务器。 - HEAD :检查资源是否存在:在下载文件之前,可以先使用 HEAD 请求检查文件是否存在,以及文件的大小和修改时间等信息。
缓存验证:浏览器可以使用 HEAD 请求检查服务器上的资源是否有更新,从而决定是否需要重新下载资源。 - PUT方法:更新用户信息:用户在网站上修改自己的个人信息后,浏览器会使用 PUT 请求将更新后的信息发送到服务器,更新服务器上存储的用户信息。
文件上传与替换:将本地的文件上传到服务器指定的位置,如果该位置已经存在文件,则替换该文件 - DELETE 方法:删除用户账户:用户在网站上选择删除自己的账户时,浏览器会向服务器发送一个 DELETE 请求,请求服务器删除该用户的账户信息。
删除文件:在文件管理系统中,用户选择删除某个文件时,系统会使用 DELETE 请求将该文件从服务器上删除。
其他三个不常用
1.1.2 Request-URI
**Request-URI(请求统一资源标识符)**是用于指定客户端所请求资源的字符串。它就像是在互联网这个庞大的资源库中定位特定资源的 “地址”,帮助服务器明确客户端想要获取或操作的具体内容 。
组成部分
- 路径:这是 Request - URI 的核心部分,用于指定服务器上资源的具体位置。它以 “/” 作为分隔符,代表了资源在服务器文件系统或应用程序中的层级结构。例如,/products/list.html表示服务器上 “products” 目录下的 “list.html” 文件。
- 查询字符串:位于路径之后,以 “?” 开头,由一系列键值对组成,用于向服务器传递额外的参数信息。多个键值对之间用 “&” 分隔。例如,/search?q=python&category=books中,“q=python” 和 “category=books” 是两个查询参数,分别表示搜索关键词为 “python”,搜索类别为 “books”。服务器可以根据这些参数来执行相应的搜索逻辑,返回符合条件的结果。
- 片段标识符(Fragment Identifier):以 “#” 开头,通常用于指定网页内的特定位置或元素。例如,/article.html#section2表示请求 “article.html” 页面,并定位到页面中 “section2” 标识的位置。不过,片段标识符通常不会被发送到服务器,而是由浏览器在客户端根据其指示进行页面内的导航操作
作用
- 定位资源:服务器根据 Request - URI 来查找并返回相应的资源。它就像是资源的 “地址”,让服务器能够准确地找到客户端所请求的文件、数据或执行特定的操作。例如,客户端请求/api/users/123,服务器就会明白需要获取 ID 为 123 的用户信息。
- 传递参数:通过查询字符串,客户端可以向服务器传递各种参数,以便服务器根据这些参数来定制响应。比如在搜索功能中,客户端通过 Request - URI 传递搜索关键词、排序方式、结果数量等参数,服务器根据这些参数进行相应的搜索和数据处理,然后返回符合要求的结果。
- 支持 RESTful API:在 RESTful 架构的 API 中,Request - URI 被广泛用于表示不同的资源和操作。例如,GET /api/products可以表示获取所有产品资源,POST /api/products用于创建新的产品资源,PUT /api/products/123用于更新 ID 为 123 的产品资源,DELETE /api/products/123用于删除该产品资源。通过这种方式,Request - URI 不仅定位了资源,还暗示了对该资源要执行的操作,使得 API 的设计更加清晰和规范。
1.2.3 Version
“HTTP - Version” 表示客户端使用的 HTTP 协议版本",常见的有 HTTP/1.1、HTTP/2 .
例如,一个完整的 HTTP 请求行可能看起来像这样:
GET /index.html HTTP/1.1
GET” 是方法,“/index.html” 是 Request - URI,“HTTP/1.1” 是 HTTP 版本
1.2 请求头
请求头是 HTTP 请求消息中的一部分,位于请求行(包含方法、Request - URI 和 HTTP - Version)之后,请求体之前。它由一系列的键值对组成,用于向服务器传递关于请求的附加信息,例如客户端的身份、请求的资源类型、期望的响应格式等。以下是一些常见的请求头字段及其作用
1.3 请求体
请求体是 HTTP 请求消息中的一部分,位于请求头之后,通常用于向服务器发送额外的数据。以下是关于请求体的详细介绍:
通用请求头字段
- Cache - Control:用于指定缓存相关的指令,如no - cache表示不使用缓存,max - age = 3600表示缓存有效期为 3600 秒。
- Connection:用于指定连接的管理方式,如keep - alive表示保持连接,以便在多个请求之间重用连接,提高性能;close表示请求完成后关闭连接。
- Date:表示请求发送的日期和时间。
请求实体头字段
- Content - Type:指定请求体中数据的类型,如application/json、application/x - www - form - urlencoded、multipart/form - data等。
- Content - Length:指定请求体的长度(以字节为单位)。
- Content - Encoding:用于指定请求体的编码方式,如gzip、deflate等,表示请求体数据经过了相应的压缩算法处理。
客户端请求头字段
- Accept:告诉服务器客户端能够接受的响应内容类型,如Accept: text/html, application/xhtml + xml, application/xml;q = 0.9, /;q = 0.8,表示客户端优先接受 HTML、XHTML 和 XML 格式的响应,其次是其他任意类型的响应。
- Accept - Encoding:指定客户端能够接受的响应内容的编码方式,如gzip、deflate等,用于告知服务器可以对响应数据进行压缩以减少传输量。
- Accept - Language:表示客户端期望的响应语言,如Accept - Language: en - US, en;q = 0.5,表示客户端优先接受美式英语,其次是其他英语变体。
- User - Agent:包含了客户端的相关信息,如浏览器类型、版本、操作系统等,例如User - Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.138 Safari/537.36,服务器可以根据这个字段来为不同的客户端提供不同的响应或进行特定的处理。
- Cookie:用于在客户端和服务器之间传递会话相关的信息。客户端会在请求头中包含之前从服务器接收到的 Cookie,服务器可以根据这些 Cookie 来识别用户身份、跟踪用户会话等。
1.3请求头
作用
- 提交数据:最主要的作用是向服务器提交数据。比如在用户注册、登录、发表评论、上传文件等操作中,需要将用户输入的信息、文件内容等数据发送到服务器,这些数据就包含在请求体中。
- 支持复杂操作:对于一些需要大量数据传输或复杂操作的场景,如提交表单数据、发送 JSON 格式的配置信息、上传二进制文件等,请求体提供了一种有效的方式来传递这些数据,使服务器能够根据这些数据进行相应的处理。
数据格式
- 表单数据:通常在提交 HTML 表单时使用,数据以键值对的形式表示,例如username=john&password=123456。多个键值对之间用 “&” 分隔。这种格式适用于简单的文本数据提交。
- JSON 数据:由于其轻量级和易于解析的特点,在现代 Web 应用程序中被广泛用于传递结构化数据。例如:
{
"name": "John Doe",
"age": 30,
"email": "johndoe@example.com"
}
- 二进制数据:用于上传文件,如图像、视频、文档等。在这种情况下,请求体包含的是文件的二进制内容,服务器需要根据文件类型和相关的处理逻辑来正确接收和保存这些数据。
相关请求头字段
- Content - Type:该请求头字段用于指定请求体中数据的类型。例如,Content - Type: application/json表示请求体中的数据是 JSON 格式;Content - Type: application/x - www - form - urlencoded表示是表单数据;Content - Type: multipart/form - data用于文件上传,它允许在一个请求中同时上传多个文件和其他表单数据。
- Content - Length:用于指定请求体的长度(以字节为单位)。服务器可以根据这个字段来确定何时接收完整个请求体的数据
实战
import requests
# 目标URL
url = 'https://example.com/api/login'
# 请求头
headers = {
'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.138 Safari/537.36',
'Content - Type': 'application/json',
'Accept': 'application/json',
'Connection': 'keep - alive'
}
# 请求体
data = {
'username': 'your_username',
'password': 'your_password'
}
# 发送POST请求
response = requests.post(url, headers=headers, json=data)
# 打印响应状态码和内容
print(response.status_code)
print(response.text)
响应
状态行:
位于响应消息的第一行,包含 HTTP 版本、状态码和原因短语。例如,HTTP/1.1 200 OK,其中HTTP/1.1是 HTTP 协议版本,200是状态码,OK是原因短语
。状态码表示服务器对请求的处理结果,常见的状态码有:
- 2xx 成功:如200 OK表示请求成功,服务器已成功处理请求并返回了相应的资源;201 Created表示请求已成功,并且服务器创建了一个新的资源。
- 3xx 重定向:如301 Moved Permanently表示请求的资源已被永久移动到新的 URL;302 Found表示请求的资源临时移动到新的 URL,客户端应使用新的 URL 再次发起请求。
- 4xx 客户端错误:如400 Bad Request表示客户端发送的请求有误,服务器无法理解;401 Unauthorized表示客户端未提供有效的身份验证信息,访问被拒绝;404 Not Found表示服务器找不到请求的资源。
- 5xx 服务器错误:如500 Internal Server Error表示服务器内部发生错误,无法完成请求;503 Service Unavailable表示服务器暂时无法处理请求,通常是由于服务器过载或正在维护。
响应头:
包含一系列键值对,用于提供关于响应的附加信息,例如:
- Content - Type:指定响应体中数据的类型,如text/html表示 HTML 页面,application/json表示 JSON 数据,image/jpeg表示 JPEG 图像等。
- Content - Length:指定响应体的长度(以字节为单位),以便客户端知道需要接收多少数据。
- Cache - Control:用于指定缓存相关的指令,如public表示响应可以被任何缓存存储;private表示响应只能被客户端缓存;no - cache表示不允许缓存。
- Set - Cookie:用于设置 Cookie,服务器通过这个字段将 Cookie 发送给客户端,客户端会在后续的请求中包含这些 Cookie。
- Location:在重定向响应中,用于指定客户端应重定向到的 URL。
响应体
是服务器返回给客户端的实际数据内容,可以是 HTML 页面、JSON 数据、XML 数据、图片、视频等各种类型的数据,具体取决于Content - Type字段的设置。例如,如果请求的是一个网页,响应体中就包含了该网页的 HTML 代码;如果请求的是一个 API 接口,响应体可能包含 JSON 格式的业务数据。
通俗易懂
假设你去一家图书馆借书,你向图书馆管理员提出借书的请求,这个过程就好比是客户端向服务器发送 HTTP 请求。而图书馆管理员根据你的请求,给你相应的回复,这就类似于服务器给客户端的 HTTP 响应。
比如说,你走到图书馆服务台对管理员说:“我想借一本名为《西游记》的书。” 这就是你的请求。过了一会儿,管理员对你说:“好的,这是你要的《西游记》。” 同时,管理员还告诉你一些其他信息,比如 “这本书可以借一个月”“请爱护书籍” 等。这里,管理员说 “好的,这是你要的《西游记》” 就相当于 HTTP 响应中的响应体,是你真正想要的内容;而 “这本书可以借一个月”“请爱护书籍” 等信息就像是响应头,提供了关于这本书的一些附加信息。