Skip to content

HTTP

HTTP(HyperText Transfer Protocol,超文本传输协议)是用于从 Web 服务器传输超文本(如 HTML、CSS、JS、图片等)到客户端(如浏览器)的 应用层协议

基本特点

无状态(Stateless):

每个 HTTP 请求都是独立的,服务器不会记住之前的请求(需借助 Cookie/Session机制维持状态)。

基于请求-响应模型(Request-Response):

客户端发送请求,服务器返回响应。

可扩展性强:

支持自定义头部(Headers)和多种数据格式(JSON、XML 等)。

NOTE

默认端口

HTTP:80, HTTPS:443

请求方式

方法名称作用描述是否有请求体是否有响应体常见用途
GET获取资源从服务器获取数据或资源获取网页、API数据
POST创建资源向服务器提交数据,通常用于创建新资源表单提交、用户注册、登录
PUT更新资源用于更新服务器上的资源(整体替换)更新用户信息、修改数据
PATCH局部更新资源用于对服务器资源进行部分修改局部更新,如修改部分字段
DELETE删除资源请求服务器删除指定资源否/是删除用户、移除数据
HEAD获取头部信息类似 GET,但只返回响应头,不返回响应体检查资源是否存在、获取元数据
OPTIONS查询支持方法查询服务器支持哪些 HTTP 方法跨域预检、API能力查询
TRACE跟踪请求回显收到的请求,主要用于诊断和调试网络调试、诊断
CONNECT建立隧道用于代理服务器建立 TCP 隧道(如 HTTPS)HTTPS 代理、VPN连接

NOTE

GET 和 POST 请求的区别:

  • GET 请求通过 URL 传递参数,参数暴露在地址栏,且有长度限制(具体长度限制由浏览器和服务器决定)
  • POST 请求通过请求体传递参数,参数不暴露在地址栏,且没有长度限制
  • GET 请求支持缓存,POST 请求不支持缓存

TIP

在ful API设计中,CRUD操作通常映射为:

  • Create -> POST
  • Read -> GET
  • Update -> PUT
  • Delete -> DELETE

请求结构

HTTP 请求是客户端(如浏览器、Postman、curl)向服务器发送数据的格式。其结构主要包括三部分:Reuest Line、Headers 和 Body(可选)。

http
# Request Line = 请求方法 + 请求路径 + HTTP版本
POST /api/login HTTP/1.1   
# Headers
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Content-Type: application/json
Content-Length: 49
Connection: keep-alive
# 空白行
# Body(可选)
{
  "username": "alice",
  "password": "secret123"
}

TIP

请求头和请求体之间使用空行分隔

响应结构

HTTP 响应是服务器返回给客户端的数据格式。其结构主要包括三部分:Status Line、Headers 和 Body(可选)。

http
# Status Line = HTTP版本 + 状态码 + 状态描述
HTTP/1.1 200 OK
# Headers
Date: Tue, 09 Jul 2024 12:00:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 70
Connection: close
# 空白行
# Body(可选)
<html>
  <head><title>Example</title></head>
  <body>Hello, world!</body>
</html>

状态码表

状态码名称描述示例场景
100Continue服务器已收到请求头,客户端应继续发送请求体上传大文件时,服务器确认可以接收数据继续传输
101Switching Protocols服务器根据客户端的请求切换协议从 HTTP 升级到 WebSocket 连接时
200OK请求成功成功获取网页、API 成功返回数据
201Created请求已完成,新资源已创建成功提交表单创建新用户、POST 请求创建新资源
204No Content服务器成功处理请求,但没有返回任何内容删除操作成功、保存设置成功但不需要刷新页面
301Moved Permanently请求的资源已永久移动到新位置网站域名更改、URL 结构永久调整
302Found请求的资源临时从不同 URI 响应请求临时重定向到登录页、支付完成后重定向回商店
304Not Modified资源未修改,可使用缓存版本浏览器请求页面时使用 If-Modified-Since 获取缓存资源
400Bad Request服务器无法理解请求的格式提交的 JSON 格式错误、URL 参数格式不正确
401Unauthorized请求未授权访问需要登录的 API、token 过期
403Forbidden服务器拒绝请求用户无权访问特定资源、IP 被封禁
404Not Found请求的资源不存在访问已删除的页面、API 端点错误
405Method Not Allowed请求方法不允许对只读资源使用 POST 方法、对只能 POST 的接口使用 GET
429Too Many Requests客户端发送了太多请求API 限流保护、爬虫访问频率过高
500Internal Server Error服务器内部错误服务器代码异常、数据库连接失败
502Bad Gateway服务器作为网关时收到了无效响应负载均衡器无法连接到后端服务、上游服务返回错误
503Service Unavailable服务器暂时不可用服务器维护中、系统过载
504Gateway Timeout作为网关的服务器请求超时代理服务器等待后端服务响应超时

Redirect

Redirect(重定向)是指服务器指示客户端自动跳转到另一个 URL 的过程。常见的重定向状态码有 301(永久重定向)和 302(临时重定向)。

工作流程

alt text

TIP

  • 重定向的新请求由浏览器自动发送
  • 重定向支持跨域, 新的 URL 能够跨域
  • 重定向总共发送两次请求
  • 重定向通常情况下不会自动传递原请求的参数和请求

Released under the MIT License.