HTTP协议——请求报文和响应报文的结构

一、HTTP报文结构

HTTP有两类报文:

  • 请求报文—— 从客户向服务器发送请求报文

  • 响应报文—— 从服务器到客户的回答

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNxv7Yjd-1689937530252)(../images/image-20230711205923352.png)]

HTTP请求报文和响应报文都是由三个部分组成的。可以看出,这两种报文格式的区别就是开始行不同。

  • 开始行,用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行(Request-Line),而在响应报文中的开始行叫做状态行(Status-Line)。在开始行的三个字段之间都以空格分隔开,最后的“CR”和“LF”分别代表“回车”和“换行”。
  • 首部行,用来说明浏览器、服务器或报文主体的一些信息。首部可以有好几行,但也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
  • 实体主体(entity body),在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。

由于HTTP是面向文本的(text-oriented),因此在报文中的每一个字段都是一些ASCII 码串,因而各个字段的长度都是不确定的

二、HTTP请求报文的方法

2.1 方法

请求报文的第一行“请求行”只有三个内容,即方法,请求资源的URL,以及 HTTP协议的版本。

方法是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的

请求报文中常用的几种方法如下:

方法作用
GET获取资源
POST传输实体主体
PUT上传文件
DELETE删除文件
HEAD和GET方法类似,但只返回报文首部,不返回报文实体主体部分
PATCH对资源进行部分修改
OPTIONS查询指定的URL支持的方法
CONNECT要求用隧道协议连接代理,用来进行环回测试的请求报文
TRACE服务器会将通信路径返回给客户端, 用于代理服务器

为了方便记忆,可以将PUT、DELETE、POST、GET理解为客户端对服务端的增删改查。

  • PUT:上传文件,向服务器添加数据,可以看作增
  • DELETE:删除文件
  • POST:传输数据,向服务器提交数据,对服务器数据进行更新。
  • GET:获取资源,查询服务器资源

三、HTTP响应报文的状态码

3.1 响应状态码

HTTP响应报文的状态行包括三项内容,即 HTTP的版本,状态码,以及解释状态码的简单短语。

下面三种状态行在响应报文中是经常见到的。

HTTP/1.1 202 Accepted           {接受}
HTTP/1.1 400 Bad Request        {错误的请求}
Http/1.1 404 Not Found          {找不到}

状态码(Status-Code)负责表示客户端 HTTP 请求的返回结果、标记服务器端 的处理是否正常、通知出现的错误等工作。状态码(Status-Code)都是三位数字的,分为5大类。这5大类的状态码都是以不同的数字开头的。

类别原因短语
1xxInformational(信息性状态码)接收的请求正在处理
2xxSuccess(成功状态码)请求正常处理完毕
3xxRedirection(重定向状态码)需要进行附加操作以完成请求
4xxClient Error(客户端错误状态码)服务器无法处理请求
5xxServer Error(服务器错误状态码)服务器处理请求出错

仅记录在 RFC2616 上的 HTTP 状态码就达 40 种,若再加上 WebDAV(Web-based Distributed Authoring and Versioning,基于万维网 的分布式创作和版本控制)(RFC4918、5842) 和附加 HTTP 状态码 (RFC6585)等扩展,数量就达 60 余种。但是,实际上经常使用的大概只有 14 种

查询状态码的建议网址主要有:

3.2 常见状态码

2xx 为开头的都表示 请求成功响应。

状态码简单短语含义
200OK成功响应
204No Content请求处理成功,但是没有资源可以返回
206Partial Content客户端进行范围请求,由Content-Range 指定范围的实体内容。服务器对资源某一部分进行响应

3xx 为开头的都表示 浏览器需要进行附加操作以完成请求

状态码简单短语含义
301Moved Permanently永久性重定向,该状态码表示请求的资源已经重新分配 URI,以后应该使用资源现有的 URI
302Found临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
303See Other该状态码表示由于请求对应的资源存在着另一个 URI,客户端应使用 GET 方法定向获取请求的资源。
304Not Modified该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。
307Temporary Redirect临时重定向。该状态码与 302 Found 有着相同的含义, 会遵照浏览器标准,不会从POST变成GET

当 301、302、303 响应状态码返回时,几乎所有的浏览器都会把 POST 改成 GET,并删除请求报文内的主体,之后请求会自动再次发送。

301、302 标准是禁止将 POST 方法改变成 GET 方法的,但实际使 用时大家都会这么做。

4xx 的响应结果表明客户端是发生错误的原因所在。

状态码简单短语含义
400Bad Request该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
401Unauthorized该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
403Forbidden该状态码表明对请求资源的访问被服务器拒绝了。(原因很有可能是客户端没有访问权限)
404Not Found该状态码表明服务器上无法找到请求的资源。(也可以在服务器端拒绝请求且不想说明理由时使用)

5xx 为开头的响应标头都表示服务器本身发生错误

状态码简单短语含义
500Internal Server Error该状态码表明服务器端在执行请求时发生了错误。
503Service Unavailable该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

四、HTTP报文的首部字段

4.1 HTTP首部字段

HTTP首部字段是构成HTTP报文的要素之一。在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分 隔。

首部字段名: 字段值

另外,字段值对应单个 HTTP 首部字段可以有多个值,举个例子

Keep-Alive: timeout=15, max=100

4.2 HTTP首部字段类型

HTTP 首部字段根据实际用途被分为以下 4 种类型。

HTTP首部字段含义
通用首部字段(General Header Fields)请求报文和响应报文两方都会使用的首部。
请求首部字段(Request Header Fields)从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加 内容、客户端信息、响应内容相关优先级等信息。
响应首部字段(Response Header Fields)从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加 内容,也会要求客户端附加额外的内容信息。
实体首部字段(Entity Header Fields)针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更 新时间等与实体有关的信息。

需要注意的是,HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应 用上,会出现各种非标准的首部字段。

参考资料

Hypertext Transfer Protocol (HTTP) Status Code Registry (iana.org)

计算机网络(第7版)-谢希仁 (书籍)

图解HTTP.上野宣 (书籍)

看完这篇HTTP,跟面试官扯皮就没问题了 CSDN博客

HTTP 响应状态码 - HTTP | MDN (mozilla.org)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值