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 请求(跨域请求)时, 会将请求分为简单请求与复杂请求.
在我们日常工作中, 常用的简单请求可以将其归为以下几点:
- 请求的方法只能为HEAD、GET、POST
- 无自定义请求头
Content-Type只能是这几种:text/plainmultipart/form-dataapplication/x-www-form-urlencoded
复杂请求:
- PUT, Delete 方法的 ajax 请求
- 发送 JSON 格式的 ajax 请求(比如post数据)
- 带自定义头的 ajax 请求
如果是简单请求, 则会先执行, 后判断。执行的过程大致如下:
浏览器检测到请求是 CORS 请求, 添加一个origin字段(其中包含页面源信息: 协议、域名、端口) ====> 服务端收到后作相应的处理(对比origin, 服务端判断这个源是否接受)返回结果给浏览器 ====> 浏览器检查响应头是否允许跨域信息 ====> 允许, 那就当做没事发生。 不允许, 浏览器抛出相应的错误信息。
复杂请求在发生请求时, 如果是 CORS 请求,浏览器预先发送一个 option 请求。浏览器这种行为被称之为预检请求(注意如果不是跨域请求就不会发生预检请求,比如反向代理)。

浙公网安备 33010602011771号