HTTP协议

2026 年 1 月 26 日 星期一
/ ,
9

HTTP协议

HTTP请求特性

幂等

如果同样的请求被执行一次与连续执行多次,对服务器的预期影响是相同的,那么称这个 HTTP 方法是幂等的。幂等性只考虑服务器的状态,每次请求返回的响应可以不同。
幂等的 HTTP 方法
GET:它是用来获取资源的,不会改变服务器的状态,所以多次执行不会产生不同的结果。
HEAD:类似于 GET,但只返回响应头,不包括资源的主体内容,也不会改变服务器状态。
PUT:用来更新资源,每次发送相同的数据,都会使资源的状态保持一致。即使你多次执行,资源的最终状态依然是相同的。
DELETE:用来删除资源。虽然多次执行 DELETE 请求可能返回不同的状态码(如第一次返回 200,之后返回 404),但资源的最终状态是一致的:它已被删除。

非幂等的 HTTP 方法
POST:用来提交数据或执行操作。多次发送 POST 请求通常会产生不同的结果(例如,提交多个表单数据时会在数据库中插入多条记录),因此它不是幂等的。
PATCH:用于对资源进行部分更新,每次执行可能会带来不同的效果,因此也不是幂等的。

安全(Safe)

如果一个 HTTP 方法被认为是“安全的”,意味着这个方法:

  • 不会修改服务器的状态或数据。
    它仅仅是获取资源或提供信息,而不会对服务器上的数据产生任何影响。
  • 是只读操作。
    这些方法的执行并不会改变服务器的资源内容或状态,只是请求数据并返回

安全:
GET、HEAD、OPTIONS
非安全:
POST、PUT、DELETE、PATCH、CONNECT、TRACE

HTTP请求方法

  1. GET: 请求指定的资源。
  2. HEAD: 请求资源的标头信息,并且这些标头与 HTTP GET 方法请求时返回的一致。该请求方法的一个使用场景是在下载一个大文件前先通过 HEAD 请求读取其 Content-Length 标头的值获取文件的大小,而无需实际下载文件,以此可以节约带宽资源。
  3. OPTIONS: 请求通常用于查询服务器上某个 URL 或者整个服务器允许哪些 HTTP 方法;在跨域请求时,浏览器通常会先发起一个 OPTIONS 请求,称为 预检请求,来检查服务器是否允许当前跨域请求。
  4. POST: 发送数据给服务器。请求主体的类型由 Content-Type 标头指定。PUT 和 POST 方法的区别是,PUT 方法是幂等的,PUT 调用一次与连续调用多次效果是相同的,没有副作用。

  5. PUT: 创建一个新的资源或替换有效当前有效资源,方法是幂等的。在响应中,如果目标资源没有,并且 PUT 方法成功创建了资源,那么源服务器必须返回 201(Created)来通知用户代理资源已创建。如果目标资源已经存在,并且成功进行了更新,那么,源服务器必须返回 200(OK)或 204(No Content)来表示请求成功完成。
  6. TRACE: 服务器会将收到的请求内容原封不动地返回给客户端,客户端可以借此验证请求在传输过程中是否被修改或损坏,可以查看请求经过代理服务器时发生了什么变化,帮助识别哪些头部信息被添加、修改或删除。

