HTTP基本原理
URI和URL
URI全称为统一资源定位符,是用于唯一表示互联网上资源的字符串,可以把它理解为网络资源的身份证。
URL和URN是URI的两种实现方式。URL不仅标识资源,并且指定了访问该资源的方式。URN只是命名了资源,但没有指定如何访问它。在互联网中,都是使用URL多,使用URN少。
URL也有其统一的格式:
scheme://[username:password@]host[:port][/path][?query][#fragment]
其中中括号代表非必要部分。
- scheme:协议。也被称为protocol
- username,password:用户名和密码。
- hostname:主机地址。可以是域名或IP。
- port:端口。
- path:路径。
- query:查询。用于查询某类资源。如果有多个查询,则用&隔开。
- fragment:片段。是对资源描述的部分补充,可以理解为资源内部的书签。用作单页面路由和HTML锚点。
HTTP和https
http和https是超文本传输协议,是基于TCP的协议。
http请求过程
http请求过程:客户端发送请求给服务器,服务器解析这个请求,然后发送响应包给客户端,客户端对响应包里的页面源代码进行解析,进而将网页呈现出来。
请求消息
request,由四部分内容组成
- 请求方法
- 请求的网址
- 请求头
- 请求体
前两个就是请求行中的内容。
请求行 :请求方法 | 空格 | URL | 空格 | 协议版本 | \r\n
------
消息头 : 字段名:值\r\n
.
.
.
.
------
空行
------
消息体
请求方法
请求方法用于标识客户端请求服务端的方式,一般有get和post两种。
在浏览器输入url并回车,就发起了一个get请求,请求的参数包含在了url里。post请求一般会在提交表单时发起,数据通常以表单的形式传输,而不会体现在url中。
get和post的区别:
- get的请求参数包含在url中,参数可以url中看到:而post请求的url不会包含数据,而是存储在请求体中
- GET请求提交的数据最多只有1024字节,POST则没有限制。
登录和传输文件时都是用post方式。
请求的网址
它可以唯一确定客户端想请求的资源。
请求头
HTTP请求头(Request Headers)是客户端(如浏览器或应用程序)在发送HTTP请求时附加的元信息,用于向服务器传递请求的上下文、客户端能力、偏好设置等关键信息。它们以键值对的形式存在,对于服务器正确理解和处理请求至关重要。
请求头字段名 | 主要作用与说明 | 示例值或常见内容 |
---|---|---|
Host | 指定请求的目标服务器域名和端口(HTTP/1.1必需),在虚拟主机环境中尤为重要。 | Host: www.example.com:8080 |
User-Agent | 标识客户端软件信息(如浏览器类型、版本、操作系统)。服务器可据此返回适配内容。 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36... |
Accept | 告知服务器客户端能够处理的响应内容类型(MIME类型)及优先级。 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
Accept-Language | 指示客户端偏好的自然语言。 | Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7 |
Accept-Encoding | 指明客户端支持的内容压缩编码方式,用于减少传输数据量。 | Accept-Encoding: gzip, deflate, br |
Content-Type | 在POST、PUT等有请求体的方法中,指定请求体的媒体类型(MIME类型)。 | Content-Type: application/json Content-Type: application/x-www-form-urlencoded |
Content-Length | 在POST、PUT等有请求体的方法中,指明请求体的字节长度。 | Content-Length: 348 |
Authorization | 携带身份验证凭证,如Bearer Token或Basic认证信息。 | Authorization: Bearer eyJhbGciOiJ... |
Cookie | 将之前服务器通过Set-Cookie响应头设置的Cookie信息发送回服务器,常用于维持会话状态。 | Cookie: sessionId=abc123; username=john |
Referer | 表示当前请求的来源页面URL,可用于分析流量来源或进行安全判断(注意拼写是"Referer")。 | Referer: https://www.google.com/ |
Origin | 指示跨域请求的来源(协议+域名+端口),主要用于CORS场景。 | Origin: https://www.example.com |
Connection | 控制本次网络连接的行为,如keep-alive (保持连接)或close (关闭连接)。 |
Connection: keep-alive |
Cache-Control | 向服务器指示客户端希望的缓存行为。 | Cache-Control: no-cache Cache-Control: max-age=3600 |
请求头是请求的重要请求部分,在写爬虫时通常需要设定请求头。
请求体
其中的内容一般时POST请求中的表单数据。对于GET请求,一般为空。
请求头中的Conten-Type字段说明了请求体中资源的类型。Content-Length说明了请求体的大小
响应消息
是有服务器返回给客户端的数据。可以分为三个部分:
-
响应状态码
-
响应头
-
响应体
状态行:协议版本 | 空格 | 响应代号 | 空格 | 代号描述 | \r\n
消息头
.
.
.
.空行
消息体
响应状态码
HTTP 响应状态码是服务器对客户端请求处理结果的标识,由三位数字组成。第一位数字定义了状态码的类别,共分五类。了解状态码有助于快速定位和解决问题。
状态码 | 类别 | 状态码英文名 | 含义描述 | 常见场景 |
---|---|---|---|---|
100 | 信息响应 (1xx) | Continue | 服务器已收到请求部分,客户端应继续发送剩余部分。 | 客户端发送较大请求体前,先征询服务器意愿。 |
101 | Switching Protocols | 服务器应客户端请求,正在切换协议。 | 从 HTTP 升级到 WebSocket。 | |
200 | 成功 (2xx) | OK | 请求已成功处理。 | GET 或 POST 请求成功。 |
201 | Created | 请求成功且创建了新资源。 | POST 请求创建了新用户或新文章。 | |
204 | No Content | 请求成功,但响应无内容。 | DELETE 请求成功,或更新操作无需返回数据。 | |
206 | Partial Content | 服务器成功处理了部分 GET 请求。 | 大文件下载或断点续传。 | |
301 | 重定向 (3xx) | Moved Permanently | 请求的资源已永久移动到新位置。 | 网站更换域名。 |
302 | Found | 请求的资源临时从不同 URI 响应。 | 用户未登录时访问需认证页面,临时重定向到登录页。 | |
304 | Not Modified | 资源未修改,客户端可使用缓存。 | 协商缓存有效时。 | |
307 | Temporary Redirect | 临时重定向,且请求方法和消息主体不变。 | 临时维护时跳转,要求保持原请求方法(如 POST)。 | |
400 | 客户端错误 (4xx) | Bad Request | 请求语法错误,服务器无法理解。 | 参数错误、格式无效。 |
401 | Unauthorized | 请求需要身份验证。 | 未提供或无效的身份验证凭证(如 token)。 | |
403 | Forbidden | 服务器理解请求,但拒绝执行。 | 权限不足。 | |
404 | Not Found | 服务器找不到请求的资源。 | URL 地址错误、资源已删除。 | |
405 | Method Not Allowed | 请求方法(如 POST、GET)不被允许。 | 尝试用 PUT 方法访问只支持 GET 的接口。 | |
429 | Too Many Requests | 客户端发送请求过多。 | 服务器限流。 | |
500 | 服务器错误 (5xx) | Internal Server Error | 服务器内部错误,无法完成请求。 | 服务器代码异常、配置错误。 |
502 | Bad Gateway | 作为网关或代理的服务器从上游收到无效响应。 | 反向代理的后端服务无响应或返回无效信息。 | |
503 | Service Unavailable | 服务器暂时无法处理请求(过载或维护)。 | 服务器维护、临时过载。 | |
504 | Gateway Timeout | 网关或代理服务器未及时从上游收到响应。 | 后端服务处理超时。 |
希望这个表格能帮助你更好地理解和应用 HTTP 状态码。
响应头
HTTP 响应头是服务器在返回响应时附带的一系列字段,它们为客户端提供了如何处理响应的重要信息。下面是一个常见响应头字段及其作用的表格。
响应头字段 | 作用描述 | 常见示例值或说明 |
---|---|---|
Cache-Control | 控制缓存行为,指定资源是否可缓存及缓存时间。 | max-age=3600 (缓存1小时), no-cache (可缓存但需验证), no-store (禁止缓存) |
Content-Type | 指示响应体的媒体类型(MIME类型)和字符编码。 | text/html; charset=UTF-8 , application/json |
Content-Length | 指示响应体的字节长度。 | Content-Length: 348 |
Content-Encoding | 指示对响应体应用的编码方式,如压缩算法。 | gzip , deflate |
Content-Disposition | 建议浏览器如何处理内容,如内联显示或作为附件下载(可指定文件名)。 | attachment; filename="file.pdf" |
Date | 提供响应生成的日期和时间。 | Date: Wed, 21 Oct 2015 07:28:00 GMT |
Expires | 指定响应内容的过期时间(HTTP/1.0的缓存方式)。 | Expires: Thu, 01 Dec 1994 16:00:00 GMT |
Last-Modified | 指示资源的最后修改时间,用于缓存验证。 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
ETag | 提供资源的特定版本标识符,用于缓存验证和条件请求。 | ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" |
Location | 在重定向(3xx状态码)或创建新资源(201状态码)时,指定新资源的位置。 | Location: https://example.com/new-page |
Server | 描述处理请求的服务器软件信息。 | Server: Apache/2.4.1 (Unix) Server: nginx |
Set-Cookie | 由服务器发送,用于在客户端存储一条Cookie信息。 | Set-Cookie: sessionId=abc123; Path=/; HttpOnly |
Access-Control-Allow-Origin | 指定哪些外域可访问资源(跨源资源共享,CORS)。 | * (允许所有域), https://example.com (允许特定域) |
Connection | 控制本次传输完成后网络连接是保持开启还是关闭。 | keep-alive (保持连接), close (关闭连接) |
X-Frame-Options | 指示是否允许浏览器在 <frame> , <iframe> , <object> 中渲染页面,有助于防止点击劫持。 |
DENY (禁止), SAMEORIGIN (同源可嵌入) |
响应体
做爬虫请求网页时,要解析的内容就是响应体。
me>, ``, ``中渲染页面,有助于防止点击劫持。 |
DENY(禁止),
SAMEORIGIN` (同源可嵌入) |
响应体
做爬虫请求网页时,要解析的内容就是响应体。