【HTTP协议——八股文(中)篇】

目录

一、Header中的键值对

1.Host

2.Content-Length + Content-Type

 3.User-Agent(简称UA)

 4.Referer

 4.Cookie

 二、HTTP响应

1.状态码

(1).200

(2).404 

(3). 403

(4).405

 (5).500

 (6).504

 (7).302


一、Header中的键值对

在上篇中,我们描述了关于HTTP请求和HTTP响应中都包含哪些部分,下面我们先对Header部分中的数据进行详细剖析。

1.Host

Host表示要访问的服务器主机的地址和端口,这个地址可以是IP地址,也可以是域名,通过DNS域名解析系统分析过后转换成对应的IP地址。

2.Content-Length + Content-Type

这两个属性都是在描述body,倘若请求当中没有body(GET),也就不需要这两个字段,一般情况下是POST带body而GET不会带body,一般的登录场景都会基于POST来实现,那么我们考虑为什么使用POST实现而不使用GET呢?

答:对于登录这样的场景来说,登录操作会涉及到将用户名和密码传递给服务器,如果使用GET来实现,那用户名和密码习惯性的就会放到URL的query string当中来传递,此时浏览器的地址栏路径就会变得很长一串,并且如果没有对密码进行加密处理,那么明文的密码就会暴露在URL当中,然而当我们使用POST请求时,用户提交的信息就会保存到body当中,不会暴露在外面。

常见的Content-Type:

①、application/x-www-form-urlencoded:form表单提交的数据格式

②、multipart/form-data:通常用于用户提交文件时使用

③、application/json:数据为 json 格式

扩展知识:Content-Length有何作用?

首先我们要明确的一点就是HTTP也是基于TCP的协议,那同样的也是一个面向字节流的协议,面向字节流就会牵扯到一个很重要的问题,那就是粘包问题,因此就需要划分包与包之间的边界,有两种方式来划分边界:一是使用分隔符,二是使用长度。这两种方式在HTTP协议中都有所体现,如果有若干个GET请求到达TCP接收缓冲区,应用程序读取的时候,就以空行作为分隔符来划分包与包之间的边界。如果有若干个POST请求,到达TCP接收缓冲区,这个时候,空行后面还有body,当应用程序读取到空行的时候,就根据Header当中Content-Length表名的长度来读取若干长度的数据。

 3.User-Agent(简称UA)

UA表示的是当前用户所使用的设备以及软件环境。

UA的意义是什么呢?

在互联网发展阶段,浏览器也正处于发展阶段,从起初的只能显示文本-》显示图片-》显示复杂的样式-》加载js实现交互-》支持各种多媒体......这就存在一个问题,对于用户所使用的的版本不同,服务器需要返回怎样的页面给用户?例如拿了个大哥大想让服务器给他返回王者荣耀的登录页面,显然这是不现实的,这个时候UA就显得十分重要的,UA当中就包括了我当前所使用的的设备是什么、操作系统是哪个版本、浏览器是哪个版本等信息,服务器就根据UA当中的信息知道了该返回一个怎样的数据给用户,以不至于用户这边不会因为太落后而导致收到错误的信息。

在当今,上述UA的意义已经不大了,当下主流的浏览器的功能差异已经微乎其微,不存在兼容性的问题,但是又有了新的意义,那就是PC端和移动端的存在,PC端的页面和移动端的页面布局显然是相反的,那么这个时候就需要借助UA当中的信息来明确返回的数据是应该适用于PC端呢,还是适用于移动端呢,这样在服务器这边就会存在两种不同的返回数据,分别对应PC端和移动端。当然也有比较高级一点的响应式布局,就不必有两种不同的数据来进行区别返回,而是根据当前浏览器窗口宽度的大小自适应,自动修改样式布局。

 4.Referer

Referer表示这个页面从哪个页面跳转过来的。

Referer并不是一定会有的,比如当我们在地址栏直接输入地址的时候,就不会存在Referer这个字段。

Referer的意义又是什么呢?

对于广告页面来说,Refere就是很重要的字段,表示用户是通过哪个页面访问到我这个页面的,比如说通过百度、搜狗等等这些页面跳转到我这个页面的,那我就要对百度、搜狗这些页面付费,常见的付费方式就是CRC(按点击量付费),拿百度举例,通过百度跳转过来的广告页面,广告主和百度这边都会统计点击量,之后按照点击量付费即可,那么聪明的老六就会想到,那我一直点进去退出来点进去退出来,写这样一个脚本岂不是美哉?那这个时候就说明你这个老六还是个很菜的老六,你能想到的,百度程序猿想不到吗?你这是在公然挑战百度程序猿的技术嘛?有个名词叫做ROI投入产出比,对于广告主来说,这光有点击量没见有啥收益呀,这不纯纯骗我钱呢嘛?那我还能跟你百度合作不成?这个时候程序猿就会采取一些必要的手段来反制这个老六,常见的手段就是限制点击生效量,第一下,第二下还算进点击量,当你反复点击,就不再计入点击量当中~~广告主这边根据Referer这个字段统计分别从各个页面跳转了多少次,从而对各大平台核对信息付费。

 4.Cookie

