跳转至

引言

HyperText Transfer Protocol 超文本传输协议

HTTP 的特点是

  • 建立在 TCP 之上(通过 Socket 来使用 TCP)
  • 无连接(TCP 就是它的连接)
  • 无状态(后来加了 Cookies、Session 技术,用 KeepAlive 来维持状态)
  • 请求-响应模式

Socket 做为套接层 API,本身不是协议,只规定了 API

20230823094945

由于HTTP 协议是一个无状态协议,所以状态只能保存在服务端,访问一个网站的资源,即客户端与服务端交互,涉及数据和状态的转化,客户端如果想通过HTTP请求来改变状态,可以遵循 RESTful 设计原则来实现

REST(Representational State Transfer) 表现层状态转移

  • API 中不应该包含如版本号等资源表示形式,可以放到请求头中
  • API 中不应该包含动词,可以放到请求体中

发展

  • HTTP/1.1

    Port:80
    对应协议:RFC2616,补充协议:RFC7231、RFC6265

  • HTTPS

    Port:443
    安全:使用 TLS

  • HTTP2/SPDY

    Port:沿用 HTTP/HTTPS
    安全:强制使用TLSv1.2
    效率:多路复用,头部使用了HPACK压缩算法

  • HTTP3/QUIC

    Port:没有指定默认端口号
    安全:强制使用TLSv1.3
    效率:传输基于QUIC(Quick UDP Internet Connections)

认证 identification

根据一些信息确认用户的身份,比如用户名密码,二维码,指纹等等

授权 authorization

资源所有者授予执行者操作资源的权限

授信媒介

  • session
  • cookies
  • token

session

如果想让两次请求联系起来,或者说共享数据,说着说保持会话状态,需要使用某种手段,比如session,而cookie是实现session最常用的方案之一

服务端接收到请求后,会建立一个session,并返回响应,响应头中包含了set-cookie头部,头部中包含了sessionId session包含了用户的认证信息和登录状态等信息 服务端接收cookie后解析出sessionId,再去session列表中查找,才能找到相应session

token

token,也称作令牌,由uid+time+sign+[固定参数],类似于临时的证书签名(是一种服务端无状态的认证方式,即服务端不会保存),保存在localStroage等容器中,cpu加密,服务端解密,不存在负载均衡问题,这个方法叫做JWT(Json Web Token,一种跨域认证方案)

uid:唯一标识 time:当前时间的时间戳 sign:签名,使用hash/encrypt压缩成定长的十六进制字符串,防止恶意拼接 固定参数:可选,避免重复

鉴权 authentication

验证权限

状态码

注意,状态码仅表示状态,具体还要看返回内容中自定义的错误码

1xx:提示信息,表示协议处理的中间状态,还需要后续的操作,不常见

  • 101 更换协议后继续通信

2xx:成功,报文已经收到并被正确处理

  • 200 一切正常,通常会返回body
  • 204 正常,不会返回body
  • 206 正常,只返回部分数据(通常出现在范围请求时)

3xx:重定向,资源位置发生变动,需要客户端重新发送请求

  • 301 请求资源已不在,永久重定向
  • 302 请求资源还在,临时重定向,比如系统维护时
  • 304 重定向到了缓存(一般与If-Modified-Since同在)

4xx 客户端错误

  • 400 通用错误码,请求报文有误,服务器无法处理
  • 403 服务器禁止访问资源,其实不属于客户端错误
  • 404 资源未找到,已经被用滥
  • 405~431 一般都会返回较明确的备注提示

5xx 服务端错误

  • 500 通用错误码,服务端错误
  • 501 表示还不支持,类似即将开业,敬请期待
  • 502 一般为网关或者代理服务器出错
  • 503 网络服务较忙,是一个临时状态(此时会出现Retry-After头告诉多久后重试)

测试服务

This domain is for use in illustrative examples in documents.

You may use this domain in literature without prior coordination or asking for permission.

由 Requests 库作者 Kenneth Reitz 开发

除此之外,他还搭建了很多人性化的工具,其个人网站:https://kennethreitz.org

可以本地运行服务:docker run -p 80:80 kennethreitz/httpbin