HTTP请求
-
请求行:请求行主要包含请求方法、请求URI(统一资源标识符)和HTTP协议版本。例如:
GET /index.html HTTP/1.1
-
请求头(Headers):包含客户端的元数据,为服务器提供了额外信息,以便更好地理解和处理请求,常见字段如下:
- Host:指定目标主机名和端口号。
- User-Agent:描述客户端信息,如操作系统、浏览器版本等。
- Accept:指定客户端能够处理的内容类型,如
text/html
、application/json
等。 - Accept-Encoding:客户端支持的内容压缩方式,如gzip、deflate等。
- Accept-Language:指示客户端优先接受的自然语言列表,让服务器返回特定语言或本地化的内容。
- Authorization:携带认证凭据(例如 Bearer Token)来证明用户身份。
- Connection:如**
keep-alive
指示服务器保持连接**;close
则指示请求后关闭连接。 - Content-Type:用于POST、PUT等有请求体的方法,指定请求体MIME类型,如
application/json
、application/x-www-form-urlencoded
等。 - Cookie:将之前服务器下发的 Cookie 信息保存到浏览器中,之后自动随请求发送回服务器,实现会话管理、用户认证。
- 缓存相关字段:
- Cache-Control:客户端用来告知服务器或缓存代理它希望如何控制缓存行为(
no-cache
、no-store
、max-age=0
)。 - If-Modified-Since / If-None-Match:客户端用来询问服务器资源是否有更新,如果资源未修改,服务器返回 304 状态码,客户端则使用本地缓存版本。
- Cache-Control:客户端用来告知服务器或缓存代理它希望如何控制缓存行为(
-
请求体:可选部分,主要用于携带要发送给服务器的具体数据,例如表单数据、文件上传或JSON数据,常见的格式有:
-
application/x-www-form-urlencoded:简单的文本类型表单数据。
-
multipart/form-data:包含文件上传或二进制数据的表单数据。
-
application/json:JSON格式数据。
-
-
响应头:服务端返回给客户端的元数据信息
-
Status Code:状态码
-
Content-Type:指示响应体的MIME类型,有
text/html; charset=UTF-8
、application/json
、image/png
等。 -
Content-Encoding:让浏览器通过指定的压缩方式对响应内容进行解压缩。
-
Set-Cookie:服务器用来指示浏览器存储 Cookie 的标头。附加属性例如
HttpOnly
、Secure
、SameSite
、path
用以加强安全性。- HttpOnly:无法通过js语言获取cookie数据
- Secure:让浏览器只在 HTTPS 通道中携带这个 cookie
- SameSite:关于跨站请求是否携带cookie,跨站与跨域的区别是跨域子域名可以不同,但跨站子域名必须相同,比如
a.example.com
和b.example.com
的子域名不同,但顶级域名和一级域名相同,所以属于跨站而不是跨域- none:允许任何跨站请求携带cookie
- lax:只允许**大部分跨站的get请求(导航、跳转)**携带cookie
- strict:不允许任何跨站请求携带cookie,是否使用取决于前后端分离项目中是否需要通过cookie传数据,不需要则设置为strict、否则设置为none + secure
- path:浏览器中会自动携带该cookie的请求路径
-
Access-Control-Allow-Origin:在跨域请求中,服务器用来指定允许访问资源的来源
-
Access-Control-Allow-Credentials:指明是否允许客户端在跨域请求中携带 Cookie 等凭证信息。
-
Content-Length:指示响应体的字节长度。
-
Server:显示服务器使用的软件信息,例如 Apache、nginx、IIS等。
-
Date:响应发送的时间。
-
缓存相关字段:
-
Cache-Control:服务器设置缓存规则,以确定该用户是否将从其本地缓存加载资源(
no-cache
、no-store
、max-age=3600
)。 -
Expires:指定客户端缓存过期的时间。
-
Last-Modified:表示资源的最后修改时间,在下一次请求时,客户端可以用
If-Modified-Since
来判断缓存是否有效。 -
ETag:资源的唯一标识符,基于内容生成的哈希值。让客户端使用
If-None-Match
与资源当前状态做比较,以判断缓存是否有效。 -
Etag和Last-Modified的区别:
Last-Modified:标注的最后修改只能精确到秒级,如果某些文件在 1 秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间;又或者如果某些文件会被定期保存,可能内容并没有任何变化,但 Last-Modified 却改变了,导致文件无法有效使用缓存,此时使用Etag解决。
Etag:Etag在每次请求时,服务端都必须对资源进行哈希计算,这比起简单获取一下修改时间,开销要大了很多。
Etag 和 Last-Modified 一起使用:服务器会优先验证 Etag,在 Etag 一致的情况下,再去对比 Last-Modified,这是为了防止有一些 HTTP 服务器未将文件修改日期纳入哈希范围内。
-
-
HTTP 响应
- 响应行
包括HTTP版本、状态码和状态消息,如HTTP/1.1 200 OK
。 - 响应头
如Content-Type、Server、Date、Set-Cookie等,提供响应的附加信息。 - 响应体
包含实际的请求结果,如HTML页面、JSON数据、图像文件等。 - 响应码
状态码 | 类型 | 描述 |
---|---|---|
200 OK | 2xx 成功 | 请求成功,并返回所请求的数据。 |
201 Created | 2xx 成功 | 请求成功且服务器创建了新的资源(常用于 POST 请求)。 |
204 No Content | 2xx 成功 | 请求成功,但没有返回任何内容,常见于删除或更新操作后。 |
301 Moved Permanently | 3xx 重定向 | 资源已被永久移动到新 URL,客户端和搜索引擎将更新访问链接。 |
302 Found | 3xx 重定向 | 请求的资源临时位于其他 URL,服务器提示继续使用原 URL 访问。 |
304 Not Modified | 3xx 重定向 | 缓存内容未修改,无须重新传输数据。 |
400 Bad Request | 4xx 客户端错误 | 请求格式错误或缺少必需参数,服务器无法理解请求。 |
401 Unauthorized | 4xx 客户端错误 | 请求未经授权,需要提供有效的身份验证凭证。 |
403 Forbidden | 4xx 客户端错误 | 服务器理解请求但拒绝执行,可能由于权限限制。 |
404 Not Found | 4xx 客户端错误 | 请求的资源不存在,常见于错误链接或资源被删除的场景。 |
405 Method Not Allowed | 4xx 客户端错误 | 请求方法不被允许,例如用 GET 访问只允许 POST 的接口。 |
500 Internal Server Error | 5xx 服务器错误 | 服务器内部出现错误,无法完成请求。 |
502 Bad Gateway | 5xx 服务器错误 | 网关或代理服务器从上游服务器接收到无效响应。 |
503 Service Unavailable | 5xx 服务器错误 | 服务器当前无法处理请求,可能由于过载或正在维护中。 |
504 Gateway Timeout | 5xx 服务器错误 | 作为网关或代理服务器时,未及时从上游服务器获得响应。 |