http 详细

142 阅读10分钟

一、HTTP 基础概念

1. 定义

  • HTTP 是一种 应用层协议,用于在客户端(如浏览器)和服务器之间传输超文本(如HTML、图片、视频等)。它是万维网(WWW)数据通信的基础。

2. 核心特性

  • 无状态:默认不保存客户端与服务器之间的交互状态(需通过 Cookie 或 Session 管理状态)。

  • 请求-响应模型:客户端发起请求,服务器返回响应。

  • 可扩展性:通过请求头、响应头和状态码支持灵活的功能扩展。

  • 基于文本(HTTP/1.x):早期版本使用明文传输(HTTP/2 及之后支持二进制格式)。

3. 协议依赖

  • 默认运行在 TCP/IP 协议之上,端口为 80(HTTP)  或 443(HTTPS)

  • 结合 DNS 解析域名,将 URL 转换为 IP 地址。

二、HTTP 核心概念

1. 请求组成


(1) 请求行
  • 位置:HTTP 请求的第一行。

  • 格式<方法> <请求目标> <HTTP版本>

  • 作用

    • 方法:定义客户端希望执行的操作(如 GETPOST、具体请看下面HTTP方法介绍)。

    • 请求目标:指定资源路径(如 /api/data)和查询参数(如 ?id=1)。

    • HTTP版本:声明使用的协议版本(如 HTTP/1.1)。

      • 常见版本

      • HTTP/1.0:早期版本,默认关闭连接复用。

      • HTTP/1.1(主流):支持持久连接、管道化、分块传输等。

      • HTTP/2:二进制协议、多路复用、头部压缩。

      • HTTP/3:基于 QUIC(UDP),解决队头阻塞。

  • 例子

        GET /api/data?id=1 HTTP/1.1
    
