欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > HTTP协议详解

HTTP协议详解

2025/3/16 19:38:51 来源:https://blog.csdn.net/hyldzbg/article/details/143495086  浏览:    关键词:HTTP协议详解

HTTP协议是什么

HTTP是一个用来进行网络传输数据的应用层协议,也是一种一问一答的结构模型的协议,HTTP的请求的响应格式是有所差别的,HTTP大多是基于传输层的TCP协议实现(HTTP1.0  1.1  2.0都是基于TCP实现,HTTP3.0是基于UDP实现),目前应用应用比较广泛的是1.1和2.0版本。

HTTP协议是文本格式的协议,内容都是以字符串的形式展现,而TCP,UDP,IP...协议都是二进制格式,HTTP响应也是文本格式,但是直接查看往往能看到二进制的数据,因为HTTP响应经常会被压缩,压缩之后,体积变小,传输的时候就可以节省带宽

协议存在的目的是为了让数据可以顺畅的从源头发送到目的,规定参与通信的双方发送数据的格式必须符合HTTP协议的格式,这样就可以让数据流畅的发送的接受,如果双方数据格式不一样,那么互相不认识对方的格式,就像两个不同语言的人交流,也就谈不上传递信息了

HTTP协议的工作过程

在浏览器中输入一个网址或者在网页中进行一些操作(比如点击),浏览器就会给对应的服务器发送一个HTTP请求,服务器在接受到请求后就会对这个请求进行解析然后,计算出对应的响应在返回给浏览器。一问一答是HTTP的一个特点,但是在网络编程中,可以有一问多答,多问一答,多问多答。

HTTP协议请求(Request)

HTTP请求

首行:方法 + url(路径) + 版本

Header:请求的属性,用冒号分割的键值对,键值对之间用\n分割,直到空行表示header部分结束

Body:空行后面的内容都是body,用来存放传输的数据,如果body存在,则在header中就会有一个Content-Length属性来记录Body的长度

URL

url说白了就是我们平时说的网址,互联网上每一个文件都有一个对应的url,这个url就表示这找到这个文件的路径,以下是一个url

它的内容对应如下

协议类型://访问资源需要的凭证信息@服务器地址:端口号/带层次的文件路径?查询字符串#片段标识符
协议类型:一般用的比较多的就是http和https

凭证信息:一般就是一些比如用户名或者密码的1登录信息,但是现在几乎不再用了

服务器地址:可以是IP地址,也可以是域名

服务器端口:通过ip地址只是描述了网络资源在那个主机上,但是找不到是在哪个程序,就需要端口号来进行进一步的确认,url中的端口号可以省略,默认是访问80端口,https默认的端口号是443

带层次的文件路径:描述了你要访问服务器的哪个资源,虽然这样的写法看起来很像一个目录的写法,但是在服务器中不一定是以目录的形式来存储资源的

查询字符串(query string):是一种键值对结构的数据,以“?”开头使用“&”来分割,键和值之间用=连接,query string里可以包含多个键值对,值甚至可以很长,query string中的键值对都是自定义的不像header中的是标准规定的

片段标识符:用于页面之间的跳转,有的网页比较长,就可以分成多个片段,通过片段标识符进行内部的跳转

不过我们再访问一些网站时可能看到query string中有类似0%2B0%2C这样的值,其实这是因为我们的url中有一些特殊字符/,&,@,?等这些字符已经有了特殊的含义所以不能随便使用,但是如果我们的query string中又要使用这些符号就要进行urlencode转义处理,所以在使用url时要记得对query string中的一些字符进行urlencode处理,防止浏览器解析错误

请求方法(method)

http的方法位于首行的开头

GET:获取资源

POST:传输实体主体

PUT:传输文件

HEAD:获得报文首部

DELETE:删除文件

OPTIONS:询问支持的方法

TRACE:追踪路径

CONNECT:要求用隧道协议连接代理

LINK:建立和资源之间的联系

UNLINE:断开连接关系

 这些方法创建的初衷是为了实现不同功能,但是实际上在运用的过程中渐渐偏离初衷,用的最多的就是GET和POST方法,具体实现什么功能也是由程序员自定义

GET请求

