http协议的报文格式

一.http请求

目录

一.http请求

1.首行

1.1方法

1.1.1.GET方法 

1.1.2.POST方法

1.1.3.POST和GET的区别?

1.2URL

1.3版本号

2.请求头(header)

2.1  Host

2.2 Content-Length

2.3 Content-Type

2.4 User-Agent

2.5 Referer

2.6 Cookie

3.空行

4.正文(body)

二.http响应

1.首行

状态码

2.响应头(header)

3.空行

4.正文(body)


我们可以使用抓包工具对http请求进行抓包,我这里是使用了Fiddler对于我自己做的一个注册功能进行了抓包,请求结果如下:

1.首行

首行是由  方法  + url  +  版本号 构成的。

1.1方法

例如上述图片中的POST,这就是方法名。

除此之外,还有其他的方法。具体如下:

其中最常使用的就是GET和POST请求了

1.1.1.GET方法 

GET是最常用的HTTP方法.常用于获取服务器上的某个资源.

在浏览器中直接输⼊URL,此时浏览器就会发送出⼀个GET请求. 

另外,HTML中的link,img,script等标签,也会触发GET请求.

GET请求要想传递参数一般都是使用URL的query string,(这个query string是什么,在下面就会提到)一般不使用Body。当然,这不是硬性要求,要是想使用body也没问题,就是不符合编码规范。

1.1.2.POST方法

POST方法也是⼀种常见的方法.多用于提交用户输入的数据给服务器(例如上述的注册).

 通过HTML中的form标签可以构造POST请求,或者使用JavaScript的ajax也可以构造POST请求。

1.1.3.POST和GET的区别?

a.语义上的区别。GET请求一般用于从服务器获取一些资源或数据,而POST请求则是向服务器提交一些数据。

b.携带数据的方式。GET请求传递参数一般都是在URL中。而POST请求传递数据一般在正文(body)中。

当然了,上述我的用词都是“一般”,因为这都不是硬性要求,本质上,GET和POST以及其他的方法都没有本质区别。你当然可以在编写“注册”这样提交数据的请求时使用GET+携带body的方式,程序不会出错,但这就是不合规范,显得“不专业”~~

至于其他方法,使用的情况太少,此处不谈。区别仍在语义。

1.2URL

上述首行URL的位置如下:

这里使用  我在CSDN搜索框搜索了jvm   的URL来举例。

https://so.csdn.net/so/search?spm=1000.2115.3001.4501&q=jvm&t=&u=

其中 https 为协议名。

so.csdn.net为域名,也就是服务器地址,域名和IP地址可以通过DNS进行转换。注意,我们要访问互联网上的一个资源,或者说一个程序,不仅需要ip地址,还需要程序所在的端口号。这里的URL中没写端口号,浏览器会自动添加默认的端口号,这个默认的取决于协议是什么。http协议默认就是80端口,https协议,默认为443端口。

/so/search  就是要访问的接口所在层级。

?spm=1000.2115.3001.4501&q=jvm&t=&u=  以“?”为分割,后面就是查询字符串 query string。

它的作用是对要访问的资源进行补充说明,也是键值对结构,键值对之间用 & 分割,键和值之间用 = 进行分割。在开发时,经常使用它来向服务器传递参数

1.3版本号

用来区分http的版本。例如http1.1,http2.0,http3.0等。

http1.1使用的是最多的,是基于TCP开发的。什么是TCP?请看在下的另一篇文章TCP报文格式与十大核心机制-CSDN博客

http3.0是基于UDP进行开发的。

2.请求头(header)

请求头有很多,这里我们谈谈几个与开发紧密相连的。

2.1  Host

如下图

描述了当前请求要访问的服务器在哪里。绝大部分情况下,Host和URL部分的ip地址(域名)都是一致的。服务器收到请求后可以验证两者是否相同来进行校验请求的真实性。

2.2 Content-Length

如下图

记录了请求中body的长度。请求如果有body一定会有Content-Length。没有body一定没有Content-Length

2.3 Content-Type

我这里没有特意定义请求数据的格式,浏览器默认生成了form表单格式,并进行了encode。

记录了请求中body的类型。常见有如下几种:

HTML:text/html

CSS: text/css
JS:   application/javascrip
JSO:application/json
图片
image/png
image/jpg

2.4 User-Agent

User-Agent 里面表示了用户使用的设备的浏览器和操作系统的情况

2.5 Referer

描述了当前请求的来源。也就是当前请求是从哪个页面跳转过来的

2.6 Cookie

Cookie是浏览器允许网页在本地硬盘存储数据的一种机制。它也是键值对结构。

他的具体内容是由程序员自己决定的。我这里存储了sessionid,用于验证登录信息。

3.空行

用于分割请求头和body的部分。

那为啥首行和请求头不用分割呢?因为首行是固定格式的,就那些东西。但是请求头是可变动的,有些键值对可能会没有。

4.正文(body)

正文部分的数据格式与Content-Type相对应。数据长度与Content-Length对应。

二.http响应

与上面请求相对应的,这是抓包的响应。

1.首行

首行由协议版本和状态码构成。

状态码
  • 1xx(信息性状态码):表示接收的请求正在处理。
  • 2xx(成功状态码):表示请求正常处理完毕。
  • 3xx(重定向状态码):需要后续操作才能完成这一请求。
  • 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
  • 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误

常见的状态码:

200 OK 表示成功。

404 Not Found 表示要访问的资源没有找到。访问路径无效。

403 Forbidden 表示访问被拒绝。一般常见于访问某些私有的或具有保密性质的资源被拒绝。

405 Method Not Allowed 在开发时,如果请求方法与后端接口不匹配就会出现这样的错误。

下图我使用GET方法的请求访问POST方法的接口,出现405.

 500 Internal Server Error 服务器出现异常。服务器处理逻辑代码抛出异常,但是你没有catch到。

504 Gateway Timeout  访问网关超时,一般出现在服务器资源紧张时。

2.响应头(header)

详见请求头。

3.空行

用于分割响应头和body的部分。与请求中的空行作用相同。

4.正文(body)

响应携带的数据。数据类型与Content-Type有关。

前端js捕获这些数据进行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值