Skip to content

HTTP 参数

本章概述了 HTTP 通信中使用的关键参数及其语法。理解这些参数对于构建有效的 HTTP 请求和响应,以及开发 HTTP 客户端或服务器至关重要。这些参数构成了 HTTP 消息的构建块,将在后续章节中详细介绍。

HTTP 使用 主版本号.次版本号 的编号方案来表示协议版本。版本号显示在 HTTP 消息的第一行(请求行或状态行)中。

语法: `HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT`
HTTP/1.1
HTTP/2
HTTP/3

注意:虽然 HTTP/2 和 HTTP/3 具有不同的传输格式(二进制帧),但它们在很大程度上保留了 HTTP/1.1 的语义,包括方法、状态码和首部。HTTP/2 请求在其内部表示中仍然有效地以 HTTP/2 开头,而 HTTP/3 则将其语义称为 HTTP/3。

统一资源标识符(URI,Uniform Resource Identifier)是用于标识或命名资源的紧凑字符序列。在 HTTP 的上下文中,URL(统一资源定位符,Uniform Resource Locator)是 URI 最常见的形式。

HTTP(S) URL 的通用语法: `URI = scheme ":" "//" host [ ":" port ] [ abs_path [ "?" query ]] [ "#" fragment ]`
  • scheme: http 或 https(出于安全考虑首选 https)。
  • host: 服务器的域名或 IP 地址。
  • port: 可选。对于 http 默认为 80,对于 https 默认为 443。
  • abs_path: 资源在服务器上的路径。如果为空,默认为 ”/”。
  • query: 可选。一系列键值对字符串,通常以 ’?’ 开头,并用 ’&’ 分隔。
  • fragment: 可选。引用资源内的特定部分,在客户端处理。

不在未保留字符集中的字符或具有特殊含义的字符必须进行百分比编码(percent-encoded)。

https://www.example.com/path/to/resource?name=test&lang=en#section1
等效形式 (scheme 和 host 不区分大小写,使用默认端口,路径规范化):
https://EXAMPLE.COM:443/path/to/resource?name=test&lang=en#section1

所有 HTTP 日期/时间戳必须表示为格林威治平均时间 (GMT),现在称为协调世界时 (UTC)。首选格式定义在 RFC 7231 中(该规范更新了 RFC 2616,引用了 RFC 1123,而 RFC 1123 更新了 RFC 822)。

首选格式: `IMF-fixdate = day-name "," SP date1 SP time-of-day SP "GMT"`
示例: `Sun, 06 Nov 1994 08:49:37 GMT`

虽然旧的 RFC(RFC 850,ANSI C 的 asctime() 格式)有时为了向后兼容而受支持,但现代实现应严格使用并期望 IMF-fixdate 格式(例如,Date、Expires、Last-Modified 首部)。

字符集(编码)指定字符如何表示为字节。对于 HTTP,UTF-8 是绝大多数占据主导地位且推荐使用的内容字符集。

Content-Type 首部的 charset 参数指示实体主体的字符编码。客户端可以使用 Accept-Charset 请求首部来指示它们可以理解哪些字符集,但由于 UTF-8 的普及,现在不太常见了。

Content-Type: text/html; charset=utf-8
Content-Type: application/json; charset=utf-8
// Old, less common example:
// Accept-Charset: utf-8, iso-8859-1;q=0.5

默认使用 US-ASCII 或 ISO-8859-1 是一种遗留行为;现代应用程序应明确使用并期望 UTF-8。

内容编码指示应用于实体主体上的转换(通常是压缩),在传输之前进行。这与字符编码不同。

响应中的 Content-Encoding 首部指定应用的编码。请求中的 Accept-Encoding 首部告知服务器客户端支持哪些内容编码。常见值包括 gzip、deflate 和 br(Brotli,提供更好的压缩)。identity 表示没有编码。

// Client request:
Accept-Encoding: gzip, deflate, br
// Server response:
Content-Encoding: br

compress (LZW) 编码基本已废弃。

HTTP 在 Content-Type(用于响应和请求主体)和 Accept(用于请求)首部中使用媒体类型(也称为 MIME 类型)来指定数据的性质和格式。

语法: `media-type = type "/" subtype *(";" parameter)`
参数通常是键值对,例如 `charset=utf-8`。

类型、子类型和参数名称不区分大小写。参数值可能区分大小写。

Content-Type: text/html; charset=utf-8
Content-Type: application/json
Content-Type: image/jpeg
Content-Type: application/xml
Content-Type: multipart/form-data; boundary=something
// Client request:
Accept: application/json, text/plain, */*

媒体类型在 IANA(互联网号码分配局,Internet Assigned Numbers Authority)注册。

HTTP 在 Content-Language(响应)和 Accept-Language(请求)首部中使用语言标签(由 BCP 47 定义,该规范包含了 RFC 5646 及其他规范)来指示内容的语言或用户偏好的语言。

语法: `language-tag = primary-tag *("-" subtag)`
标签不区分大小写。标签内不允许有空格。
Content-Language: en-US
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
常见标签包括:
'en' (英语)
'en-US' (英语,在美国使用)
'es-419' (西班牙语,适用于拉丁美洲和加勒比地区)
'zh-Hant' (使用繁体中文书写)

Accept-Language 中的 q 值(质量值)指示用户偏好程度(0.0 到 1.0)。