HTTP Header详解与工作机制完整笔记

深入理解HTTP头部字段的作用、格式及实际应用

HTTP Header Content-Type Content-Length

目录导航

一、HTTP Header概述

1 什么是Header?

Header(头部)是HTTP消息的元数据(Metadata)

  • 定义:数据里面的数据,描述数据本身的信息
  • 类比:就像游戏里面的游戏,描述游戏规则的信息
  • 作用:告诉接收方如何处理Body中的实际内容
2 Header vs Body
特性 Header Body
内容 元数据(描述信息) 实际数据
格式 键值对(key: value) 任意格式
位置 请求/响应的开头部分 Header之后
编码 通常为ASCII 可能是二进制

二、核心Header详解

1 Host - 服务器主机地址
作用机制:
Host: www.example.com

两个核心功能:

  • DNS查询:将域名转换为IP地址
  • 虚拟主机定位:同一IP上的多个服务器区分
2 DNS查询流程
  1. 客户端发起请求前完成
  2. 域名 → DNS服务器 → IP地址
  3. 域名是应用层概念,方便人类记忆
  4. 实际网络通信使用IP地址定位
3 虚拟主机场景

同一台物理服务器运行:

  • - www.example.com (网站)
  • - api.example.com (API服务)
  • - blog.example.com (博客)

Host Header告诉服务器:我要访问哪个服务

四、Content-Type - 内容类型

1 定义

告诉接收方Body中的数据是什么格式

2 text/html - HTML文本
Content-Type: text/html; charset=utf-8
  • 用途:网页内容
  • 特点:浏览器会解析并渲染成页面
3 application/x-www-form-urlencoded - 普通表单
Content-Type: application/x-www-form-urlencoded

first_name=John&last_name=Doe&age=25

Android Retrofit示例:

@FormUrlEncoded
@POST("users")
Call<User> createUser(
    @Field("first_name") String firstName,
    @Field("last_name") String lastName,
    @Field("age") int age
);
特点:
  • 纯文本表单数据
  • 键值对用&分隔
  • 值需要URL编码
4 multipart/form-data - 多部分表单
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"

JohnDoe
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="photo.jpg"
Content-Type: image/jpeg

[二进制文件数据]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Android Retrofit示例:

@Multipart
@POST("users/{id}/avatar")
Call<User> updateAvatar(
    @Path("id") String id,
    @Part MultipartBody.Part avatar
);

// 创建文件Part
File file = new File("photo.jpg");
RequestBody requestFile = RequestBody.create(
    MediaType.parse("image/jpeg"),
    file
);
MultipartBody.Part avatarPart = MultipartBody.Part.createFormData(
    "avatar", 
    file.getName(), 
    requestFile
);
特点:
  • 支持文件上传
  • 使用boundary分隔不同部分
  • 每个部分可以有自己的Content-Type
5 application/json - JSON数据
Content-Type: application/json

{
  "name": "John Doe",
  "email": "john@example.com",
  "age": 25
}

Android Retrofit配置:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create()) // JSON转换器
    .build();
特点:
  • Web API标准格式
  • 结构化数据
  • 易于解析和生成
6 单文件类型
Content-Type: image/jpeg    // JPEG图片
Content-Type: application/zip  // ZIP压缩包
Content-Type: application/pdf  // PDF文档

Android Retrofit示例:

@POST("users/{id}/avatar")
Call<User> updateAvatar(
    @Path("id") String id,
    @Body RequestBody avatar
);

// 创建RequestBody
File avatarFile = new File("avatar.jpg");
RequestBody avatarBody = RequestBody.create(
    MediaType.parse("image/jpeg"),
    avatarFile
);

五、Content-Length - 内容长度

1 定义
Content-Length: 1024
  • 单位:字节(bytes)
  • 作用:告诉接收方Body的精确长度
2 为什么需要?
  • 问题:HTTP使用换行符分隔Header和Body
  • 风险:二进制数据可能包含换行符,导致意外截断
  • 解决方案:用Content-Length明确标识Body长度
3 示例
POST /upload HTTP/1.1
Host: example.com
Content-Type: text/plain
Content-Length: 13

Hello World!

六、Transfer-Encoding: chunked - 分块传输编码

