HTTP请求报文头和相应报文头
一、HTTP请求报文头
HTTP请求报文由请求行、请求头和请求体组成。请求头包含客户端向服务器发送的附加信息。
1.1 请求行
- 格式: 方法 请求URI HTTP/版本
- 示例: GET /index.html HTTP/1.1
方法: 请求类型,如GET、POST、PUT、DELETE等。
请求URI: 请求的资源路径。
HTTP/版本: 使用的HTTP协议版本。
1.2 请求头字段
-
Host: 服务器域名和端口号。
示例: Host: www.example.com -
User-Agent: 客户端信息(浏览器、操作系统等)。
示例: User-Agent: Mozilla/5.0 -
Accept: 客户端可接受的MIME类型。
示例: Accept: text/html,application/xhtml+xml -
Accept-Language: 客户端可接受的语言。
示例: Accept-Language: en-US,en;q=0.5 -
Accept-Encoding: 客户端可接受的编码方式。
示例: Accept-Encoding: gzip, deflate -
Connection: 控制连接状态。
示例: Connection: keep-alive -
Referer: 请求来源页面的URI。
示例: Referer: https://www.example.com/previous-page -
Authorization: 认证信息。
示例: Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== -
Cookie: 客户端发送的Cookie。
示例: Cookie: name=value; name2=value2
二、HTTP响应报文头
HTTP响应报文由状态行、响应头和响应体组成。响应头包含服务器返回的附加信息。
2.1 状态行
- 格式: HTTP/版本 状态码 状态短语
- 示例: HTTP/1.1 200 OK
HTTP/版本: 使用的HTTP协议版本。
状态码: 表示请求结果的三位数字。
状态短语: 状态码的文本描述。
2.2 响应头字段
-
Server: 服务器软件信息。
示例: Server: Apache/2.4.1 -
Date: 响应生成的时间。
示例: Date: Mon, 23 May 2022 22:38:34 GMT -
Content-Type: 响应体的MIME类型。
示例: Content-Type: text/html; charset=UTF-8 -
Content-Length: 响应体的字节数。
示例: Content-Length: 1234 -
Content-Encoding: 响应体的编码方式。
示例: Content-Encoding: gzip -
Set-Cookie: 服务器设置的Cookie。
示例: Set-Cookie: name=value; Path=/ -
Cache-Control: 缓存控制指令。
示例: Cache-Control: no-cache -
Location: 重定向目标URI。
示例: Location: https://www.example.com/new-location -
WWW-Authenticate: 认证方式。
示例: WWW-Authenticate: Basic realm=“Access to the staging site”
三、常见状态码
状态码 | 英文 | 描述详解 |
---|---|---|
200 | OK: | 请求成功。 |
301 | Moved Permanently: | 资源永久重定向。 |
400 | Bad Request: | 请求无效。 |
401 | Unauthorized: | 请求未认证。 |
403 | Forbidden: | 请求被拒绝。 |
404 | Not Found: | 资源未找到。 |
500 | Internal Server Error: | 服务器内部错误。 |
四、GET 和 POST 对比
GET 和 POST是 HTTP 协议中最常用的两种请求方法,它们在用途、数据传输方式、安全性等方面有显著区别。以下是 GET 和 POST 的主要区别:
1、 用途
GET:
- 用于从服务器获取资源。
- 通常用于请求数据,例如加载网页、查询信息等。
- 是幂等的(多次请求不会对资源产生副作用)。
POST:
- 用于向服务器提交数据。
- 通常用于提交表单、上传文件、修改数据等。
- 是非幂等的(多次请求可能会对资源产生副作用)。
2、数据传输方式
GET:
- 数据通过 URL 的查询字符串(Query String)传递。
- 示例:https://example.com/search?q=hello&page=1
- 数据附加在 URL 后面,以 ? 开头,参数之间用 & 分隔。
- 数据可见,会显示在浏览器地址栏中。
POST:
- 数据通过请求体(Request Body)传递。
- 示例:表单数据或 JSON 数据。
- 数据不可见,不会显示在浏览器地址栏中。
3、数据长度限制
GET:
- 受 URL 长度限制(通常为 2048 个字符,具体取决于浏览器和服务器)。
- 不适合传输大量数据。
POST:
- 没有长度限制,适合传输大量数据(如文件上传)。
4、安全性
GET:
- 数据暴露在 URL 中,容易被缓存、记录在浏览器历史或服务器日志中。
- 不适合传输敏感信息(如密码)。
POST:
- 数据在请求体中传输,相对更安全。
- 但仍需结合 HTTPS 来确保数据加密传输。
5、缓存
GET:
- 请求可以被缓存,浏览器可能会存储 GET 请求的结果。
- 适合请求静态资源(如图片、CSS 文件)。
POST:
- 请求默认不会被缓存。
- 适合提交动态数据。
6、幂等性
GET:
- 是幂等的,多次请求不会对资源产生影响。
- 例如:多次请求同一个 URL,返回的结果相同。
POST:
- 不是幂等的,多次请求可能会对资源产生不同影响。
- 例如:多次提交表单可能会导致重复创建资源。
7、 浏览器行为
GET:
- 可以直接通过浏览器地址栏发起请求。
- 支持书签保存。
POST:
- 需要通过表单或 JavaScript 发起请求。
- 不支持直接通过地址栏发起。
8、适用场景
GET:
- 获取数据(如搜索、分页)。
- 请求静态资源(如图片、CSS、JS 文件)。
POST:
- 提交数据(如登录、注册、文件上传)。
- 修改数据(如创建、更新、删除资源)。
9、示例对比
GET 请求
GET /search?q=hello&page=1 HTTP/1.1
Host: example.com
数据通过 URL 传递。
POST 请求
POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
username=john&password=123
数据通过请求体传递。
10、总结对比表
特性 | GET | POST |
---|---|---|
用途 | 获取资源 | 提交数据 |
数据传输方式 | URL 查询字符串 | 请求体 |
数据长度 | 有限制(URL 长度) | 无限制 |
安全性 | 较低(数据暴露在 URL 中) | 较高(数据在请求体中) |
缓存 | 可缓存 | 不可缓存 |
幂等性 | 幂等 | 非幂等 |
浏览器行为 | 可通过地址栏发起 | 需通过表单或 JS 发起 |
适用场景 | 获取数据、请求静态资源 | 提交数据、修改数据 |
11、选择 GET 还是 POST?
- 如果需要从服务器获取数据,且数据量较小,使用 GET。
- 如果需要向服务器提交数据,尤其是敏感信息或大量数据,使用 POST。