(2) 请求头
  • 位置:请求行之后,空行之前。

  • 格式字段名: 值

  • 作用:传递客户端信息、内容协商、身份验证等。

  • 常见请求头: (更多请看文档

    字段名示例值作用
    Hostexample.com指定目标服务器域名和端口
    User-AgentMozilla/5.0 ...标识客户端类型(浏览器/设备)
    Acceptapplication/json声明接受的响应格式
    Content-Typeapplication/json指定请求体的数据类型
    AuthorizationBearer eyJhbGci...携带身份验证令牌
    CookiesessionId=abc123发送服务器设置的 Cookie
    ExpiresWed, 21 Oct 2022 07:28:00 GMT强缓存 指定资源的绝对过期时间
    Cache-Control no-cache强缓存 优先级高于 Expires,常用指令:  max-age=3600:缓存有效期(秒)。 - no-cache:跳过强缓存,直接进入协商缓存。 - no-store:禁止任何缓存(完全禁用缓存)。 - public:允许代理服务器缓存资源。 - private:仅允许客户端缓存资源。
    If-Modified-Since Wed, 21 Oct 2022 07:28:00 GMT协商缓存 资源最后修改时间(精确到秒级)
    If-None-Match"abc123"协商缓存 资源唯一标识符(如哈希值),更精确(应对频繁修改或分布式系统)。第一次请求该参数空,通过第一次后端返回该参数,第二次
(3) 请求体
  • 位置:空行之后。

  • 格式:纯文本、JSON、表单数据、二进制等。

  • 作用:携带客户端提交的数据(如 POST 请求的表单、文件)。

  • 适用场景

    • POSTPUTPATCH 方法通常需要请求体。

    • GETHEADDELETE 一般不使用请求体。

  • 例子

    {"username": "123", "password": "123456"}
    

2. 响应组成


(1) 状态行
  • 位置:HTTP 响应的第一行。

  • 格式<HTTP版本> <状态码> <状态描述>

  • 作用

    • HTTP版本:服务器使用的协议版本。

    • 状态码:3位数字代码,表示请求处理结果。

    • 状态描述:对状态码的简要说明(如 OKNot Found

  • 例子

      HTTP/1.1 200 OK
    
(2) 响应头
  • 位置:状态行之后,空行之前。

  • 格式字段名: 值

  • 作用: 传递服务器信息、控制缓存、设置 Cookie 等。

  • 常见请求头: (更多请看文档

(2.1) 内容描述
字段名作用示例
Content-Type声明响应体的数据类型和字符编码(MIME类型)。Content-Type: text/html; charset=utf-8 Content-Type: application/json
Content-Length响应体的字节长度(适用于非分块传输)。Content-Length: 348
Content-Encoding声明响应体使用的压缩算法(如 gzip)。Content-Encoding: gzip
Content-Language声明响应内容的自然语言(如中文、英文)。Content-Language: zh-CN
(2.2) 缓存控制
字段名作用示例
Cache-Control控制客户端和代理服务器的缓存行为。Cache-Control: max-age=3600 Cache-Control: no-cache
Expires指定资源的绝对过期时间(HTTP/1.0)。Expires: Wed, 21 Oct 2022 07:28:00 GMT
ETag资源的唯一标识符(用于协商缓存)。ETag: "abc123"
Last-Modified资源的最后修改时间(用于协商缓存)。Last-Modified: Wed, 21 Oct 2022 07:28:00 GMT
(2.3) 安全与策略
字段名作用示例
Access-Control-Allow-Origin指定允许跨域请求的源(用于CORS)。Access-Control-Allow-Origin: * Access-Control-Allow-Origin: https://example.com
Content-Security-Policy定义内容安全策略(防御XSS攻击)。Content-Security-Policy: default-src 'self'
Strict-Transport-Security强制使用HTTPS(HSTS)。Strict-Transport-Security: max-age=31536000
X-Content-Type-Options禁止浏览器猜测内容类型(防MIME嗅探)。X-Content-Type-Options: nosniff
(2.4) 其他常用头
字段名作用示例
Location重定向目标URL(用于3xx状态码)。Location: https://new.example.com
Set-Cookie设置客户端的Cookie(用于会话管理)。Set-Cookie: sessionId=abc123; Path=/; Secure
Server标识服务器软件(如Nginx、Apache)。Server: nginx/1.18.0
Transfer-Encoding声明传输编码方式(如分块传输 chunked)。Transfer-Encoding: chunked
(3) 响应体
  • 位置:空行之后。

  • 格式HTML、JSON、图片、视频等。

    内容类型(Content-Type常见格式示例说明
    text/htmlHTML页面<html>...</html>
    application/jsonJSON数据{"status": "success", "data": {}}
    image/png二进制图片数据(无法直接显示为文本)
    application/octet-stream文件下载(二进制流)
    text/plain纯文本Hello World!
  • 作用:返回客户端请求的资源或处理结果,以及状态码。

3. http方法


方法作用幂等性安全性
GET获取资源(不修改服务器数据)
POST提交数据(如表单、文件上传)
PUT替换目标资源(全量更新)
DELETE删除指定资源
PATCH部分更新资源
HEAD获取资源的元信息(无响应体)
OPTIONS查询服务器支持的通信选项(如 CORS 预检)

4. 状态码


(4.1). 信息性状态码(1xx)
状态码名称说明场景示例
100Continue客户端应继续发送请求体(用于大文件上传前的预检)。客户端发送 Expect: 100-continue 头后,服务器返回 100。
101Switching Protocols服务器同意切换协议(如从 HTTP 切换到 WebSocket)。WebSocket 握手阶段。

(4.2). 成功状态码(2xx)
状态码名称说明场景示例
200OK请求成功,响应体中包含请求的资源。GET 请求返回 HTML 页面或 JSON 数据。
201Created资源已成功创建(通常用于 POST 或 PUT 请求)。创建新用户后返回 201 和新用户 URL。
204No Content请求成功,但响应体无内容(常用于 DELETE 或更新操作)。删除资源后返回空响应。
206Partial Content服务器返回部分内容(用于分块下载或断点续传)。视频流的分段传输。

(4.3). 重定向状态码(3xx)
状态码名称说明场景示例
301Moved Permanently资源已永久移动到新 URL(客户端应更新书签)。网站域名更换后旧域名跳转。
302Found资源临时移动到新 URL(客户端下次仍请求原 URL)。临时维护页面跳转。
304Not Modified资源未修改,客户端使用本地缓存(协商缓存验证)。缓存有效的资源请求。
307Temporary Redirect临时重定向(与 302 类似,但要求保持请求方法不变)。POST 请求的临时重定向。
308Permanent Redirect永久重定向(与 301 类似,但要求保持请求方法不变)。API 版本永久迁移。

(4.4). 客户端错误(4xx)
状态码名称说明场景示例
400Bad Request请求语法错误或参数无效(通用客户端错误)。JSON 请求体格式错误。
401Unauthorized未提供有效身份验证凭据(需登录或 Token)。访问需登录的页面未携带 Token。
403Forbidden服务器拒绝执行请求(权限不足)。普通用户尝试访问管理员页面。
404Not Found请求的资源不存在。访问不存在的 URL。
405Method Not Allowed请求方法不被允许(如对只读资源发送 POST)。对静态资源发送 DELETE 请求。
408Request Timeout服务器等待请求超时。客户端未在指定时间内发送完整请求。
429Too Many Requests客户端发送请求过多(限流)。API 调用频率超过限制。

(4.5). 服务器错误(5xx)
状态码名称说明场景示例
500Internal Server Error服务器内部错误(通用错误码,通常为代码异常)。未捕获的代码异常导致服务崩溃。
502Bad Gateway网关或代理服务器从上游服务器收到无效响应。Nginx 代理的后端服务无响应。
503Service Unavailable服务器暂时不可用(如维护或过载)。服务器重启或维护页面。
504Gateway Timeout网关或代理服务器未及时从上游服务器获取响应。后端服务响应超时。

(4.6). 特殊状态码
状态码名称说明
418I'm a teapot彩蛋状态码(来自愚人节玩笑 RFC 7168),无实际用途。
451Unavailable For Legal Reasons因法律原因不可访问(如政府审查)。

5. 其他参数详细介绍


  • (5.1) http 请求头 Content-Type 常见类型参数

    分类Content-Type 值描述示例/备注
    文本类型text/plain纯文本,无格式(如 .txt 文件)Content-Type: text/plain; charset=UTF-8
    text/htmlHTML 文档(网页内容)Content-Type: text/html
    text/cssCSS 样式表Content-Type: text/css
    text/csvCSV(逗号分隔值文件)Content-Type: text/csv
    text/javascript (已过时)JavaScript 代码(推荐改用 application/javascript旧代码可能仍在使用
    应用类型application/jsonJSON 格式数据,广泛用于 API 通信Content-Type: application/json; charset=UTF-8
    application/xmlXML 格式数据Content-Type: application/xml
    application/x-www-form-urlencoded表单默认提交方式,数据编码为键值对(如 key1=value1&key2=value2普通表单提交
    multipart/form-data文件上传时使用,数据分多部分传输Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
    application/octet-stream二进制流数据(如文件下载)用于未知或任意二进制文件
    application/pdfPDF 文件Content-Type: application/pdf
    application/zipZIP 压缩文件Content-Type: application/zip
    图像类型image/jpegJPEG 图像Content-Type: image/jpeg
    image/pngPNG 图像Content-Type: image/png
    image/gifGIF 图像Content-Type: image/gif
    image/svg+xmlSVG 矢量图(基于 XML)Content-Type: image/svg+xml
    音视频类型audio/mpegMP3 音频文件Content-Type: audio/mpeg
    video/mp4MP4 视频文件Content-Type: video/mp4
    其他类型application/javascriptJavaScript 代码替代 text/javascript
    application/ld+jsonJSON-LD(结构化数据格式)用于语义网或 SEO 优化
    application/vnd.ms-excelExcel 文件(旧版 .xlsContent-Type: application/vnd.ms-excel
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheetExcel 文件(新版 .xlsx长 MIME 类型,需确保正确设置
    常见使用场景推荐 Content-Type
    API 请求(JSON 数据)application/json
    文件上传(表单)multipart/form-data
    普通表单提交application/x-www-form-urlencoded
    二进制文件下载application/octet-stream
  • **(5.2) **

  • **(5.3) **

  • **(5.4) **