1 适用场景

当Body长度无法预先确定时使用

2 工作机制
  • 不需要Content-Length
  • Body被分成多个块(chunks)
  • 每个块前面标明该块的长度(十六进制)
  • 最后用长度为0的块表示结束
3 Chunked格式详解
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/plain

7\r\n        ← 块长度(7字节,十六进制)
Hello W\r\n  ← 块数据
6\r\n        ← 下一个块长度
orld!\r\n    ← 块数据
0\r\n        ← 结束标志(长度为0)
\r\n         ← 结束后的空行
4 完整示例
POST /stream HTTP/1.1
Host: example.com
Transfer-Encoding: chunked
Content-Type: application/json

1A\r\n
{"status":"processing"}\r\n
1F\r\n
{"status":"completed","result":123}\r\n
0\r\n
\r\n
特点:
  • 适合流式传输
  • 服务器边生成边发送
  • 客户端可以边接收边处理

七、Location - 重定向地址

1 用途

服务器告诉客户端资源的新位置

2 使用场景
HTTP/1.1 302 Found
Location: https://new-location.com/resource
典型应用:
  • 资源迁移
  • POST后重定向(防止重复提交)
  • 负载均衡

八、User-Agent - 用户代理

1 定义
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
            AppleWebKit/537.36 (KHTML, like Gecko) 
            Chrome/120.0.0.0 Safari/537.36
2 包含信息
  • 浏览器类型:Chrome, Firefox, Safari
  • 操作系统:Windows, macOS, Linux, Android, iOS
  • 设备类型:桌面、手机、平板
  • 版本号:浏览器和引擎版本
3 应用场景
  • 服务器根据设备返回不同内容
  • 统计分析
  • 兼容性处理

九、Range / Accept-Range - 范围请求

1 断点续传机制
// 客户端请求部分内容
GET /large-file.zip HTTP/1.1
Range: bytes=0-1023

// 服务器响应部分内容
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/1048576
Content-Length: 1024
2 多线程下载示例
线程1: Range: bytes=0-1048575
线程2: Range: bytes=1048576-2097151
线程3: Range: bytes=2097152-3145727
3 Accept-Range响应头
Accept-Ranges: bytes    // 服务器支持范围请求
Accept-Ranges: none     // 服务器不支持范围请求

十、Cookie / Set-Cookie - Cookie管理

1 Cookie - 客户端发送
GET /profile HTTP/1.1
Cookie: session_id=abc123; user_prefs=dark_mode
2 Set-Cookie - 服务器设置
HTTP/1.1 200 OK
Set-Cookie: session_id=xyz789; Path=/; HttpOnly; Secure; SameSite=Strict
Set-Cookie: theme=light; Max-Age=3600; Path=/
3 Cookie属性详解
属性 说明
Path Cookie生效的路径
Domain Cookie生效的域名
Max-Age 过期时间(秒)
Expires 过期时间(日期)
Secure 仅HTTPS传输
HttpOnly 禁止JavaScript访问
SameSite 防止CSRF攻击

十一、Authorization - 授权信息

1 基本认证
Authorization: Basic dXNlcjpwYXNzd29yZA==
// Base64编码的 username:password
2 Bearer Token(JWT)
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
3 OAuth 2.0
Authorization: Bearer ACCESS_TOKEN

十二、其他重要Header

1 Accept系列 - 客户端能力声明
Accept - 可接受的内容类型:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

q参数表示优先级(0-1)

Accept-Charset - 可接受的字符集:
Accept-Charset: utf-8, iso-8859-1;q=0.5
Accept-Encoding - 可接受的压缩格式:
Accept-Encoding: gzip, deflate, br
Accept-Language - 可接受的语言:
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
2 Content-Encoding - 内容压缩

服务器压缩响应:

HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html

[gzip压缩后的HTML内容]
常见压缩算法:
  • gzip - 最常用
  • deflate - 较老的压缩
  • br - Brotli,压缩率更高

十三、缓存机制详解