HTTP响应状态码

  • 200(OK): GET-请求成功,将资源添加到响应主体中;POST-操作成功,响应描述请求的结果;HEAD-与GET相同,但是没有消息主体;TRACE-响应主体包含服务器接收到的请求信息。
  • 201(Created):代表请求成功处理,并且创建了新资源。
  • 202(Accepted):表示请求已被接受处理,但处理尚未完成或可能尚未开始。该请求的实际处理结果并不受保证——当服务器尝试处理时,相关任务或操作仍可能失败或被拒绝。
  • 301(Moved Permanmently): 说明请求的资源已经被移动到了由 Location 头部指定的 url 上,是固定的不会再改变。搜索引擎会根据该响应修正。
  • 302(Found):表示请求的资源已临时移动到 Location 标头中的 URL。
  • 304(Not Modified):说明说明无需再次传输请求的内容,也就是说可以使用缓存的内容。通常在协商缓存阶段缓存还未失效情况下服务器会返回此状态码。(标头 If-None-Match、If-None-Match)
  • 307(Temporary Redirect):同302,状态码 307 与 302 之间的唯一区别在于,当发送重定向请求的时候,307 状态码可以确保请求方法和消息主体不会发生变化。如果使用 302 响应状态码,一些旧客户端会错误地将请求方法转换为 GET。
  • 308(Permanent Redirect):同301,状态码 308 与 301 之间的唯一区别在于,当发送重定向请求的时候,308 状态码可以确保请求方法和消息主体不会发生变化。如果使用 301 响应状态码,一些旧客户端会错误地将请求方法转换为 GET。
  • 400(Bad Request):服务器因某些被认为是客户端错误的原因(例如,请求语法错误、无效请求消息格式或者欺骗性请求路由),而无法或不会处理该请求。
  • 401(Unauthorized):缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。
  • 403(Forbidden): 指的是服务器端有能力处理该请求,但是拒绝授权访问。
  • 404(Not Found):指的是服务器无法找到所请求的资源。返回该响应的链接通常称为坏链(broken link)或死链(dead link)。
  • 405(Method Not Allowed):表面服务器禁止了当前HTTP请求的方法
  • 406(Not Acceptable):客户端在请求头里通过 Accept、Accept-Charset、Accept-Encoding、Accept-Language 等字段告诉服务器期望拿到的资源表现形式;服务器发现自己手里的所有版本(内容类型、字符集、编码、语言等)没有一项能满足这些条件,于是返回 406。
  • 408(Request TimeOut): 服务器想要将没有在使用的连接关闭。一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下。
  • 412(Precondition Failed ):通常发生在 除 GETHEAD 之外的 HTTP 方法(如 PUT、DELETE、PATCH)进行 条件请求(If-None-Match 和 If-Modified-Since) 时,当请求的条件不满足时,服务器就会返回 412 状态码。
  • 413 (Content Too Large):表示请求主体的大小超过了服务器愿意或有能力处理的限度,服务器可能会关闭连接或返回 Retry-After 标头字段。
  • 415 (Unsupported Media Type):表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。
  • 429 (Too Many Requests):表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”,在响应中,可以提供一个 Retry-After 首部来提示用户需要等待多长时间之后再发送新的请求。
  • 500 (Internal Server Error) 表面服务器内部发生错误,因此拒绝请求。
  • 501 (Not Implemented) 服务器错误响应码表示请求的方法不被服务器支持,因此无法被处理。
  • 502 (Bad Gateway) 它表示作为网关或代理的服务器,从上游服务器中接收到的响应是无效的。
  • 503 (Service Unavailable)表示服务器尚未处于可以接受请求的状态。通常造成这种情况的原因是由于服务器停机维护或者已超载

面试高频问点

301和302状态码的区别?

语义: 301 Moved Permanently 表示资源永久迁移;302 Found 表示临时迁移(以后可能还会变回原地址)。
缓存与 SEO :301 通常会被浏览器/中间缓存更积极地缓存,搜索引擎也会把权重逐步转到新 URL;302 一般不长期缓存,搜索引擎更多认为是短期跳转,权重通常不转或转得更保守。
请求方法是否会被改写(坑点): 历史上很多客户端遇到 302 会把 POST 变成 GET 再跳转;301 也可能发生类似行为(取决于客户端实现)。如果你需要“明确保持原方法/请求体”,用 307 Temporary Redirect(临时)或 308 Permanent Redirect(永久)更准确。
实践建议: 域名换新、HTTP→HTTPS、路径永久调整用 301/308;临时活动页、灰度、短期维护跳转用 302/307。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...