get请求特点:

  1. URL的query string可以是空的
  2. header部分有若干个键值对结构
  3. body为空

 注意//get请求长度最多1024kb这样的说法是错误的,在HTTP的标准定义中没有对url长度进行限制,实际上,url的长度取决于浏览器和服务器本生,不同浏览器的url最大长度不同,但是长度一般都很长,而在服务器段这个长度是可以配置的

POST请求

post请求特点:

  1. URL的query string一般为空
  2. header部分有若干个键值对
  3. body部分一般不为空,body内的数据格式通过header中的content-Type指定,长度由Content-Length指定

GET和POST的区别:

  • GET和POST没有实质性的区别,大部分场景是可以互相替代的
  • GET一般通过query string来传输数据,POST一般通过body来传输数据
  • 一般GET请求会被要求设置成幂等,而POST请求一般不要求
  • GET请求可以被浏览器缓存,可以被保存在浏览器收藏夹里,POST则不会

//其实FGET和POST具体是否幂等,取决与代码的具体实现,只不过RFC标准文档上建议GET请求实现幂等,幂等就是当输入相同时,输出也是稳定的,相当于客户端向服务器传输相同的数据时期望得到的回复是一样的

请求报头(header)

Host

标识服务器主机的地址和端口,地址可以是域名也可以是ip

Content-Type

表示请求的body的数据格式(比如字符集)

Content-Length

表示body中数据的长度,常见格式有以下:

  • application/json

此时传输的数据的格式为json格式,形式就是一个大括号里包含这一些数据,这些数据由键值对的形式表示,键和值之间通过冒号连接,键值对之间由逗号隔开

{username : "zhangsan",password:"123456"}
  • application/x-www-form-urlencoded

通过form表单传输,body中的形式和query string类似就像title=test&content=hello

  • multipart/form-data

也是form表单的格式,需要在 form 标签中加上 enctyped="multipart/form-data"

不同的Content-Type,服务器处理数据得逻辑是不同的,服务器返回数据给浏览器,也需要设置合适的Content-Type,浏览器也会根据不同的Content-Type做出不同的处理

User-Agent

表示浏览器/操作系统的属性

Referer