1 Cache vs Buffer 区别
特性 Cache(缓存) Buffer(缓冲)
目的 加速访问,避免重复请求 平衡生产消费速度
数据 已使用过的数据 待处理的数据
场景 网页、图片、API响应 视频播放、文件传输
策略 过期时间、验证机制 先进先出、大小限制
2 缓存工作原理
1. 新鲜度检查:
  1. 客户端请求资源
  2. 检查本地缓存是否过期
  3. 未过期 → 直接使用缓存
  4. 已过期 → 向服务器验证
2. 验证机制:
// 客户端发送验证请求
GET /resource HTTP/1.1
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
If-None-Match: "abc123"

// 服务器响应
HTTP/1.1 304 Not Modified  // 资源未修改,使用缓存
// 或
HTTP/1.1 200 OK            // 资源已修改,返回新内容
3 Cache-Control 详解
请求指令:
Cache-Control: no-cache        // 强制验证
Cache-Control: no-store        // 不缓存
Cache-Control: max-age=3600    // 最大缓存时间
响应指令:
Cache-Control: public          // 可被任何缓存存储
Cache-Control: private         // 仅用户私有缓存
Cache-Control: max-age=86400   // 缓存有效期(秒)
Cache-Control: must-revalidate // 过期后必须验证
常用组合:
// 静态资源(图片、CSS、JS)
Cache-Control: public, max-age=31536000

// HTML页面
Cache-Control: no-cache, must-revalidate

// 敏感数据
Cache-Control: no-store, private

十四、实际应用示例

1 Android Retrofit完整示例
1. 普通表单提交:
public interface ApiService {
    @FormUrlEncoded
    @POST("users/register")
    Call<ResponseBody> registerUser(
        @Field("username") String username,
        @Field("password") String password,
        @Field("email") String email
    );
}
2. JSON数据提交:
public interface ApiService {
    @POST("users")
    Call<User> createUser(@Body User user);
    
    // 配置Gson转换器
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
}
3. 文件上传:
public interface ApiService {
    @Multipart
    @POST("users/{id}/avatar")
    Call<User> uploadAvatar(
        @Path("id") String userId,
        @Part MultipartBody.Part avatar,
        @Part("description") RequestBody description
    );
}

// 使用示例
File file = new File("avatar.jpg");
RequestBody requestFile = RequestBody.create(
    MediaType.parse("image/jpeg"),
    file
);
MultipartBody.Part avatarPart = MultipartBody.Part.createFormData(
    "avatar",
    file.getName(),
    requestFile
);
RequestBody desc = RequestBody.create(
    MediaType.parse("text/plain"),
    "Profile picture"
);
4. 带查询参数:
@GET("users")
Call<List<User>> getUsers(
    @Query("page") int page,
    @Query("limit") int limit,
    @Query("sort") String sort
);

// 实际请求: GET /users?page=1&limit=20&sort=name

十五、Header最佳实践

1 安全性
// 防止XSS
Content-Security-Policy: default-src 'self'

// 防止点击劫持
X-Frame-Options: DENY

// 防止MIME类型嗅探
X-Content-Type-Options: nosniff

// 启用HTTPS
Strict-Transport-Security: max-age=31536000
2 性能优化
// 启用Gzip压缩
Accept-Encoding: gzip, deflate, br

// 使用HTTP/2
Connection: Upgrade, HTTP2-Settings

// 预连接
Link: ; rel=preload; as=style
3 跨域处理
// CORS响应头
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400

十六、快速参考表

1 常用Content-Type速查
类型 用途 示例
text/html HTML页面 网页
application/json JSON数据 API响应
application/xml XML数据 RSS
application/x-www-form-urlencoded 表单数据 登录表单
multipart/form-data 文件上传 头像上传
image/jpeg JPEG图片 照片
application/pdf PDF文档 报告
application/zip ZIP压缩包 下载包
2 状态码与Header配合
场景 状态码 关键Header
重定向 301/302 Location
缓存命中 304 ETag, Last-Modified
认证失败 401 WWW-Authenticate
跨域请求 200 Access-Control-*
文件下载 200 Content-Disposition

十七、总结

1 HTTP Header的核心作用
  • 元数据描述- 告诉接收方如何处理Body
  • 协议协商- 客户端和服务器的能力匹配
  • 状态管理- Cookie、Session等
  • 性能优化- 缓存、压缩、分块传输
  • 安全控制- 认证、授权、CORS