HTTP报文

HTTP报文

用于HTTP协议交互的信息被称为HTTP报文。客户端的HTTP报文叫请求报文,服务端的HTTP报文叫响应报文。

请求报文 是由请求行(请求方法、协议版本)、请求首部(请求URI、客户端信息等)和内容实体(用户信息和资源信息等,可为空)构成。

响应报文 是由状态行(协议版本、状态码)、响应首部(服务器名称、资源标识等)和内容实体(服务端返回的资源信息)构成。

请求方法

  • GET:get方法一般用于获取服务器资源
  • POST:post方法一般用于传输实体主体
  • PUT:put方法一般用于传输文件
  • DELETE:delete方法用于删除文件
  • HEAD:head方法用于获取报文首部,不返回报文主体
  • OPTIONS:options方法用于询问请求URI资源支持的方法

状态码

HTTP状态码表示客户端HTTP请求的返回结果、标识服务器处理是否正常、表明请求出现的错误等。

2XX 成功(这系列表明请求被正常处理了)
200 OK,表示从客户端发来的请求在服务器端被正确处理
204 No content,表示请求成功,但响应报文不含实体的主体部分
206 Partial Content,进行范围请求成功
3XX 重定向(表明浏览器要执行特殊处理)
301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
302 found,临时性重定向,表示资源临时被分配了新的 URL
303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源(对于301/302/303响应,几乎所有浏览器都会删除报文主体并自动用GET重新请求)
304 not modified,表示服务器允许访问资源,但请求未满足条件的情况(与重定向无关)
307 temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
4XX 客户端错误
400 bad request,请求报文存在语法错误
401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
403 forbidden,表示对请求资源的访问被服务器拒绝,可在实体主体部分返回原因描述
404 not found,表示在服务器上没有找到请求的资源
5XX 服务器错误
500 internal sever error,表示服务器端在执行请求时发生了错误
501 Not Implemented,表示服务器不支持当前请求所需要的某个功能
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求

首部字段

下面是请求首部和响应首部中的字段名称和作用:

通用首部 作用(请求报文和响应报文都可能使用)
Cache-Control 控制缓存的行为:no-cache(强制向服务器再次验证)、no-store(不做任何缓存)、max-age=111111(资源可缓存最大时间 秒)、public(客户端、代理服务器都可利用缓存)、private(代理服务器不可用缓存)
Connection 浏览器想要优先使用的连接类型: keep-alive close(开启和关闭持久连接)
Date 创建报文时间
Pragma 只用于请求报文,客户端要求中间服务器不返回缓存的资源
Via 代理服务器相关信息,每经过一个代理服务器就会添加相关信息,用逗号分割
Transfer-Encoding 传输编码方式:chunked分块传输
Upgrade 要求客户端使用的升级协议,需配合Connection: Upgrade一起使用:websocket
Warning 缓存相关问题的警告
请求首部 作用(请求报文专用)
Accept 能正确接收的媒体类型:application/json text/plain
Accept-Charset 能正确接收的字符集: unicode-1-1
Accept-Encoding 能正确接收的编码格式列表:gzip deflate
Accept-Language 能正确接收的语言列表:zh-cn,zh;1=0.9,en,1=0.8
Authorization 客户端认证信息:Bearer dSdSdFFlsfdjasd123,一般存token用
Cookie 发送给服务器的Cookie信息
Expect 期待服务端的指定行为
From 请求方邮箱地址
Host 服务器的域名,用于区分单台服务器多个域名的虚拟主机,是HTTP/1.1唯一必须包含的字段。
If-Match 两端资源标记比较,只有判断条件为真服务端才会接受请求:If-Mach: "123456,和服务端文件标记比较
If-Modified-Since 本地资源未修改返回 304(比较时间)
If-None-Match 本地资源未修改返回 304(比较标记)
User-Agent 客户端信息
Max-Forwards 限制可被代理及网关转发的次数
Proxy-Authorization 向代理服务器发送验证信息
Range 请求某个内容的一部分,配合If-Range使用
Referer 请求发起页面的原始URI
TE 传输编码方式
响应首部 作用(响应报文专用)
Accept-Ranges 告知客户端服务器是否可接受范围请求,是bytes,否none
Age 资源在代理缓存中存在的时间
ETag 资源标识,资源发生变化时标识也会发生改变
Location 客户端重定向到某个 URL
Proxy-Authenticate 向代理服务器发送验证信息
Server 服务器名字:Apache Nginx
WWW-Authenticate 获取资源需要的认证方案
Set-Cookie 需要存在客户端的信息,一般用于识别用户身份
实体首部 作用(补充请求报文或响应报文相关信息)
Allow 资源的正确请求方式:GET HEAD POST
Content-Encoding 内容的编码格式:gzip deflate
Content-Language 内容使用的语言:zh-CN
Content-Length request body 长度(即实体主体的大小):
Content-Location 返回数据的备用地址
Content-MD5 Base64加密格式的内容 MD5检验值
Content-Range 响应主体的内容范围
Content-Type 内容的媒体类型(如'application/json;charset=UTF-8'则会发送预检请求)
Expires 内容的过期时间
Last_modified 内容的最后修改时间

首部内容较多,重点记忆浏览器常用的一些字段就行了:

两种请求

浏览器发送 CORS 请求(跨域请求)时, 会将请求分为简单请求与复杂请求.

在我们日常工作中, 常用的简单请求可以将其归为以下几点:

  1. 请求的方法只能为HEAD、GET、POST
  2. 无自定义请求头
  3. Content-Type只能是这几种: text/plain multipart/form-data application/x-www-form-urlencoded

复杂请求:

  1. PUT, Delete 方法的 ajax 请求
  2. 发送 JSON 格式的 ajax 请求(比如post数据)
  3. 带自定义头的 ajax 请求

如果是简单请求, 则会先执行, 后判断。执行的过程大致如下:

浏览器检测到请求是 CORS 请求, 添加一个origin字段(其中包含页面源信息: 协议、域名、端口) ====> 服务端收到后作相应的处理(对比origin, 服务端判断这个源是否接受)返回结果给浏览器 ====> 浏览器检查响应头是否允许跨域信息 ====> 允许, 那就当做没事发生。 不允许, 浏览器抛出相应的错误信息。

复杂请求在发生请求时, 如果是 CORS 请求,浏览器预先发送一个 option 请求。浏览器这种行为被称之为预检请求(注意如果不是跨域请求就不会发生预检请求,比如反向代理)。

posted @ 2022-07-21 00:19  槑孒  阅读(215)  评论(0编辑  收藏  举报