Cookie是浏览器给页面提供的一种能够持久化存储数据的机制。

通常情况下,我们需要将某些数据保存到本地,但是一旦给浏览器访问磁盘的权限,那么某些页面的恶意代码就会对我们本地的磁盘进行篡改或删除,但是我们又不得不存储一些数据到本地,那么怎么办呢?此时就需要用到Cookie这样的机制,Cookie机制就是为浏览器中要访问的页面单独开辟一些空间,将需要存储的数据放在这个空间当中,页面js所能操作的范围仅仅局限于这个空间,对于这个空间外的磁盘将不能进行访问。

Cookie的具体组织格式:

1.先按照域名来组织,针对每个域名,分别分配一个空间,拿我本地的浏览器为例:

 2.一个空间当中,又会按照键值对的方式来组织数据~

 Cookie的具体机制:

Cookie数据从何而来?以我去医院看病为例:

去医院看病,第一件事是挂号,在挂号处需要使用就诊卡,往就诊卡当中充值进行在医院的一系列消费,然后到各处使用就诊卡进行看病,这个就诊卡就相当于你本地为该页面开辟出来的单独空间,这个就诊卡当中就存储着你的各种信息,比如名字、年龄、既往病史,当医生刷你的就诊卡的时候,就会看到你的所有个人信息,并参考你的个人信息对症下药,假设需要抽血化验,就拿着就诊卡再去抽血处,继续刷就诊卡,这个时候,护士就会针对你卡上的信息知道为你抽的血做什么检查~~这张就诊卡,就是Cookie!拿着这张卡就可以在医院的各个部门进行使用,而不用反复的想医生告知你的信息~

虽然就诊卡上可以存储一些信息,但是保存的数据量是有限的,对于这张卡,有可能只会单纯的存储一个身份标识,对于你这个身份所对应的具体信息,还是存在服务器上的。这些关键信息,存储在服务器上,管这个东西称为“Session”-会话。服务器端管理着很多的session,每个session里面都存储了用户的关键信息(基本信息,本次要做的检查、既往病史等等),每个session也有一个sessionId(会话标识),就诊卡上其实就是存储的是这个会话的Id。通过刷卡,就能根据卡中保存的sessionId来获取该用户对应的会话,进一步获取到用户的详细信息。

注意:Cookie这里存的键值对,也是和querystring类似的,也都是程序猿自定义的~

 Session又如何理解?

服务器上保存用户信息这样的机制就称为Session会话。

对于每个浏览器上的Cookie,都会保存很多页面对应的SessionId,当访问某个页面时,就会带着Cookie当中的Sessionid进行访问,服务器这边根据SessionId对用户的身份信息进行核验,并对该SessionId所对应的Session会话进行一些列的操作。

 二、HTTP响应

1.状态码

对于HTTP提供的状态码是有很多的,不同的状态码对应不同的状态信息。下面罗列几种常见的状态码:

(1).200

200表示Ok,浏览器很顺利的就从服务器当中获取到了想要的内容。

(2).404 

404表示Not Found,说明浏览器所想要访问的资源不存在,一般有两种可能,一是浏览器地址栏输入有误,二是服务器将该资源已删除。

(3). 403

403表示For bidden,意思是确实该资源存在,但是没有权限访问。这种情况多出现在访问私有资源的时候。

(4).405

405表示 Method Not Allowed,这种情况说明当你使用GET请求来访问只支持POST请求的方法的时候,就会返回405。

 (5).500

500表示Internal Server Error,这个状态码的出现就意味着服务器出现了问题,因此导致访问失败。

 (6).504

504表示Gateway Timeout,意味着服务器此时过于繁忙,没有处理你的请求,导致等待时间过长。

 (7).302

302表示Move temporaily,意思是重定向,当出现302的时候,就意味着页面发生了跳转,同时在HTTP响应的Header当中会出现一个location字段,这个字段对应的 Value就表示从哪个页面跳转而来。对于我们日常所能见到的场景当中,登录是最典型的302重定向页面,当登录成功的时候,页面就会从登录页面跳转到主页面。

 小结:面试当中会问到“请说出常见的几个状态码,并说明其含义”~

2开头,都属于成功,例如200;

3开头,都属于重定向,例如302;

4开头,都属于客户端这边出现了错误,例如404(资源不存在)、403(访问权限受限);

5开头,都属于服务器这边出现了错误,例如500(服务器故障)、504(服务器繁忙)。

特殊的一个状态码:418(彩蛋)~~~强烈不建议使用彩蛋,且用且珍惜~~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值