HTTP协议<二> 报文结构
HTTP报文结构
请求报文
HTTP 请求报文的结构由以下几个部分组成:
请求行(Request Line):
- 请求行包含了
请求方法
、目标 URL
和协议版本
。 - 它们以空格分隔,并以回车换行符(CRLF)结束。
格式:Method SP Request-URI SP HTTP-Version CRLF
示例:GET /index.html HTTP/1.1
请求方法
- GET:用于从服务器获取(或检索)资源。
- POST:用于向服务器提交(或发送)数据,通常用于创建新资源。
- PUT:用于替换指定URL路径下的资源,可以用于创建或更新资源。
- OPTIONS:用于获取目标资源所支持的请求方法、允许的请求头等信息。
- HEAD:类似于GET请求,但只返回与GET请求相同的响应头信息,无响应体,用于获取资源的元数据。
- DELETE:用于删除指定的资源。
- TRACE:用于追踪在请求过程中中转服务器对消息的改变,常用于调试和排查问题。
- PATCH:用于对已存在的资源进行局部修改,只更新资源的一部分内容。
在后期会单独出一篇文章,详细介绍这8个请求方法
URL
URL是统一资源定位符(Uniform Resource Locator)的缩写,用于标识和定位在互联网上的资源。URL由多个部分组成,包括协议、主机名、端口号、路径、查询参数和片段等。
以下是一个URL的一般结构:
[协议]://[主机名或IP地址]:[端口号]/[路径]?[查询参数]#[片段]
具体解释如下:
- 协议:表示在网络上使用的通信协议,例如HTTP、HTTPS、FTP等。
- 主机名或IP地址:指定了服务器的地址,可以是一个域名,也可以是一个IP地址。
- 端口号:可选项,指定了服务器上服务所监听的端口号。如果未指定,默认使用协议的默认端口号(如HTTP默认为80)。
- 路径:指定了服务器上资源的路径或文件夹结构。
- 查询参数:可选项,用于向服务器传递额外的参数,以键值对的形式表示,多个参数之间使用"&"分隔。
- 片段:可选项,表示资源中的一个特定部分,通常在Web页面内部用于导航到特定的锚点位置。
以下是一些示例URL:
- https://www.example.com/index.html
- http://192.168.0.1:8080/api/users?sort=asc&page=1
- ftp://ftp.example.com/files/document.pdf#page=10
URL可用于在浏览器中访问网页、从服务器获取数据、创建API请求等。通过解析URL的各个部分,客户端能够准确定位和请求所需的资源。
RUL编码也会在后期单独出一篇文章单独解释。
协议版本
这个就很好理解了,他就是对应HTTP的版本号
请求头部(Request Headers):
- 请求头部包含了额外的请求信息,以键值对的形式出现,每个字段一行,以回车换行符(CRLF)结束。
格式:Header-Name: Header-Value CRLF
示例:
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
请求头部(Request Headers)是在HTTP请求中发送给服务器的额外信息,用于说明请求的属性、期望、身份验证等。请求头部以名称-值的形式表示,并位于HTTP请求的头部部分。
以下是一些常见的请求头部:
- User-Agent:
- 标识发起请求的用户代理(即浏览器、客户端程序等),用于服务器识别不同的用户代理。
- Accept:
- 指定客户端能够接收的响应内容类型,通常是指定MIME类型(如text/html、application/json等)。
- Content-Type:
- 指定请求体内容的媒体类型,用于告知服务器如何解析请求体数据。
- Authorization:
- 用于进行身份验证的凭据信息,例如基本身份验证(Basic Authentication)中的用户名和密码。
- Cookie:
- 在请求中发送之前由服务器发送给客户端的HTTP Cookie,用于跟踪用户的会话状态。
- Referer:
- 指示请求的来源URL,即之前页面的URL。常用于防止跨站请求伪造(CSRF)。
- Content-Length:
- 指定请求体的长度(以字节为单位),用于告知服务器请求体的大小。
- Cache-Control:
- 用于控制缓存行为,例如指示是否可以缓存响应、缓存有效期等。
- Host:
- 指定目标服务器的主机名和端口号,用于服务器寻找对应的网站和处理请求。
以上只是一些常见的请求头部,实际上还有更多的请求头部可以用于传递不同的信息和实现特定的功能。
空行(Empty Line):
- 空行用于分隔请求头部和请求主体。它由一个回车换行符(CRLF)组成,表示请求头部的结束。
请求主体(Request Body):
-
请求主体是可选的,用于在某些情况下向服务器发送额外的数据,
-
请求主体(Request Body)是在HTTP请求中包含的可选部分,用于向服务器发送数据或信息。请求主体通常用于POST、PUT等请求方法.
请求主体可以包含各种类型的数据,如表单数据、JSON数据、XML数据、文件等。数据的格式和编码方式通常由请求头部中的Content-Type字段来指定。
以下是一些常见的请求主体的示例:
- 表单数据(Form Data):
name=John+Doe&[email protected]
name=John+Doe&[email protected]
是一个表单数据的示例。这是一种常用的将数据编码为键值对的方式,通常使用在表单提交或URL查询参数中。在这个示例中,有两个键值对:
name=John+Doe
表示键为name
,值为John+Doe
,其中+
是对空格的URL编码。[email protected]
表示键为[email protected]
。这种表单数据格式常用于通过 HTTP POST 请求或作为查询字符串添加到 URL 中。在实际应用中,可以将这些数据作为请求主体的一部分发送给服务器。
- JSON数据:
{
"name": "John Doe",
"email": "[email protected]"
}
在请求主体示例中,
{ "name": "John Doe", "email": "[email protected]" }
是一个示例的JSON数据。JSON(JavaScript Object Notation)是一种常见的数据交换格式,用于表示结构化数据。在示例中,整个数据是一个JSON对象,由花括号
{}
包围。该对象包含两个属性,分别是"name"
和"email"
。
"name": "John Doe"
表示一个属性键值对,属性名为"name"
,值为"John Doe"
,表示名称为 “John Doe”。
"email": "[email protected]"
同样表示一个属性键值对,属性名为"email"
,值为"[email protected]"
,表示电子邮件为 “[email protected]”。JSON 是一种通用的数据格式,在很多场景中使用,如Web API的数据传输、配置文件、存储非结构化数据等。处理 JSON 数据时,通常使用相应的解析器或库来读取、生成和解析 JSON。
- XML数据:
<person>
<name>John Doe</name>
<email>[email protected]</email>
</person>
<person>
是一个 XML 数据的根元素,用于包含相关字段或属性。
<name>John Doe</name>
表示一个<name>
元素,其中包含名称字段的值为 “John Doe”。
<email>[email protected]</email>
表示一个<email>
元素,其中包含电子邮件字段的值为 “[email protected]”。XML 是可扩展标记语言(eXtensible Markup Language)的缩写,用于表示结构化数据。在请求主体或响应主体中,可以使用 XML 格式来传输和存储数据。
XML 使用标签来描述数据的结构和层次关系。
<person>
、<name>
和<email>
属于不同的标签,用于定义数据的不同部分。例如,您可以将整个
<person>
元素视为一个人的信息对象,其中包含一个名称字段和一个电子邮件字段。可以根据实际需求在 XML 主体中添加更多的字段和数据。XML 是一种通用的数据表示格式,在很多场景中使用,如数据交换、配置文件、Web服务等。处理 XML 数据时,通常使用相应的解析器或库来读取和解析 XML。
- 文件上传:
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg
<binary data>
在请求主体示例中,
------WebKitFormBoundaryABC123
是一个表单数据的分隔符,用于标识不同字段数据的起始位置和结束位置。
Content-Disposition: form-data; name="file"; filename="example.jpg"
是用于描述字段数据的元数据,其中:
form-data
表示这是一个表单数据字段。name="file"
表示字段的名称为 “file”。filename="example.jpg"
表示字段中包含的文件的原始文件名为 “example.jpg”。
Content-Type: image/jpeg
指定了字段中包含的文件类型为image/jpeg
,也就是 JPEG 图像文件类型。
<binary data>
表示在实际的请求主体中,这里应该包含二进制数据,即实际的文件内容,通常在文件上传场景中。要实际上传文件,需要将
<binary data>
替换为文件的二进制内容。通常,这些二进制数据以字节形式存在,可以通过文件读取操作将文件内容读取为二进制,并放置在请求主体的相应部分。
请注意,请求主体的内容和格式取决于具体的应用场景和需求。在发送请求时,可以根据需求设置请求主体,并在请求头部中明确指定Content-Type字段,以便服务器正确解析和处理请求主体。
服务器在接收到请求后,会解析请求主体并根据应用逻辑进行相应的处理。
响应报文
HTTP响应报文是在客户端发送请求后,服务器返回给客户端的包含响应状态码
、响应头
和响应体
等信息的数据。以下是HTTP响应报文的一般结构:
状态行(Status Line):
状态行包含协议版本
、响应状态码
和响应状态
消息。例如:
HTTP/1.1 200 OK
协议版本
和请求报文中的协议版本一样,都是表示使用http协议的版本
响应状态码
响应状态码是在HTTP响应中表示请求处理结果的数值,用于指示请求的成功、失败或其他特殊情况。每个响应状态码都有特定的含义和语义。
HTTP协议定义了一组标准的响应状态码,以下是一些常见的响应状态码及其含义:
- 1xx:信息
消息 | 描述 |
---|---|
100 Continue | 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 |
101 Switching Protocols | 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 |
- 2xx:成功
消息 | 描述 |
---|---|
200 OK | 请求成功(其后是对GET和POST请求的应答文档。) |
201 Created | 请求被创建完成,同时新的资源被创建。 |
202 Accepted | 供处理的请求已被接受,但是处理未完成。 |
203 Non-authoritative Information | 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。 |
204 No Content | 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 |
205 Reset Content | 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 |
206 Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它。 |
- 3xx:重定向
消息 | 描述 |
---|---|
300 Multiple Choices | 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 |
301 Moved Permanently | 所请求的页面已经转移至新的url。 |
302 Found | 所请求的页面已经临时转移至新的url。 |
303 See Other | 所请求的页面可在别的url下被找到。 |
304 Not Modified | 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 |
305 Use Proxy | 客户请求的文档应该通过Location头所指明的代理服务器提取。 |
306 Unused | 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。 |
307 Temporary Redirect | 被请求的页面已经临时移至新的url。 |
- 4xx:客户端错误
消息 | 描述 |
---|---|
400 Bad Request | 服务器未能理解请求。 |
401 Unauthorized | 被请求的页面需要用户名和密码。 |
401.1 | 登录失败。 |
401.2 | 服务器配置导致登录失败。 |
401.3 | 由于ACL对资源的限制而未获得授权。 |
401.4 | 筛选器授权失败。 |
401.5 | ISAPI/CGI应用程序授权失败。 |
401.7 | 访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS 6.0所专用。 |
402 Payment Required | 此代码尚无法使用。 |
403 Forbidden | 对被请求页面的访问被禁止。 |
403.1 | 执行访问被禁止。 |
403.2 | 读访问被禁止。 |
403.3 | 写访问被禁止。 |
403.4 | 要求SSL。 |
403.5 | 要求SSL 128。 |
403.6 | IP地址被拒绝。 |
403.7 | 要求客户端证书。 |
403.8 | 站点访问被拒绝。 |
403.9 | 用户数过多。 |
403.10 | 配置无效。 |
403.11 | 密码更改。 |
403.12 | 拒绝访问映射表。 |
403.13 | 客户端证书被吊销。 |
403.14 | 拒绝目录列表。 |
403.15 | 超出客户端访问许可。 |
403.16 | 客户端证书不受信任或无效。 |
403.17 | 客户端证书已过期或尚未生效。 |
403.18 | 在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS 6.0所专用。 |
403.19 | 不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS 6.0所专用。 |
403.20 | Passport登录失败。这个错误代码为IIS 6.0所专用。 |
404 Not Found | 服务器无法找到被请求的页面。 |
404.0 | (无)–没有找到文件或目录。 |
404.1 | 无法在所请求的端口上访问Web站点。 |
404.2 | Web服务扩展锁定策略阻止本请求。 |
404.3 | MIME映射策略阻止本请求。 |
405 Method Not Allowed | 请求中指定的方法不被允许。 |
406 Not Acceptable | 服务器生成的响应无法被客户端所接受。 |
407 Proxy Authentication Required | 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 |
408 Request Timeout | 请求超出了服务器的等待时间。 |
409 Conflict | 由于冲突,请求无法被完成。 |
410 Gone | 被请求的页面不可用。 |
411 Length Required | "Content-Length"未被定义。如果无此内容,服务器不会接受请求。 |
412 Precondition Failed | 请求中的前提条件被服务器评估为失败。 |
413 Request Entity Too Large | 由于所请求的实体的太大,服务器不会接受请求。 |
414 Request-url Too Long | 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。 |
415 Unsupported Media Type | 由于媒介类型不被支持,服务器不会接受请求。 |
416 Requested Range Not Satisfiable | 服务器不能满足客户在请求中指定的Range头。 |
417 Expectation Failed | 执行失败。 |
423 | 锁定的错误。 |
5xx:服务器错误
消息 | 描述 |
---|---|
500 Internal Server Error | 请求未完成。服务器遇到不可预知的情况。 |
500.12 | 应用程序正忙于在Web服务器上重新启动。 |
500.13 | Web服务器太忙。 |
500.15 | 不允许直接请求Global.asa。 |
500.16 | UNC授权凭据不正确。这个错误代码为IIS 6.0所专用。 |
500.18 | URL授权存储不能打开。这个错误代码为IIS 6.0所专用。 |
500.100 | 内部ASP错误。 |
501 Not Implemented | 请求未完成。服务器不支持所请求的功能。 |
502 Bad Gateway | 请求未完成。服务器从上游服务器收到一个无效的响应。 |
502.1 | CGI应用程序超时。 |
502.2 | CGI应用程序出错。 |
503 Service Unavailable | 请求未完成。服务器临时过载或宕机。 |
504 Gateway Timeout | 网关超时。 |
505 HTTP Version Not Supported | 服务器不支持请求中指明的HTTP版本。 |
一般常用的状态码
- 200 OK:请求成功,服务器成功处理了请求并返回响应。
- 201 Created:请求成功,服务器成功处理请求并创建了新资源。
- 400 Bad Request:请求无效,服务器无法理解或处理请求。
- 401 Unauthorized:未授权,请求要求身份验证。
- 403 Forbidden:禁止访问,服务器拒绝请求的访问权限。
- 404 Not Found:资源不存在,请求的资源无法找到。
- 500 Internal Server Error:服务器内部错误,通常是服务器在处理请求时发生了错误。
- 503 Service Unavailable:服务不可用,服务器当前无法处理请求,可能因为过载或维护等原因。
响应状态
响应状态是指HTTP响应中的状态行,它包含了HTTP版本、响应状态码和响应状态消息。状态行有如下的一般结构:
HTTP/1.1 200 OK
具体解释如下:
- HTTP/1.1:表示所使用的HTTP协议版本。
- 200:表示响应状态码,指示请求成功。
- OK:表示响应状态消息,提供关于响应状态码的简短描述。
响应状态码用于指示服务器对请求的处理结果,响应状态消息则为状态码提供一些解释性的描述。
HTTP协议定义了一组标准的响应状态码(例如,200、404、500等),每个状态码都有特定的含义和语义。
通过查看响应的状态码和状态消息,客户端可以了解请求的处理结果和服务器返回的状态信息,以便采取相应的处理措施。
响应头(Response Headers):
响应头包含响应报文的各种元数据信息。每行一个头部字段。
响应头(Response Headers)是HTTP响应中包含的元数据信息,用于提供关于响应的附加信息和配置参数。响应头以名称-值的形式表示,并位于HTTP响应的头部部分。
以下是一些常见的响应头:
-
Content-Type:指示响应主体的媒体类型,例如text/html、application/json等。
-
Content-Length:指示响应主体的长度(以字节为单位)。
-
Server:指示服务器的软件名称和版本。
-
Date:指示响应的日期和时间。
-
Cache-Control:用于控制缓存行为,例如指示是否可以缓存响应、缓存有效期等。
-
Set-Cookie:向客户端设置一个HTTP Cookie。
-
Location:指示客户端重定向到的URL。
-
Expires:指示响应的过期时间。
-
Etag:用于标识资源的特定版本。
这只是一小部分常见的响应头,实际上还有许多其他的响应头可以用于传递不同的信息和配置。
响应头提供了关于响应的重要信息,客户端可以根据响应头做出相应的处理。例如,根据Content-Type确定如何解析和处理响应主体的内容,根据Cache-Control确定是否从缓存中获取响应等。
空行(Blank Line):
空行用于分隔头部和响应体,由一个回车换行符组成。
响应体(Response Body):
响应体包含服务器返回的实际数据。响应体的内容根据Content-Type指定的媒体类型而定。例如,对于HTML内容,响应体可能包含HTML标记的文本或网页;对于JSON内容,响应体可能包含JSON格式的数据。
以下是一个示例的HTTP响应报文:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Cache-Control: no-cache
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
在实际的开发中,通过解析HTTP响应报文,可以获取服务器返回的状态码、头部信息和响应体数据,并根据需要进行处理。