当前位置: 首页 > news >正文

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):wwwapiblog 等,可自定义。

    • 主域名(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
  • 关键元素

    • 方法:定义操作类型(如 GETPOSTPUTDELETE)。

    • URL路径:目标资源的路径(如 /api/users)。

    • HTTP版本:协议版本(如 HTTP/1.1 或 HTTP/2)。

2. 请求头(Headers)
  • 作用:传递客户端环境、数据类型、缓存策略等元数据。

  • 常见请求头

    Header示例作用
    HostHost: example.com目标服务器域名(HTTP/1.1 必需)
    User-AgentUser-Agent: Chrome/91.0客户端标识(浏览器或工具名称)
    AcceptAccept: application/json声明客户端可接收的响应数据类型
    Content-TypeContent-Type: application/json请求体的数据格式(如 POST 提交时必需)
    AuthorizationAuthorization: Bearer token123身份验证凭证(如 JWT Token)
3. 请求体(Body)
  • 适用方法POSTPUTPATCH 等需要提交数据的请求。

  • 常见数据格式

    • JSON{"username": "john", "age": 25}

    • Form Datausername=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(服务不可用)
    • 状态消息:人类可读的状态描述(如 OKNot Found)。

2. 响应头(Headers)
  • 作用:传递服务器信息、资源属性、缓存策略等。

  • 常见响应头

    Header示例作用
    Content-TypeContent-Type: text/html响应体的数据类型(必需)
    Content-LengthContent-Length: 1024响应体的字节长度
    ServerServer: Apache/2.4.1服务器软件信息
    Cache-ControlCache-Control: max-age=3600控制缓存行为(如缓存时间)
    Set-CookieSet-Cookie: sessionid=abc123设置客户端 Cookie
3. 响应体(Body)
  • 作用:服务器返回的实际数据(如 HTML、JSON、图片等)。

  • 示例

    • HTML 页面:<html><body>Hello World</body></html>

    • JSON 数据:{"id": 1, "name": "John"}


3.3 报文传输流程

  1. 客户端发送请求报文

    • 浏览器输入 URL → 生成请求报文 → 通过 TCP 连接发送到服务器。

  2. 服务器处理并返回响应报文

    • 解析请求 → 处理逻辑(如查询数据库)→ 生成响应报文 → 返回客户端。

  3. 客户端解析响应

    • 根据 Content-Type 渲染页面或处理数据(如执行 JavaScript)。


3.4 开发者工具查看示例(Chrome)

  1. 打开浏览器开发者工具(F12)→ Network 标签。

  2. 刷新页面 → 点击具体请求 → 查看 Headers 和 Response 面板。


3.5 关键注意事项

  1. 空行必须存在:分隔头部与体部,缺失会导致报文解析错误。

  2. 内容协商:通过 Accept 和 Content-Type 确保客户端与服务器数据格式一致。

  3. 幂等性GET 请求是幂等的(多次执行结果相同),POST 非幂等。

  4. 安全性:敏感数据(如密码)应通过 HTTPS 传输,避免明文暴露。


3.6 总结

  • 请求报文:定义客户端的行为(获取或提交数据)。

  • 响应报文:反馈服务器处理结果及返回数据。

  • 理解报文结构是调试 API、优化性能(如缓存控制)和解决跨域问题的关键基础。


3.7 关键状态码速查

状态码说明
200成功
201创建成功
400客户端请求错误
401未授权
403禁止访问
404资源不存在
500服务器内部错误

相关文章:

  • Redis for Windows 后台服务运行
  • 【6】深入学习http模块(万字)-Nodejs开发入门
  • javascript专题2 ---- 在 JavaScript 列表(数组)的第一个位置插入数据
  • 【Linux C】简单bash设计
  • 重返JAVA之路——面向对象
  • 论文:Generalized Category Discovery with Large Language Models in the Loop
  • 玩转ChatGPT:使用深入研究功能梳理思路
  • 最大公约数和最小倍数 java
  • 【Linux实践系列】:匿名管道收尾+完善shell外壳程序
  • redis linux 安装简单教程(redis 3.0.4)
  • Spring Boot(二十一):RedisTemplate的String和Hash类型操作
  • 基于XGBoost的异烟酸生产收率预测:冠军解决方案解析
  • 七大寻址方式
  • ubuntu 系统安装Mysql
  • 【代码安全】spotbugs编写自定义规则(一) 快速开始
  • 【数据可视化艺术·实战篇】视频AI+人流可视化:如何让数据“动”起来?
  • 每日OJ_牛客_ruby和薯条_排序+二分/滑动窗口_C++_Java
  • vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值。
  • C语言中常用的调试宏和函数总结(__LINE__、__FUNCTION__)
  • Swift的学习笔记(一)
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠
  • 国际博物馆日|在辽宁省博物馆遇见敦煌
  • 荣盛发展:新增未支付债务11.05亿元
  • 北邮今年本科招生将首次突破四千人,新增低空技术与工程专业
  • 在美国,为什么夏季出生的孩子更容易得流感?
  • 【社论】城市更新,始终以人为核心