golang,go,博客,开源,编程
HTTP(超文本传输协议,Hypertext Transfer Protocol)是客户端与服务器之间进行通信的协议。HTTP 报文是通过 HTTP 协议传输的数据单元,它包含了客户端请求服务器或者服务器响应客户端的信息。HTTP 报文主要分为 请求报文 和 响应报文,它们的结构类似,包含了不同的内容以适应各自的作用。
HTTP 请求报文由客户端发送给服务器,包含客户端的请求信息,如请求的资源、请求的方法等。请求报文的基本结构如下:
请求行
请求头
空行
请求体(可选)
请求行是请求报文的第一行,包含了 请求方法、请求目标 和 HTTP协议版本,它的格式为:
请求方法 请求目标 HTTP版本
GET
:请求获取资源(如网页、图片、文件等)。POST
:提交数据(例如表单数据)给服务器。PUT
:更新或替换指定的资源。DELETE
:删除指定的资源。HEAD
:类似 GET
请求,但服务器只返回响应头,不返回实际的资源内容。OPTIONS
:获取服务器支持的 HTTP 方法。PATCH
:部分更新资源。/index.html
或者 /api/v1/resource
。HTTP/1.1
和 HTTP/2
。GET /index.html HTTP/1.1
请求头(Headers)包含了关于请求的额外信息,例如客户端浏览器的类型、支持的压缩格式、身份验证信息等。每个头部字段由 字段名 和 字段值 组成,字段名和值之间用冒号分隔,字段之间通过换行分隔。
常见的请求头包括:
Host
:指定服务器的主机名和端口号。User-Agent
:客户端浏览器的类型及版本。Accept
:指定客户端可接受的响应类型(如文本、HTML、JSON等)。Content-Type
:指定请求体数据的类型(如 application/json
、application/x-www-form-urlencoded
等)。Authorization
:包含身份验证信息(如 Basic 或 Bearer token)。Accept-Encoding
:指定客户端支持的压缩算法,如 gzip
。Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
请求头和请求体之间有一个空行,用来分隔头部和正文。空行是必需的。
请求体是请求报文中的可选部分,包含了客户端发送给服务器的数据。例如,提交表单时,表单数据会放在请求体中。对于 GET
请求,一般没有请求体;而 POST
请求通常会包含请求体,特别是当提交数据时。
{
"username": "john_doe",
"password": "123456"
}
HTTP 响应报文是服务器返回给客户端的数据,包含了服务器处理请求后的状态信息和所请求的资源。响应报文的基本结构如下:
状态行
响应头
空行
响应体(可选)
状态行是响应报文的第一行,包含了 HTTP协议版本、状态码 和 状态描述,它的格式为:
HTTP版本 状态码 状态描述
HTTP/1.1
和 HTTP/2
。常见的状态码包括:
200 OK
:请求成功。301 Moved Permanently
:资源永久移动。404 Not Found
:请求的资源未找到。500 Internal Server Error
:服务器内部错误。HTTP/1.1 200 OK
响应头包含了服务器返回的关于响应的信息。每个头部字段由 字段名 和 字段值 组成。常见的响应头包括:
Content-Type
:指定响应体的类型(如 text/html
、application/json
等)。Content-Length
:指定响应体的字节长度。Location
:在重定向响应中,指定新资源的 URI。Cache-Control
:控制缓存策略。Set-Cookie
:设置客户端的 Cookie。Server
:指定服务器的名称和版本信息。Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Cache-Control: no-cache
Server: Apache/2.4.29 (Ubuntu)
响应头和响应体之间的空行与请求报文相同,表示头部和正文的分隔。
响应体包含了服务器返回的实际数据,可能是网页的 HTML 内容、图片、JSON 数据等。例如,GET
请求的响应体可能是网页的 HTML 内容,POST
请求的响应体可能是一个状态确认消息。
<html>
<body>
<h1>Hello, world!</h1>
</body>
</html>
特性 | HTTP请求报文 | HTTP响应报文 |
---|---|---|
请求行/状态行 | 请求行包含请求方法、目标资源、协议版本 | 状态行包含协议版本、状态码和状态描述 |
请求头/响应头 | 包含请求相关的信息(如 Host, User-Agent) | 包含响应相关的信息(如 Content-Type, Server) |
请求体/响应体 | 请求体通常包含提交的数据(如表单数据) | 响应体通常包含请求的资源或错误信息 |
空行 | 请求头和请求体之间有一个空行 | 响应头和响应体之间有一个空行 |
HTTP 报文的结构通过请求行、头部、空行和体部分清晰地划分了各类信息,确保客户端与服务器之间的通信高效且规范。通过这种结构,HTTP 能够支持广泛的应用场景,尤其是在 Web 浏览器与 Web 服务器之间的通信中。