Referer描述了当前页面是从哪个页面跳转过来的(比如我们再打开一个搜索界面时可能会不小心点击到一些广告链接,此时这个广告链接的HTTP请求可能就会显示Referer:https//www.baidu.com ),如果是直接在地址栏输入url(或者点击收藏夹的按钮)都是没有Referer的

Cookie

cookie是一种浏览器提供的在本地存储数据的机制,cookie往往是从服务器返回的数据也可以是页面自己生成的

  • cookie的存储形式

cookie存储到浏览器所在的主机的硬盘上,并且是按照域名来存储,每个域名都有自己的cookie互不干扰,cookie是按照键值对的形式来存储,这里的键值对和query string的形式差不多.

下面是一个登录界面,当成功登录后浏览器就会存储对应的cookie信息,这也是cookie一个常用的场景,就是保存客户端的登录状态

我们可以看到cookie里存储的就是一堆字符串,客户端就是凭借这个字符串,在服务器中查询对应的用户名和密码,从而判定是否存在该用户

  • cookie的传输形式

首先浏览器向服务器发送一个HTTP请求,服务器返回对应的HTML登录界面,然后用户输入用户名和密码,再向服务器发送请求,如果登录成功服务器就会通过set-cookie返回一个用户的身份标识(相当于一个令牌),接着当用户想要访问这个网站的其他页面时,请求中就会带有这个身份标识,服务器就会通过对应的身份标识返回对应的HTML页面(比如不同的用户的csdn个人主页是不同的)

  • 为什么需要cookie

在程序运行的过程中,有一些数据需要在浏览器这边存储的,并且在后续请求的时候可能还要再次发给服务器,比如刚刚的登录系统,我们不会每跳转到一个页面就输入一次密码,像这种临时的数据,存储在浏览器比较合适。

但是可能还会想到,能不能存储到本地文件中?当然是不太可以的,浏览器为了考虑安全问题(防止某个网页给你的硬盘里下载病毒),禁止网页直接访问你的电脑的本地文件系统,网页代码中也就无法在文件中进行存储了。所以为了安全又能存储数据,就有了cookie(也是按照文件的方式保存,但是浏览器把操作文件的步骤给封装了,网页只能往cookie中存储键值对)

请求正文(body)

正文里主要是存储要传输的数据长度就是报头里的Content-Length,格式就是Content-Type的三种格式

HTTP协议响应(Response)

HTTP响应

首行:方法 + url(路径) + 版本

Header:请求的属性,用冒号分割的键值对,键值对之间用\n分割,直到空行表示header部分结束

Body:空行后面的内容都是body,用来存放传输的数据,如果body存在,则在header中就会有一个Content-Length属性来记录Body的长度

响应状态码(status code)

状态码是反应此次请求是什么状态成功或者失败,失败的原因是什么,HTTP中常见的状态码有200,301,302,403,404,405,500,504以相同数字开头的状态码往往反应的是类似的一类问题

200 OK

表示访问成功

301 Moved Permanently

表示永久重定向,之后的请求都是在一个新的地址

302 Move temporarily

表示临时重定向

403 Forbidden

表示请求被拒绝,一般是因为没有权限

404 Not Found

这个可能会比较常见,表示没有找到资源,比如如果网站的路径输入错误就会报404

405 Method Not Allowed

表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法

500 Internal Server Error

表示服务器内部出现问题,一般可能是代码运行错误

504 Gateway Timeout

表示加载超时,一般是因为服务器负载比较大

这里2xx都表示成功,3xx都表示重定向

//重定向:假如请求中访问的是A这样的地址,响应返回的是一个重定向报文,就会告诉你应该访问B地址,有很多时候,页面的跳转就是通过重定向来完成,可以给旧的地址挂一个重定向响应,访问旧地址的用户就自动跳转到新地址

响应报头(header) 

Content-Type

 text/html : body 数据格式是 HTML

text/css : body 数据格式是 CSS

application/javascript : body 数据格式是 JavaScript

application/json : body 数据格式是 JSON

其他大部分报头和请求的报头一样

发送HTTP请求

发送一个http请求主要有四种方式

  1. 直接在浏览器,地址栏输入url,此时构造一个get请求
  2. html中,一些特殊标签比如,img,a,link,script等,可能会触发GET请求
  3. 通过form表单来触发GET/POST请求(form表单也是一个HTML标签)
  4. 通过Ajax构造一个js对象,发送HTTP请求

这里主要讲述后两种

通过form表单构造HTTP请求

form标签的重要参数

  • action:设置构造的HTTP请求的URL
  • method:设置HTTP的请求方法(form表单只支持GET和POST)

具体实现方法如下

 输入框中的内容就会被构造成HTTP请求的query string(query string 是键值对的形式,key就是其中的name属性,value就是输入框中用户输入的内容)

以上展示的是GET请求,如果要发送的是POST请求,这只需要将method方法改成POST即可

不过相应的数据也会在body中显示

通过ajax构造HTTP请求

form表单有一些缺陷,只支持GET和POST不支持其他方法,而且form会触发页面跳转(即使有时不想跳)

ajax通过js提供的api来构造HTTP请求,针对返回的响应,同样也可以使用js灵活处理,所以ajax相比于form表单来说可能跟灵活一些,我这里是使用的jquery这个第三方库封装的ajax,相比较浏览器原生的api更好用一些。

代码编译:

$.ajax():$是一个变量名(在jquery中的全局变量),通过这个变量来调用一些方法,以此来使用jquery中的api

在js中{}表示对象,{}里面使用的是键值对的方法来描述属性名和属性值,json就处自这个{}里

url:表示数据要发送的路径

type:表示所使用的HTTP方法

suceess:这里的success函数不是立即执行的,而是服务器返回200状态码时才会执行success,但是我们是不知道服务器什么时候会返回200的响应的,所以执行success的时机是不被程序员控制的,而是在特定时候自动被调用,所以这里的success就是一个回调函数(这里的success也可以看作是一个键值对,属性名是success,属性值是一个匿名函数)

function(){}:用来对服务器返回的数据进行相应的业务处理

body:这个body是一个变量,也可以是其他自定义名字,用来接受服务器返回过来的数据,success接收到后会对body里的数据做出响应处理

ajax会以JSON格式发送数据,服务器在接受到数据时也是一个JSON格式的字符串,需要会对这个字符串进行解析,然后转换成一个Java能识别的class类对象(以JAVA做例)

//如果想发送的是一个POST请求,也只需要更改type属性

以上就是博主对HTTP知识的分享,在之后的博客中会陆续分享有关HTTP的其他知识,如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主,也希望可以多多支持博主!!🥰🥰

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词