URL结构、HTTP协议报文
目录
一、URL 结构
1.1 URL 组成解析
1.2 核心组件详解
1. 协议(Protocol)
2. 域名(Domain Name)
3. 端口(Port)
4. 资源路径(Path)
5. 查询参数(Query Parameters)
6. 锚点(Fragment)
7. URL 编码规范
二、HTTP 请求方法
2.1 常用方法对比
2.2 GET
2.3 POST
三、HTTP 协议报文剖析
3.1 请求报文结构
1. 请求行(Request Line)
2. 请求头(Headers)
3. 请求体(Body)
3.2 响应报文结构
1. 状态行(Status Line)
2. 响应头(Headers)
3. 响应体(Body)
3.3 报文传输流程
3.4 开发者工具查看示例(Chrome)
3.5 关键注意事项
3.6 总结
3.7 关键状态码速查
一、URL 结构
URL(Uniform Resource Locator,统一资源定位符,简称网址 )是用于定位互联网资源的字符串标识符。一个完整的 URL 由多个部分组成,每个部分承担不同的功能。
(资源指的是:网页,图片,数据,视频,音频等等)
1.1 URL 组成解析
1.2 核心组件详解
1. 协议(Protocol)
-
作用:定义客户端与服务器之间的通信规则。
-
常见协议:
-
HTTP(HyperText Transfer Protocol)
-
默认端口:80
-
明文传输,无加密,适用于非敏感信息传输。
-
-
HTTPS(HTTP Secure)
-
默认端口:443
-
基于 SSL/TLS 加密,确保数据传输安全性,现代网站强制要求。
-
-
其他协议:
ftp://
(文件传输)、mailto:
(邮件)、file://
(本地文件)等。
-
2. 域名(Domain Name)
-
作用:将可读的名称映射到服务器的 IP 地址(如
www.example.com
→93.184.216.34
)。标记服务器在互联网当中的方位。 -
结构:
-
子域名(Subdomain):
www
、api
、blog
等,可自定义。 -
主域名(Domain):
example.com
。 -
顶级域名(TLD):
.com
、.org
、.net
等。
-
-
示例:
https://api.example.com → 子域名是 "api"
3. 端口(Port)
-
作用:指定服务器上具体服务的访问入口(一台服务器可运行多个服务)。
-
默认端口:
-
HTTP → 80
-
HTTPS → 443
-
若未显式指定端口,浏览器自动使用协议默认端口。
-
-
示例:
http://example.com:3000 → 访问服务器的 3000 端口
4. 资源路径(Path)
-
作用:标识服务器上的具体资源位置(如文件路径或 API 端点)。
-
示例:
https://example.com/images/logo.png → 指向服务器上的图片文件 https://example.com/api/users → 指向用户数据的 API 端点
5. 查询参数(Query Parameters)
-
作用:向服务器传递附加数据,通常用于 GET 请求。(携带给服务器额外信息,让服务器返回我想要的某一部分数据而不是全部数据)
-
格式:以
?
开头,多个参数用&
分隔,键值对形式key=value
。 -
示例:
https://example.com/search?q=JavaScript&page=2
-
参数解析:
-
q=JavaScript
:搜索关键词 -
page=2
:第 2 页结果
-
-
-
编码处理:特殊字符(如空格、中文)需 URL 编码(如空格 →
%20
)。// JavaScript 编码示例 encodeURIComponent("前端开发"); // → "%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91"
6. 锚点(Fragment)
-
作用:定位页面内的特定位置(如 HTML 元素
id
),不会发送到服务器。 -
格式:以
#
开头。 -
示例:
https://example.com/docs#chapter2 → 跳转到文档的 "chapter2" 章节
7. URL 编码规范
-
特殊字符保留字:
!
、#
、$
、&
、+
、=
等需编码。 -
编码规则:使用
%
后跟十六进制 ASCII 码。空格 → %20 中文字符 → UTF-8 编码后转换(如 "中国" → %E4%B8%AD%E5%9B%BD)
二、HTTP 请求方法
2.1 常用方法对比
方法 | 幂等性 | 语义 | 数据位置 |
---|---|---|---|
GET | 是 | 获取资源 | URL |
POST | 否 | 创建资源 | Body |
PUT | 是 | 完整更新资源 | Body |
PATCH | 是 | 部分更新资源 | Body |
DELETE | 是 | 删除资源 | URL |
2.2 GET
-
作用:获取资源(查询数据)。
-
特点:
-
参数通过 URL 查询字符串(Query Parameters) 传递,格式为
?key1=value1&key2=value2
。 -
请求无请求体(Body),数据明文暴露在 URL 中,安全性较低。
-
有长度限制(浏览器对 URL 长度有限制,通常约 2000 字符)。
-
-
适用场景:
-
获取页面、图片、API 数据等非敏感信息。
-
搜索、分页、筛选等需要参数传递的操作。
-
-
示例:
https://api.example.com/users?page=1&limit=10
2.3 POST
-
作用:提交数据(创建或修改资源)。
-
特点:
-
参数通过 请求体(Body) 传递(支持 JSON、FormData、XML 等格式)。
-
数据在请求体中隐藏,安全性较高(尤其在 HTTPS 下)。
-
无严格长度限制(受服务器配置限制)。
-
-
适用场景:
-
用户登录、表单提交、文件上传等需提交敏感或大量数据的操作。
-
创建新资源(如新增用户、发布文章)。
-
例如多端要查看同一份订单数据,或者使用同一个账号进行登录,那订单/用户名+密码,就需要保存在服务器上,随时随地进行访问。
-
-
示例(JSON 格式):
{ "username": "john_doe", "password": "123456" }
三、HTTP 协议报文剖析
HTTP(HyperText Transfer Protocol)是客户端与服务器通信的核心协议。请求报文由客户端(如浏览器)发送,响应报文由服务器返回。两者均遵循严格的文本格式,包含元数据与数据内容。
3.1 请求报文结构
请求报文由四部分组成:请求行、请求头、空行、请求体。
GET /api/data?page=1 HTTP/1.1 ← 请求行
Host: example.com ← 请求头开始
User-Agent: Mozilla/5.0
Accept: application/json
Content-Type: application/json
← 空行(必须存在)
{"key": "value"} ← 请求体(仅某些方法存在,如 POST)
1. 请求行(Request Line)
-
格式:
<方法> <URL路径> <HTTP版本>
-
示例:
POST /submit-form HTTP/1.1
-
关键元素:
-
方法:定义操作类型(如
GET
、POST
、PUT
、DELETE
)。 -
URL路径:目标资源的路径(如
/api/users
)。 -
HTTP版本:协议版本(如
HTTP/1.1
或HTTP/2
)。
-
2. 请求头(Headers)
-
作用:传递客户端环境、数据类型、缓存策略等元数据。
-
常见请求头:
Header 示例 作用 Host
Host: example.com
目标服务器域名(HTTP/1.1 必需) User-Agent
User-Agent: Chrome/91.0
客户端标识(浏览器或工具名称) Accept
Accept: application/json
声明客户端可接收的响应数据类型 Content-Type
Content-Type: application/json
请求体的数据格式(如 POST 提交时必需) Authorization
Authorization: Bearer token123
身份验证凭证(如 JWT Token)
3. 请求体(Body)
-
适用方法:
POST
、PUT
、PATCH
等需要提交数据的请求。 -
常见数据格式:
-
JSON:
{"username": "john", "age": 25}
-
Form Data:
username=john&age=25
(对应Content-Type: application/x-www-form-urlencoded
) -
文件上传:
Content-Type: multipart/form-data
-
3.2 响应报文结构
响应报文由四部分组成:状态行、响应头、空行、响应体。
HTTP/1.1 200 OK ← 状态行
Server: nginx/1.18.0 ← 响应头开始
Content-Type: application/json
Content-Length: 29
Date: Fri, 15 Sep 2023 08:00:00 GMT
← 空行
{"message": "Success"} ← 响应体
1. 状态行(Status Line)
-
格式:
<HTTP版本> <状态码> <状态消息>
-
示例:
HTTP/1.1 404 Not Found
-
关键元素:
-
状态码:3 位数字代码,表示请求结果。
状态码 类别 常见示例 1xx 信息性响应 100(继续发送请求体) 2xx 成功 200(OK)、201(Created) 3xx 重定向 301(永久重定向)、304(未修改) 4xx 客户端错误 400(请求错误)、404(资源不存在) 5xx 服务器错误 500(内部错误)、503(服务不可用) -
状态消息:人类可读的状态描述(如
OK
、Not Found
)。
-
2. 响应头(Headers)
-
作用:传递服务器信息、资源属性、缓存策略等。
-
常见响应头:
Header 示例 作用 Content-Type
Content-Type: text/html
响应体的数据类型(必需) Content-Length
Content-Length: 1024
响应体的字节长度 Server
Server: Apache/2.4.1
服务器软件信息 Cache-Control
Cache-Control: max-age=3600
控制缓存行为(如缓存时间) Set-Cookie
Set-Cookie: sessionid=abc123
设置客户端 Cookie
3. 响应体(Body)
-
作用:服务器返回的实际数据(如 HTML、JSON、图片等)。
-
示例:
-
HTML 页面:
<html><body>Hello World</body></html>
-
JSON 数据:
{"id": 1, "name": "John"}
-
3.3 报文传输流程
-
客户端发送请求报文
-
浏览器输入 URL → 生成请求报文 → 通过 TCP 连接发送到服务器。
-
-
服务器处理并返回响应报文
-
解析请求 → 处理逻辑(如查询数据库)→ 生成响应报文 → 返回客户端。
-
-
客户端解析响应
-
根据
Content-Type
渲染页面或处理数据(如执行 JavaScript)。
-
3.4 开发者工具查看示例(Chrome)
-
打开浏览器开发者工具(F12)→ Network 标签。
-
刷新页面 → 点击具体请求 → 查看 Headers 和 Response 面板。
3.5 关键注意事项
-
空行必须存在:分隔头部与体部,缺失会导致报文解析错误。
-
内容协商:通过
Accept
和Content-Type
确保客户端与服务器数据格式一致。 -
幂等性:
GET
请求是幂等的(多次执行结果相同),POST
非幂等。 -
安全性:敏感数据(如密码)应通过 HTTPS 传输,避免明文暴露。
3.6 总结
-
请求报文:定义客户端的行为(获取或提交数据)。
-
响应报文:反馈服务器处理结果及返回数据。
-
理解报文结构是调试 API、优化性能(如缓存控制)和解决跨域问题的关键基础。
3.7 关键状态码速查
状态码 | 说明 |
---|---|
200 | 成功 |
201 | 创建成功 |
400 | 客户端请求错误 |
401 | 未授权 |
403 | 禁止访问 |
404 | 资源不存在 |
500 | 服务器内部错误 |