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/plain
multipart/form-data
application/x-www-form-urlencoded
复杂请求:
- PUT, Delete 方法的 ajax 请求
- 发送 JSON 格式的 ajax 请求(比如post数据)
- 带自定义头的 ajax 请求
如果是简单请求, 则会先执行, 后判断。执行的过程大致如下:
浏览器检测到请求是 CORS 请求, 添加一个origin字段(其中包含页面源信息: 协议、域名、端口) ====> 服务端收到后作相应的处理(对比origin, 服务端判断这个源是否接受)返回结果给浏览器 ====> 浏览器检查响应头是否允许跨域信息 ====> 允许, 那就当做没事发生。 不允许, 浏览器抛出相应的错误信息。
复杂请求在发生请求时, 如果是 CORS 请求,浏览器预先发送一个 option 请求。浏览器这种行为被称之为预检请求(注意如果不是跨域请求就不会发生预检请求,比如反向代理)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!