http协议理解
文章目录
- http协议理解
- 基本概念
- HTTP版本演变
- 版本编年史
- 版本对比
- 未来趋势
- HTTP请求/响应结构
- 请求报文
- 响应报文
- HTTP方法
- 分类对比
- 方法选择原则
- 必须遵守的约束
- 常见状态码
- HTTP头部字段
- HTTPS
- HTTPS 核心功能说明
- HTTPS 如何工作?
- HTTP特点
- 补充知识点
- 启用HTTP/2
- Nginx 中配置 HTTP/2 和 HTTP/1.1 协议的支持比较简单。
- URI vs URL 对比表
- 包含关系
- 常见问题
- 一句话总结
- URL编码
- 保留字符
- 非ASCII字符
- 空格字符
- 特殊符号
- 避免非法字符
http协议理解
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于客户端和服务器之间的通信。
基本概念
-
无状态协议:HTTP协议本身不保存客户端的状态信息
-
基于请求/响应模型:客户端发送请求,服务器返回响应
-
默认端口:80(HTTP)、443(HTTPS)
HTTP版本演变
版本编年史
- HTTP/0.9:1991年,极其简单
- 特定
- 极其简单,仅支持 GET 方法。
- 无请求头(Headers)、状态码或错误处理。
- 只能返回纯文本(HTML),不支持其他数据类型。
- 特定
- HTTP/1.0:1996年,RFC 1945
- 核心改进:
- 引入 请求头/响应头(Headers),支持元数据(如 Content-Type、User-Agent)。
- 支持多种 HTTP 方法(GET、POST、HEAD)。
- 新增 状态码(如 200 OK、404 Not Found)。
- 支持非 HTML 内容(如图片、CSS、JS)。
- 问题:
- 短连接:每个请求需重新建立 TCP 连接,性能差(“队头阻塞”)。
- 核心改进:
- HTTP/1.1:1997年,RFC 2616,当前主流版本
- 主要优化:
- 持久连接(Keep-Alive):默认复用 TCP 连接,减少开销。
- 管道化(Pipelining):允许连续发送多个请求(但响应必须按顺序返回,仍有队头阻塞)。
- 新增方法(PUT、DELETE、OPTIONS)。
- 支持 分块传输编码(Chunked Transfer Encoding)。
- 引入 Host 头,支持虚拟主机(一个 IP 托管多个网站)。
- 问题:
- 仍存在队头阻塞(Head-of-Line Blocking)。
- 头部冗余(无压缩)。
- 主要优化:
- HTTP/2:2015年,基于SPDY,性能优化
- 核心改进:
- 二进制协议:替代文本格式,解析更高效。
- 多路复用(Multiplexing):单个连接上并行传输多个请求/响应,彻底解决队头阻塞。
- 头部压缩(HPACK):减少冗余。
- 服务器推送(Server Push):主动推送资源(如 CSS/JS)。
- 局限:
- 仍依赖 TCP,可能受 TCP 拥塞控制影响。
- 核心改进:
- HTTP/3:2022年,基于QUIC协议
- 革命性变化:
- 弃用 TCP,改用 QUIC(基于 UDP,内置加密和低延迟特性)。
- 解决 TCP 队头阻塞:即使丢包,其他流(Stream)不受影响。
- 0-RTT 快速连接:减少握手延迟。
- 强制加密(TLS 1.3)。
- 优势:
- 更适合移动网络和高延迟环境(如视频会议、在线游戏)
- 革命性变化:
版本对比
版本 | 关键特性 | 传输层 | 主要问题 |
---|---|---|---|
HTTP/0.9 | 纯文本、无头、仅 GET | TCP | 功能极度有限 |
HTTP/1.0 | 引入头、状态码、多数据类型 | TCP | 短连接性能差 |
HTTP/1.1 | 持久连接、管道化、Host 头 | TCP | 队头阻塞、头部冗余 |
HTTP/2 | 二进制、多路复用、头部压缩 | TCP | TCP 层队头阻塞 |
HTTP/3 | QUIC 协议、0-RTT、无队头阻塞 | UDP | 需兼容旧基础设施 |
未来趋势
-
HTTP/3 普及:Chrome、Firefox、Cloudflare 等已支持,CDN 和服务器逐步适配。
-
WebTransport:基于 HTTP/3 的实时通信新标准(替代 WebSocket)。
-
更安全的默认设计:强制加密、减少中间人攻击风险。
HTTP请求/响应结构
请求报文
GET /index.html HTTP/1.1
Host: test2.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7,en-GB;q=0.6,zh-TW;q=0.5
Cookie: parking_session=cbec96c2-b409-49e4-89d5-75b06775cf2f; __gsas=ID=70377f8dd16186ac:T=1746675132:RT=1746675132:S=ALNI_MamU7p4bHmj2qhIFTC9_5Z3AO9XHg
If-None-Match: W/"681c1bd2-90f"
If-Modified-Since: Thu, 08 May 2025 02:49:54 GMT
-
请求行:方法(GET/POST等) + URI + 协议版本
-
请求头:多个键值对
-
空行
-
请求体(可选)
响应报文
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 08 May 2025 03:43:25 GMT
Content-Type: text/html
Content-Length: 323
Last-Modified: Thu, 08 May 2025 03:41:55 GMT
Connection: keep-alive
ETag: "681c2803-143"
Accept-Ranges: bytes<html>...</html>
-
状态行:协议版本 + 状态码 + 状态描述
-
响应头:多个键值对
-
空行
-
响应体
HTTP方法
分类对比
方法 | 描述 | 幂等性 | 安全性 | 可缓存性 | 请求体支持 | 示例 |
---|---|---|---|---|---|---|
GET | 获取指定资源 | ✔️ | ✔️ | ✔️ | ❌ | GET /users/1 获取ID为1的用户信息 |
POST | 提交数据到指定资源(通常导致状态变化或副作用) | ❌ | ❌ | △* | ✔️ | POST /users 创建新用户(请求体含JSON数据) |
PUT | 替换目标资源(完整更新) | ✔️ | ❌ | ❌ | ✔️ | PUT /users/1 全量更新ID为1的用户数据 |
DELETE | 删除指定资源 | ✔️ | ❌ | ❌ | △** | DELETE /users/1 删除ID为1的用户 |
HEAD | 获取与GET相同的响应头(不含响应体) | ✔️ | ✔️ | ✔️ | ❌ | HEAD /users 检查用户列表是否存在 |
OPTIONS | 获取目标资源支持的通信选项 | ✔️ | ✔️ | ❌ | ❌ | OPTIONS /users 返回Allow: GET,POST,HEAD |
PATCH | 对资源应用部分修改 | ❌ | ❌ | ❌ | ✔️ | PATCH /users/1 局部更新用户邮箱(请求体含{“email”:“new@example.com”}) |
说明
- 幂等性:指的是多次相同请求的结果是否一致。GET、PUT、DELETE、HEAD、OPTIONS通常是幂等的,而POST和PATCH通常不是。
- 安全性:指的是请求是否会改变服务器的状态。GET、HEAD、OPTIONS是安全的,而POST、PUT、DELETE、PATCH通常会改变服务器状态。
- 可缓存性:指的是请求是否可以被缓存。GET、HEAD、OPTIONS通常是可缓存的,而POST、PUT、DELETE、PATCH通常不是。
- 请求体支持:指的是该方法是否支持请求体。POST、PUT、PATCH支持请求体,而GET、DELETE、HEAD、OPTIONS通常不支持请求体。
方法选择原则
-
GET
-
用于 安全 且 幂等 的操作
-
示例:
GET /articles/123 GET /articles?category=tech
- 注意长度URL长度限制
-
浏览器:有严格限制 (2KB~64KB),行为统一性差
-
cURL方式: 更灵活但需注意服务器承受能力
-
始终优先用 POST 传输大数据,符合 HTTP 语义规范
-
因素 浏览器 (Chrome/Firefox) cURL URL 最大长度 约 2,048 字符 (实际因浏览器而异) 无硬性限制 (取决于操作系统) 查询参数限制 受 URL 长度限制 仅受终端缓冲区大小限制 头部总大小限制 通常 8KB~16KB 默认 无限制 (可自定义) -
-
HEAD
- 与 GET 请求类似,但只返回响应的头部信息,不包括主体内容
- 检查资源有效性:验证资源是否存在或是否已更新。
- 获取元数据:获取资源的大小、类型等信息。
- 性能优化:减少数据传输,快速获取响应时间。
- 避免重复下载:通过检查更新的标志来避免不必要的下载。
- 检查文件大小:确保下载大文件前有足够存储空间。
- 检查资源类型:获取资源的 MIME 类型,决定是否进一步处理。
- API 健康检查:检查 API 端点是否正常运行。
- 与 GET 请求类似,但只返回响应的头部信息,不包括主体内容
-
POST
-
用于 非幂等 的资源创建或触发处理流程
-
示例:
POST /articles Body: {"title":"HTTP指南", "content":"..."}
-
-
PUT
-
用于 完整替换 已知资源(需提供全部字段)
-
示例:
PUT /articles/123 Body: {"title":"更新标题", "content":"全新内容"}
-
-
PATCH
-
用于 部分更新(必须明确修改指令)
-
示例(JSON Patch格式):
PATCH /articles/123 Body: [{"op":"replace", "path":"/title", "value":"新标题"}]
-
-
DELETE
-
必须验证资源存在性(返回404或410)
-
示例:
DELETE /articles/123
-
-
OPTIONS
- 作用:用于查询服务器支持哪些 HTTP 方法及其他资源相关选项。
- 主要场景:
- 检查服务器支持的 HTTP 方法(如 GET、POST 等)。
- 跨域请求的预检(CORS)以确认是否允许跨域操作。
- 获取资源的支持功能(如是否支持 PATCH、部分更新等)。
- 响应内容:
- 服务器返回的 Allow 头部包含支持的 HTTP 方法。
- 在跨域请求中,返回有关 CORS 允许的跨域信息(如 Access-Control-Allow-Methods)。
必须遵守的约束
-
禁止 用GET修改状态(如GET /delete-user?id=1 ❌)
-
禁止 用POST替代PUT/PATCH(违反语义)
-
必须 在PUT/PATCH/DELETE中验证资源版本(通过If-Match或ETag)
常见状态码
状态码 | 类别 | 描述 | 常见场景 |
---|---|---|---|
100 | 1xx (信息性) | Continue - 请求已接收,客户端应继续发送请求 | 大文件上传时,服务器先确认是否接受 |
101 | 1xx (信息性) | Switching Protocols - 服务器同意切换协议(如HTTP→WebSocket) | WebSocket连接升级 |
200 | 2xx (成功) | OK - 请求成功 | 成功获取网页或API数据 |
201 | 2xx (成功) | Created - 资源创建成功(通常伴随Location 头返回新资源路径) | POST /users 成功创建用户 |
204 | 2xx (成功) | No Content - 请求成功,但响应无正文 | DELETE /users/1 成功删除用户后返回 |
301 | 3xx (重定向) | Moved Permanently - 资源永久重定向(需更新书签) | 网站域名变更,旧URL跳转到新URL |
302 | 3xx (重定向) | Found - 资源临时重定向(浏览器继续用原URL请求) | 登录后跳转到首页 |
304 | 3xx (重定向) | Not Modified - 资源未修改(客户端可用缓存版本) | 浏览器缓存验证(If-Modified-Since 生效) |
400 | 4xx (客户端错误) | Bad Request - 请求语法错误 | 提交的JSON格式错误或缺少必填字段 |
401 | 4xx (客户端错误) | Unauthorized - 未认证(需提供有效凭证) | 未登录时访问需要权限的API |
403 | 4xx (客户端错误) | Forbidden - 服务器拒绝执行(权限不足) | 普通用户尝试访问管理员接口 |
404 | 4xx (客户端错误) | Not Found - 资源不存在 | 访问的URL未匹配到任何资源 |
500 | 5xx (服务器错误) | Internal Server Error - 服务器内部错误 | 后端代码抛出未捕获异常 |
502 | 5xx (服务器错误) | Bad Gateway - 网关/代理服务器收到无效响应 | Nginx反向代理的后端服务崩溃 |
503 | 5xx (服务器错误) | Service Unavailable - 服务不可用(临时过载或维护) | 服务器限流或停机维护 |
504 | 5xx (服务器错误) | Gateway Timeout - 网关超时 | 代理服务器在等待后端响应时超时 |
补充说明:
-
2xx 成功
-
200 OK:最常用的成功状态码,适用于GET/PUT/PATCH请求。
-
201 Created:需在响应头中返回Location: /new-resource-id。
-
204 No Content:适用于无需返回数据的操作(如DELETE)。
-
-
3xx 重定向
-
301 vs 302:前者用于永久重定向(SEO权重转移),后者用于临时跳转。
-
304:通过If-Modified-Since或ETag触发,减少带宽消耗。
-
-
4xx 客户端错误
-
400:笼统的客户端错误,应细化描述(如{“error”: “Missing ‘name’ field”})。
-
401 vs 403:前者表示未认证(需登录),后者表示已认证但权限不足。
-
404:也可用于隐藏敏感资源(如避免暴露用户是否存在)。
-
-
5xx 服务器错误
-
500:避免直接向用户暴露堆栈信息。
-
503:应在响应头中提供Retry-After: 120(秒)提示客户端重试时间。
-
HTTP头部字段
分类 | 头部字段 | 描述 | 示例/备注 |
---|---|---|---|
通用头部 | Date | 报文生成的日期和时间(GMT格式) | Date: Mon, 05 Feb 2024 08:00:00 GMT |
Cache-Control | 控制缓存行为(优先级高于Expires) | public, max-age=3600, no-store(禁止缓存) | |
Connection | 连接管理选项 | keep-alive(长连接), close(请求后关闭) | |
请求头部 | Host | 目标域名和端口(HTTP/1.1 强制要求) | Host: api.example.com:443 |
User-Agent | 客户端标识(浏览器/设备信息) | Mozilla/5.0 (Windows NT 10.0) | |
Accept | 声明客户端支持的响应类型 | Accept: application/json, text/html;q=0.8 | |
Accept-Charset | 客户端支持的字符集 | Accept-Charset: UTF-8, ISO-8859-1;q=0.8 | |
Accept-Encoding | 客户端支持的编码方式 | Accept-Encoding: gzip, deflate | |
Accept-Language | 客户端支持的语言列表 | Accept-Language: en-US, zh-CN;q=0.9, fr;q=0.7 | |
Cookie | 客户端存储的会话信息 | Cookie: session_id=abc123 | |
Authorization | 认证凭证(如Bearer Token) | Authorization: Bearer xxxxxx | |
Referer | 指示请求来源的 URL | Referer: https://example.com/page1 | |
响应头部 | Server | 服务器软件信息 | Server: nginx/1.18.0 |
Set-Cookie | 服务器设置的Cookie(可附加安全属性) | Set-Cookie: id=1; Path=/; Secure; HttpOnly; SameSite=Strict | |
Content-Type | 响应体的媒体类型和字符集 | Content-Type: text/html; charset=utf-8 | |
Access-Control-Allow-Origin | 允许跨域请求的源域名 | *(允许所有), https://example.com(特定域名) | |
实体头部 | Content-Length | 实体主体的字节长度(必须精确) | Content-Length: 1024 |
Content-Encoding | 实体内容的压缩编码方式 | gzip, br(Brotli) | |
Content-Disposition | 控制资源下载行为 | Content-Disposition: attachment; filename=“file.pdf” | |
缓存控制 | ETag | 资源版本标识符(用于条件请求) | ETag: “abc123” |
Last-Modified | 资源最后修改时间 | Last-Modified: Mon, 01 Jan 2024 00:00:00 GMT | |
Expires | 响应过期时间(HTTP/1.0遗留,优先级低于Cache-Control) | Expires: Tue, 06 Feb 2024 08:00:00 GMT | |
安全头部 | Strict-Transport-Security (HSTS) | 强制HTTPS连接 | max-age=31536000; includeSubDomains |
X-Content-Type-Options | 禁止MIME嗅探(防护XSS) | X-Content-Type-Options: nosniff | |
Content-Security-Policy (CSP) | 控制资源加载权限 | default-src ‘self’; script-src ‘unsafe-inline’ |
- 通用头部:这些头部字段可以出现在请求和响应中,控制连接和缓存等信息。
- 请求头部:包含了关于客户端的信息、请求的内容类型、请求的主机等信息。
- 响应头部:服务器在响应中发送的信息,描述了服务器软件、设置的 cookie 以及响应的内容类型等。
- 实体头部:描述了响应实体(内容)的大小和编码方式。
HTTPS
HTTPS 是 HTTP 的安全版本,通过 SSL/TLS 协议 在传输层对数据进行加密,确保通信的 机密性、身份真实性 和 数据完整性。以下是其核心机制和注意事项:
HTTPS 核心功能说明
功能 | 说明 |
---|---|
数据加密 | 传输内容通过 TLS/SSL 加密,防止第三方窃听敏感信息(如密码、信用卡号等)。 |
身份验证 | 通过数字证书验证服务器真实身份,防止中间人攻击(如假冒银行或钓鱼网站)。 |
数据完整性 | 使用消息认证码(MAC)确保数据在传输中未被篡改(如防止植入恶意代码或广告)。 |
- 加密算法:
- 对称加密(如 AES)用于加密数据
- 非对称加密(如 RSA)用于密钥交换
- 证书类型:
- DV(域名验证)
- OV(组织验证)
- EV(扩展验证)
- 完整性保护:
通过哈希算法(如 SHA-256)和 HMAC 实现
HTTPS 如何工作?
HTTPS 在 HTTP 和 TCP 之间加入 SSL/TLS 层,建立安全连接的过程如下:
-
步骤 1:SSL/TLS 握手(Handshake)
-
客户端发起请求
- 发送支持的加密套件(如 TLS_AES_256_GCM_SHA384)和随机数(Client Random)。
-
服务器响应
- 返回选择的加密套件、服务器证书(含公钥)和随机数(Server Random)。
-
证书验证
- 客户端验证证书是否由受信任的 CA(如 Let’s Encrypt)签发,并检查域名是否匹配。
-
密钥交换
- 客户端生成 预主密钥(Pre-Master Secret),用服务器公钥加密后发送。
-
生成会话密钥
- 双方通过 Client Random + Server Random + Pre-Master Secret 生成对称加密密钥。
-
-
步骤 2:加密通信
- 使用对称加密(如 AES)传输数据,效率高于非对称加密。
HTTP特点
-
简单快速:客户端向服务器请求服务时,只需传送请求方法和路径
-
灵活:允许传输任意类型的数据对象
-
无连接:每次连接只处理一个请求
-
无状态:对事务处理没有记忆能力
-
HTTP协议是现代Web应用的基石,理解HTTP协议对于Web开发、网络编程和安全都至关重要。
补充知识点
启用HTTP/2
在开发 HTML 页面时,不需要显式地声明使用的 HTTP 版本。HTTP 版本的选择由 Web 服务器和浏览器自动协商,并通过协议本身来处理。具体来说,HTTP 版本是由客户端(浏览器)和服务器在建立连接时通过以下过程确定的:
-
浏览器与服务器协商 HTTP 版本:当浏览器发送请求时,HTTP 请求头中会包含客户端支持的 HTTP 版本(如 HTTP/1.1 或 HTTP/2)。服务器接收到请求后,根据自身的配置选择支持的 HTTP 版本进行响应。
-
服务器的配置:服务器(如 Apache、Nginx 等)会根据其配置和支持的协议版本决定使用哪个 HTTP 版本。比如,某些服务器可能默认使用 HTTP/2,但也可以配置回退到 HTTP/1.1 或其他版本。
关键点:
- HTML 页面本身不需要声明 HTTP 版本,这与 HTML 或网页内容无关。
- HTTP 协议版本是由浏览器和服务器在请求/响应阶段自动决定的,只要它们都支持相应版本,HTTP 协议会在底层自动处理。
但是,若要确保使用最新版本的 HTTP 协议,网站开发者可以确保服务器配置支持并启用了所需版本(如 HTTP/2 或 HTTP/3)。
Nginx 中配置 HTTP/2 和 HTTP/1.1 协议的支持比较简单。
Nginx 在支持 HTTP/2 的情况下,可以根据客户端的支持自动协商协议版本。以下是配置 HTTP/2 和 HTTP/1.1 的步骤:
配置步骤
-
确保 Nginx 支持 HTTP/2:
- 确保你的 Nginx 版本至少是 1.9.5 或更高版本,因为 HTTP/2 是从这个版本开始支持的。
- 在 Nginx 编译时需要启用 --with-http_v2_module 模块。
-
修改 Nginx 配置文件:
- 在你的 Nginx 配置文件中(通常是 /etc/nginx/nginx.conf 或者每个站点的配置文件),你可以在 server 块中设置协议。
-
启用 HTTP/2 和 HTTP/1.1:
以下是一个示例配置,其中启用了 HTTP/2 和 HTTP/1.1。我们将 HTTP/2 配置为支持 HTTPS,同时 HTTP/1.1 作为回退。
server {listen 443 ssl http2; # 启用 HTTPS 和 HTTP/2server_name example.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/certificate.key;# 其他 SSL 配置ssl_protocols TLSv1.2 TLSv1.3; # 启用 TLS 1.2 和 TLS 1.3ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256';# 配置 HTTP/2# 注意:仅 HTTPS 连接才支持 HTTP/2root /var/www/html;# 配置其他内容...# 启用 HTTP/2http2;
}server {listen 80; # HTTP/1.1 配置server_name example.com;# 这里可以添加 HTTP/1.1 的相关配置# 比如重定向到 HTTPSreturn 301 https://$host$request_uri;
}
- 关键配置解释:
- listen 443 ssl http2;:启用 HTTPS 和 HTTP/2。http2 关键字告诉 Nginx 使用 HTTP/2 协议。
- ssl_certificate 和 ssl_certificate_key:配置 SSL 证书,确保安全连接。
- http2;:启用 HTTP/2 协议。
- listen 80;:监听 HTTP 协议端口,通常是 80。此配置为回退到 HTTP/1.1,可以选择将 HTTP 请求重定向到 HTTPS。
- 配置总结:
HTTP/2 仅支持 HTTPS:需要使用 SSL/TLS 才能启用 HTTP/2
。- HTTP/1.1 配置:可以通过 listen 80 配置 HTTP/1.1 协议,通常是用来处理未加密的 HTTP 请求并重定向到 HTTPS。
- 重启 Nginx 使配置生效:
- 修改完 Nginx 配置后,记得重新加载 Nginx 配置文件以使更改生效:
URI vs URL 对比表
概念 | 全称 | 定义 | 特点 | 示例 |
---|---|---|---|---|
URI (统一资源标识符) | Uniform Resource Identifier | 用于唯一标识某个资源的字符串,可以是资源的名称、位置或两者结合。 | - 范围更广,包含URL和URN - 不一定是可访问的地址 | urn:isbn:9780141036144(书的URN) https://example.com/api(URL也是URI) |
URL (统一资源定位符) | Uniform Resource Locator | 描述资源的具体位置和访问方式(如协议、路径等),是URI的子集。 | - 必须包含访问方式(如http://) - 可直接用于定位和获取资源 | https://www.example.com/index.html ftp://files.example.com/data.zip |
关键区别
包含关系
-
URI 是广义概念,包含 URL(定位资源)和 URN(命名资源)。
-
所有 URL 都是 URI,但并非所有 URI 都是 URL。
URI ├── URL(如 https://example.com) └── URN(如 urn:isbn:0451450523)
-
URN(统一资源名称)
- 属于URI的一种,通过唯一名称标识资源,但不提供访问方式。
术语 全称 定义 特点 示例 URN Uniform Resource Name 一种永久且唯一的资源标识符,属于URI的子集,通过名称而非位置标识资源。 - 持久性:资源位置变化时URN不变
- 唯一性:全局不重复
- 不可直接访问:需解析系统转换urn:isbn:9780141036144(书籍ISBN)
urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66(UUID)- URN 的命名空间:URN 遵循固定格式,由三部分组成:
urn:<命名空间>:<特定标识>
-
命名空间:定义标识类型(如isbn、uuid)。
-
特定标识:在命名空间内唯一的字符串。
-
示例:
- 图书ISBN号(国际标准书号):urn:isbn:0451450523
- 标准化文档(IETF标准文档):urn:ietf:rfc:3986
- 唯一ID(通用唯一标识符):urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
-
URL 的组成
一个完整的URL通常包括:https://www.example.com:443/path/to/page?query=value#section └─┬─┘ └─────┬──────┘ └┬┘ └───┬───┘ └───┬───┘ └──┬──┘协议 域名 端口 路径 查询参数 片段锚点
常见问题
-
URI 和 URL 哪个更常用?
日常开发中通常说 URL(因为大多数场景需要定位资源),但在技术规范(如HTTP协议)中更倾向使用 URI(因其涵盖范围更广)。 -
URN 有实际用途吗?
URN 常用于持久化标识(如ISBN、UUID),但需配合解析系统才能转换为可访问地址。
一句话总结
-
URI 是资源的“身份证”(唯一标识),URL 是资源的“住址”(如何找到它)。
-
当你说“网址”时,指的其实是 URL,而 URI 是更官方的术语。
URL编码
URL编码(也称为百分号编码)是将URL中不可直接使用的字符转换成可安全传输的格式的过程。因为在URL中有一些字符有特殊的含义,或者某些字符无法直接在URL中使用,所以需要对这些字符进行编码。下面是一些常见的原因:
保留字符
URL中有一些字符是保留的,并且具有特殊意义,如:
- ?、&、# 等,用于分隔查询参数、路径和片段标识符。
- =,用于连接键值对。
如果这些字符出现在数据中,而没有进行编码,浏览器可能会误解它们的用途,从而导致错误的解析。因此,需要对这些字符进行编码。
非ASCII字符
URL只允许使用ASCII字符(即标准的英文字符),例如字母、数字、以及一些符号(如 -、_、.、~)。而中文、特殊符号或其他非ASCII字符不能直接出现在URL中。为了确保这些字符能在URL中安全传输,需要将它们转换为其对应的百分号编码。
例如:
- 中文字符 “你好” 会被编码为 %E4%BD%A0%E5%A5%BD。
空格字符
空格在URL中是无效的,因为它会导致浏览器将URL分割成多个部分,可能导致错误。空格通常会被编码为 %20,或者有时会被替换为加号 +。
特殊符号
某些符号(如 /、:、@ 等)在URL中具有特殊含义。如果这些符号出现在数据中,需要进行编码以避免与URL结构混淆。例如,/ 被编码为 %2F,: 被编码为 %3A。
避免非法字符
URL中也不能包含一些非法字符,例如控制字符(ASCII码值小于32的字符),这些字符在网络传输中会导致问题,因此必须进行URL编码。
相关文章:
http协议理解
文章目录 http协议理解基本概念HTTP版本演变版本编年史版本对比未来趋势 HTTP请求/响应结构请求报文响应报文HTTP方法分类对比方法选择原则必须遵守的约束 常见状态码HTTP头部字段HTTPSHTTPS 核心功能说明HTTPS 如何工作? HTTP特点补充知识点启用HTTP/2Nginx 中配置…...
typecho中的Widget设计文档
组成系统的最基本元素 什么是Widget Widget是组成Typecho的最基本元素,除了已经抽象出来的类库外,其它几乎所有的功能都会通过Widget来完成。在实践中我们发现,在博客这种小型但很灵活的系统中实施一些大型框架的思想是不合适的,…...
使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant
文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…...
基于STM32、HAL库的CH340N USB转UART收发器 驱动程序设计
一、简介: CH340N是南京沁恒电子生产的一款USB转串口芯片,具有以下特点: 支持USB 2.0全速(12Mbps) 内置时钟,无需外部晶振 支持5V和3.3V电源电压 提供常用的MODEM联络信号 内置上电复位电路 支持Windows/Linux/Mac OSX等多平台驱动 体积小,SOP-8封装 二、硬件接口: CH…...
Spring Boot Controller 如何处理HTTP请求体
Spring Boot (通过Spring MVC) 提供了强大的机制来处理不同 Content-Type 的HTTP请求体。这主要依赖于 HttpMessageConverter 接口的各种实现,它们能够自动将请求体内容转换成Java方法参数。 一、核心机制:HttpMessageConverter Spring MVC会根据…...
【deepseek教学应用】001:deepseek如何撰写教案并自动实现word排版
本文讲述利用deepseek如何撰写教案并自动实现word高效完美排版。 文章目录 一、访问deepseek官网二、输入教案关键词三、格式转换四、word进一步排版 一、访问deepseek官网 官网:https://www.deepseek.com/ 进入主页后,点击【开始对话】,如…...
【Spring Boot 多模块项目】@MapperScan失效、MapperScannerConfigurer 报错终极解决方案
在使用 Spring Boot 构建多模块项目,集成 MyBatis-Plus 时,很多开发者会遇到类似如下启动报错: Error creating bean with name mapperScannerConfigurer ... Caused by: java.lang.IllegalArgumentException: Property basePackage is requ…...
vue 中如何使用region?
vue 中如何使用region? 在 Vue 文件中,你可以使用 //#region 和 //#endregion 注释来创建可折叠的代码区块(类似于 C# 的 region)。这可以显著提高大型 Vue 组件的可读性。 1. 基本用法 在 <script> 部分使用 <script&…...
Spring Boot 启动原理的核心机制
一、核心启动流程概览 Spring Boot 的启动流程可概括为 7 个关键阶段: 1. 加载启动类 (Main Class) 2. 初始化 SpringApplication 实例 3. 加载配置 & 准备环境 (Environment) 4. 创建 ApplicationContext(容器) 5. 刷新容器&#…...
【每天学习一点点】使用Python的pathlib模块分割文件路径
使用Python的pathlib模块分割文件路径 pathlib模块(Python 3.4)提供了面向对象的文件系统路径操作方式,比传统的os.path更加直观和易用。以下是使用pathlib分割文件路径的几种方法: 基本路径分割 from pathlib import Path# 创…...
Qt/C++面试【速通笔记八】—Qt的事件处理机制
在Qt中,事件处理机制是应用程序与用户或系统交互的核心。通过事件处理,Qt能够响应用户的输入、窗口的变化、定时器的触发等各种情况。 1. 事件循环(Event Loop) 在Qt应用程序中,事件循环是事件处理机制的基础。事件循…...
uniapp自定义步骤条(可二开进行调试)
前言 有一个业务需求是需要一个步骤条,但是发现开源的都不太合适,所以就自己写了一个。 开始 test.vue <template><view class"authenticateRecordDetails_container"><!-- 进度 --><view class"authenticateSte…...
uniapp|实现多终端聊天对话组件、表情选择、消息发送
基于UniApp框架,实现跨平台多终端适配的聊天对话组件开发、表情选择交互设计及消息发送,支持文本与表情混合渲染。 目录 聊天界面静态组件实现消息列表布局消息气泡双向布局辅助元素定位与样式静态数据模拟与扩展性设计表情选择器静态模块浮层实现符号网格排列多端样式适配方…...
1.3.1 Linux音频框架alsa详细介绍
ALSA作为对旧OSS系统的替代方案,始于1998年。当时OSS还闭源商业化,因此社区开始开发开源的ALSA。经过多年的发展,ALSA成为Linux内核中音频架构的标准。 结构和架构 ALSA由以下几个主要部分组成: 内核模块: 这是ALSA的…...
R 语言机器学习:为遥感数据处理开启新视角
技术点目录 基础理论、机器学习与数据准备建模与空间预测实践案例与项目了解更多 ——————————————————————————————————————————— 前言综述 在当今科技快速发展的时代,遥感技术为生态学研究提供了海量的数据资源…...
深度 |提“智”向新,奔向未来——当前机器人产业观察
机器人踏着“猫步”在T台走秀、进入工厂协助造车,教育、医疗、城市管理等领域都有了机器人的帮助……今天,机器人已得到广泛应用,走进你我的生活。 伴随着技术日新月异,机器人产业加快提“智”向新。特别是今年以来…...
Web开发-JavaEE应用SpringBoot栈ActuatorSwaggerHeapDump提取自动化
知识点: 1、安全开发-JavaEE-常见依赖-Actuator&Swagger 2、安全开发-JavaEE-安全问题-配置安全&接口测试 一、演示案例-WEB开发-JavaEE-监控依赖-SpringBoot&Actuator&配置安全 SpringBoot Actuator模块提供了生产级别的功能,比如健康…...
AI Agent开发之门:微软官方课程全面解析
AI Agent开发之门:微软官方课程全面解析 引言项目概览10 节核心课程内容详解1. AI 代理简介及应用场景2. 探索 AI Agentic 框架3. 理解 AI Agentic 设计模式4. 工具使用设计模式5. Agentic RAG(检索增强生成)6. 构建可信赖的 AI Agents7. 规划…...
Unity-Shader详解-其五
关于Unity的Shader部分的基础知识其实已经讲解得差不多了,今天我们来一些实例分享: 溶解 效果如下: 代码如下: Shader "Chapter8/chapter8_1" {Properties{// 定义属性[NoScaleOffset]_Albedo("Albedo", 2…...
从零打造个人博客静态页面与TodoList应用:前端开发实战指南
前言 在当今数字时代,拥有个人博客和高效的任务管理工具已成为开发者展示自我和提升生产力的标配。本文将带你从零开始,通过纯前端技术实现一个兼具个人博客静态页面和TodoList任务管理功能的综合应用。无论你是前端新手还是希望巩固基础的中级开发者&a…...
开发者如何优雅应对HTTPS抓包难题
开发者如何优雅应对HTTPS抓包难题:工具实战 深度解析 调试HTTPS接口这件事,真是程序员永远的痛。特别是在移动端、或者遇到客户端集成了第三方安全SDK的项目时,网络调试的门槛几乎成倍提升。你可能也遇到过:Charles不识别证书、…...
Ubuntu 安装远程桌面连接RDP方式
1. 安装 XFCE4 桌面环境 如果你的 Ubuntu 系统默认使用 GNOME 或其它桌面环境,可以安装轻量级的 XFCE4: sudo apt update sudo apt install xfce4 xfce4-goodies 说明:xfce4-goodies 包含额外的插件和工具(如面板插件、终端等&a…...
Ubuntu 22.04 出现 ‘Temporary failure resolving‘ 解决方案
a、使用apt 安装 resolvconf sudo apt-get install resolvconf b、使用 cd /etc/resolvconf/resolv.conf.d/ 进入文件夹,使用 ls 查看目录,会显示 base head tail c、使用 sudo vim base 编辑base文件, 进入时为空,添加 name…...
ubuntu 22.04 换源
参考:清华大学开源软件镜像站 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
Java并发编程几个问题的解答
目录 1、以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?2、早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序…...
JavaScript中数组和对象不同遍历方法的顺序规则
在JavaScript中,不同遍历方法的顺序规则和适用场景存在显著差异。以下是主要方法的遍历顺序总结: 一、数组遍历方法 for循环 • 严格按数组索引顺序遍历(0 → length-1) • 支持break和continue中断循环 • 性能最优,…...
C++ STL入门:set 集合容器
C STL入门:set 集合容器 一、核心特性与适用场景 set 是 C STL 提供的关联式容器,基于红黑树实现,具有两大核心特性: 特性表现形式底层原理元素唯一性重复值自动去重插入时进行二叉树键比对自动排序元素默认升序排列红黑树中序遍…...
[论文笔记] 超详细解读DeepSeek v3全论文技术报告
DeepSeek-V3是一个强大的专家混合(Mixture-of-Experts,MoE)语言模型,总共671B参数,每个token激活37B参数(可以理解为有多个专家,但每个token只会选择一部分专家进行推理,所以一个token的预测,只会用到37B参数),DeepSeek-V3 使用了 多头潜在注意力(...
JS 问号(?)运算符避免中间报错
一、场景 在前端开发过程中,有一些情况比如某些属性可能由于渲染数据的时机不同,一开始是null 或者undifine, 这样访问下面的属性的时候就会报错,我们可以给每个层级后面加个? 就可以避免这个错误。 let data {user: {profile: {name: &q…...
4:点云处理—去噪、剪切、调平
1.点云去噪 dev_clear_window ()dev_open_window(0, 0, 560, 560, black, WindowHandle)GenParamNames : [lut,intensity,light_position,disp_pose,alpha]GenParamValues : [color1,coord_z,0.0 0.0 -0.3 1.0,true,1]DispPose : [0,-0.0005,717.04,280,0,20,0]Instructions[0]…...
机器学习实操 第二部分 神经网路和深度学习 第17章 编码器、生成对抗网络和扩散模型
机器学习实操 第二部分 神经网路和深度学习 第17章 编码器、生成对抗网络和扩散模型 内容概要 第17章深入探讨了自编码器(Autoencoders)、生成对抗网络(GANs)和扩散模型(Diffusion Models)。这些模型能够…...
【今日三题】ISBN号码(模拟) / kotori和迷宫(BFS最短路) / 矩阵最长递增路径(dfs)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 ISBN号码(模拟)kotori和迷宫(BFS最短路)矩阵最长递增路径(dfs) ISBN号码(模拟) ISBN号码 #include <iostream> #incl…...
【记录】HunyuanVideo 文生视频工作流
HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作,包含环境配置、模型安装和工作流使用说明。 参考:https://comfyui-wiki.com/zh/install/install-comfyui/install-c…...
DevExpressWinForms-布局之TablePanel
布局之TablePanel 在 DevExpress 的控件库中,TablePanel 是一个功能强大且灵活的布局控件,它能够以表格形式组织和排列其他控件,让界面布局更加规整、有序。无论是开发复杂的企业级应用程序,还是设计简洁美观的用户界面ÿ…...
MySQL 数据库初体验
目录 1.1 数据库简介 1.1.1 使用数据库的必要性 1.1.2 数据库的基本概念 1.数据 2.数据库和数据库表 3.数据库管理系统和数据库系统 1.1.3 数据库发展史 1.数据库系统发展史 (1)初级阶段——第一代数据库 (2)中级阶段—…...
flink超时未揽收单量统计
应用场景: 双十一大屏统计 - - 订单超时汇总 项目指标概况: 应用背景:晚点超时指标,例如:出库超6小时未揽收订单量 难点:flink消息触发式计算,没有消息到达则无法计算,而这类指标…...
【造包工具】【Xcap】精讲Xcap构造分片包(IPv4、ipv6、4G\5G等pcap均可),图解超赞超详细!!!
目录 前言 1. XCap工具概念介绍 2. Xcap环境说明 2.1 新建报文组 2.2 导入数据包 2.3 查看报文组 2.4 复制删除报文组 3. 构造分片包 3.1 造普通/外层分片步骤: 3.2 造内层分片步骤 3.2.1 建立一个新报文 3.2.2 将组装的新报文分片 3.2.3 替换原始包内层…...
RabbitMQ学习(第二天)
文章目录 1、生产者可靠性①、生产者重连②、生产者确认 2、MQ可靠性①、数据持久化②、LazyQueue(惰性队列) 3、消费者可靠性①、消费者确认②、失败重试机制③、保证业务幂等性 总结 之前的学习中,熟悉了java中搭建和操作RabbitMQ发送接收消息,熟悉使用…...
旧版 Flutter 写的项目, 想要在新的环境上运行?
DeepSeek 给出的最佳实践 以下是针对拷贝 Flutter 项目到新环境运行的 完整检查清单和最佳实践,覆盖了环境配置、版本兼容性、依赖管理等多个关键点: 📋 完整检查清单 检查项操作方式/命令重要性1. Flutter SDK 版本flutter --version 对比…...
Flutter接入ProtoBuff和原生Android通信【性能最优】
Protocol Buffers(简称Protobuf)是由 Google 开发的一种结构化数据序列化框架,旨在实现高效的数据交换与存储。其核心特性及优势如下: 一、核心特性 跨语言与跨平台 支持多种编程语言(如 C、Java、Python、Dart …...
【MySQL】(10)用户和权限管理
一、应用场景 通常一个应用对应一个数据库,我们希望某个数据库只能被相关人员操纵,就需要创建用户并指定权限。只有登录该用户,才能在权限范围内操纵数据库。root 是权限最高的用户,它拥有所有的权限。 二、查询用户 在 mysql 数…...
学成在线之缓存
一:缓存 把白名单可以看到的信息和学生用户下的我的学习,我的选课等这些信息,存到缓存中,因为这些查询量比较大。 当查询时,先去检查缓存中是否有这个数据,如果有,就直接返回 如果没有&#…...
视频编解码学习8之视频历史
视频技术的发展历史可以追溯到19世纪,至今已跨越近200年。以下是视频技术发展的主要阶段和里程碑: 1. 早期探索阶段(19世纪-1920年代) 1832年:约瑟夫普拉托(Joseph Plateau)发明"费纳奇镜&…...
从装饰器出发,优雅处理 UI 自动化中的异常
二、装饰器核心原理:函数式编程的“语法糖” 在 UI 自动化测试的实际场景中,页面加载超时、元素定位失败、网络波动等异常问题频繁出现。传统的try-except嵌套方式虽然能捕获异常,但会导致业务代码与处理逻辑高度耦合,造成代码冗…...
华为首款鸿蒙电脑正式亮相
在2025年5月8日的鸿蒙电脑技术与生态沟通会上,华为终端BG平板与PC产品线总裁朱懂东发表演讲。鸿蒙办公将支持无缝协同(统一账户 / 多端同步)、智慧体验(鸿蒙 AI / 智慧交互)、融合生态(桌面生态 / 移动生态…...
森林生态学研究深度解析:R语言入门、生物多样性分析、机器学习建模与群落稳定性评估
在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...
需求分析阶段测试工程师主要做哪些事情
在软件测试需求分析阶段,主要围绕确定测试范围、明确测试目标、细化测试内容等方面开展工作,为后续测试计划的制定、测试用例的设计以及测试执行提供清晰、准确的依据。以下是该阶段具体要做的事情: 1. 需求收集与整理 收集需求文档&#x…...
IBM BAW(原BPM升级版)使用教程第五讲
结前篇! 一、服务:外部服务 在 IBM Business Automation Workflow (BAW) 中,外部服务(External Services)是指在流程中调用和集成外部系统或服务的组件。外部服务允许IBM BAW与其他业务系统、应用程序或第三方服务进行…...
一个用C#开发的记事本Notepads开源编辑器
从零学习构建一个完整的系统 推荐一个用C#开发的,模仿Nodepad的记事本编辑器。 项目简介 这是一个国人开发的,采用Fluent Design风格,支持Markdown语法及其预览,可以用于替代Windows自带记事本功能。 虽然它没有Nodepad、VS C…...
Office宏病毒钓鱼-打点突破
Office宏钓鱼 [攻击路径] / [利用流程] - 详细步骤:制作一个简单的Word宏钓鱼文档 步骤一:规划恶意宏功能 (Payload Design) 目的: 决定宏执行后要达成的目标。为教学演示,我们设定一个简单的目标:弹出一个消息框&…...