HTTP
超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端—服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。
工作原理是什么?
HTTP协议基于请求-响应模型,具体步骤如下:
- 客户端发起请求:客户端(如浏览器)向服务器发送一个HTTP请求。
- 服务器处理请求:服务器接收到请求后,解析请求并处理。
- 服务器返回响应:服务器生成一个HTTP响应并将其发送回客户端。
- 客户端处理响应:客户端接收到响应后,解析响应并处理(如渲染HTML页面)。
HTTP请求和响应的结构是什么?
HTTP请求
一个HTTP请求由以下几个部分组成:
- 请求行(Request Line)
- 请求头(Request Headers)
- 空行(Blank Line)
- 请求体(Request Body,可选)
请求行(Request Line)
请求行包含三个部分,分别是请求方法、请求的URL和HTTP版本。
格式:
<请求方法> <请求URL> <HTTP版本>
示例:
GET /index.html HTTP/1.1
- 请求方法:常见的请求方法有GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH等。
- 请求URL:请求的资源路径。
- HTTP版本:通常为HTTP/1.1。
请求头(Request Headers)
请求头包含一系列键值对,提供关于请求的附加信息。每个头字段由名称和值组成,中间用冒号分隔。
示例:
Host: www.example.com
Accept: text/html,application/xhtml+xml
User-Agent: Mozilla/5.0
常见的请求头字段包括:
- Host:请求的目标主机名和端口号。
- Accept:客户端可以接受的内容类型。
- User-Agent:客户端的用户代理信息,如浏览器类型和版本。
- Content-Type:请求体的媒体类型,如application/json。
- Content-Length:请求体的长度(字节数)。
- Authorization:用于身份验证的凭证。
空行(Blank Line)
请求头和请求体之间有一个空行,表示请求头部分结束。
请求体(Request Body,可选)
请求体包含客户端发送给服务器的数据,如表单数据、JSON对象等。对于GET请求,请求体通常是空的;而对于POST、PUT等方法,请求体可能包含数据。
示例:
name=John&age=30
HTTP响应
一个HTTP响应由以下几个部分组成:
- 状态行(Status Line)
- 响应头(Response Headers)
- 空行(Blank Line)
- 响应体(Response Body,可选)
状态行(Status Line)
状态行包含三个部分,分别是HTTP版本、状态码和状态消息。
格式:
<HTTP版本> <状态码> <状态消息>
示例:
HTTP/1.1 200 OK
- HTTP版本:通常为HTTP/1.1。
- 状态码:一个三位数字,表示请求的处理结果。
- 状态消息:状态码的简短描述,如OK、Not Found等。
响应头(Response Headers)
响应头包含一系列键值对,提供关于响应的附加信息。每个头字段由名称和值组成,中间用冒号分隔。
Content-Type: text/html
Content-Length: 1354
常见的响应头字段包括:
- Content-Type:响应体的媒体类型,如text/html。
- Content-Length:响应体的长度(字节数)。
- Set-Cookie:设置客户端的Cookie。
- Location:用于重定向,指定新的URL。
- Cache-Control:控制缓存的行为,如max-age、no-cache等。
空行(Blank Line)
响应头和响应体之间有一个空行,表示响应头部分结束。
响应体(Response Body,可选)
响应体包含服务器返回给客户端的数据,如HTML文档、图片等。对于某些状态码(如204 No Content),响应体可能是空的。
HTTP方法(GET, POST, PUT, DELETE等)的用途是什么?
HTTP方法定义了客户端与服务器之间交互的不同方式。每个方法都有特定的用途和语义。
GET
用途
请求指定的资源。GET方法用于从服务器获取数据。
特点
- 幂等性:多次相同的GET请求应该返回相同的结果。
- 安全:GET请求不应该有副作用,即不应该改变服务器上的资源状态。
- 缓存:GET请求可以被缓存。
- 参数:参数通过URL传递,限制了参数的长度。
POST
用途
向指定的资源提交数据,通常用于提交表单或上传文件。
特点
- 非幂等性:多次相同的POST请求可能会产生不同的结果。
- 不安全:POST请求可能会改变服务器上的资源状态。
- 无缓存:POST请求不会被缓存。
- 参数:参数通过请求体传递,没有长度限制。
PUT
用途
替换指定资源的所有当前表示。PUT方法用于更新资源。
特点
- 幂等性:多次相同的PUT请求应该产生相同的结果。
- 不安全:PUT请求可能会改变服务器上的资源状态。
- 无缓存:PUT请求不会被缓存。
- 参数:参数通过请求体传递。
DELETE
用途
删除指定的资源。
特点
- 幂等性:多次相同的DELETE请求应该产生相同的结果。
- 不安全:DELETE请求可能会改变服务器上的资源状态。
- 无缓存:DELETE请求不会被缓存。
HEAD
用途
请求指定资源的响应头部,但不返回响应体。HEAD方法用于获取资源的元数据。
特点
- 幂等性:多次相同的HEAD请求应该返回相同的结果。
- 安全:HEAD请求不应该有副作用。
- 缓存:HEAD请求可以被缓存。
OPTIONS
用途
请求指定资源的通信选项。OPTIONS方法用于获取目标资源所支持的通信选项。
特点
- 幂等性:多次相同的OPTIONS请求应该返回相同的结果。
- 安全:OPTIONS请求不应该有副作用。
- 缓存:OPTIONS请求可以被缓存。
PATCH
用途
对指定资源进行部分更新。PATCH方法用于修改资源的部分属性。
特点
- 非幂等性:多次相同的PATCH请求可能会产生不同的结果。
- 不安全:PATCH请求可能会改变服务器上的资源状态。
- 无缓存:PATCH请求不会被缓存。
- 参数:参数通过请求体传递。
幂等
如果同样的请求被执行一次与连续执行多次,对服务器的预期影响是相同的,那么称这个 HTTP 方法是幂等的。
HTTP状态码的分类和常见状态码有哪些?
HTTP状态码是服务器在响应客户端请求时返回的一个数字代码,用于指示请求的处理结果。
HTTP状态码的分类
- 信息响应 (100–199)
- 成功响应 (200–299)
- 重定向消息 (300–399)
- 客户端错误响应 (400–499)
- 服务端错误响应 (500–599)
常见状态码
状态码 | 描述 | 说明 |
---|---|---|
100 | Continue | 继续发送请求体 |
101 | Switching Protocols | 切换协议 |
200 | OK | 请求成功 |
201 | Created | 资源已创建 |
202 | Accepted | 请求已接受,但未处理完成 |
204 | No Content | 请求成功,但响应体为空 |
301 | Moved Permanently | 资源已永久移动 |
302 | Found | 资源临时移动 |
304 | Not Modified | 资源未修改 |
307 | Temporary Redirect | 临时重定向 |
308 | Permanent Redirect | 永久重定向 |
400 | Bad Request | 请求无效 |
401 | Unauthorized | 需要身份认证 |
403 | Forbidden | 禁止访问 |
404 | Not Found | 资源未找到 |
405 | Method Not Allowed | 方法不被允许 |
408 | Request Timeout | 请求超时 |
429 | Too Many Requests | 请求过多 |
500 | Internal Server Error | 服务器内部错误 |
501 | Not Implemented | 不支持的请求方法 |
502 | Bad Gateway | 无效的响应 |
503 | Service Unavailable | 服务不可用 |
504 | Gateway Timeout | 上游服务器超时 |