http协议

前置知识

1.什么是http协议?

答:http协议是处于应用层的一个协议,用来约定数据在网络传输中的格式等

2.使用场景?

答:网页和服务器的交互、手机app和服务器的交互

3.如何学习http协议格式?

答:学习一个协议,就要认识它的报文结构;我们可以通过“抓包”工具,就可以捕获到http协议的请求报文和响应报文的内容

4.一条http请求和响应是什么样的?

答:

目录

一、http请求报文

1.请求报文格式

1.1.首行

1.2.请求头(header)

1.3.空行

1.4.正文body

2.请求报文内容

2.1.URL格式内容

2.2.URL encode

2.3.请求的方法

2.4.请求报头header

二、http响应报文

1.响应报文格式

1.1.首行

1.2.响应报头header

1.3.空行

1.4.正文

2.响应报文内容

2.1.状态码


一、http请求报文

这里我们介绍两个部分,第一部分是http请求报文的格式,第二部分是格式中的每个内容。

1.请求报文格式

这里的内容比较简单,就介绍报文有哪些部分组成,具体每个部分的内容后面介绍

http请求报文=首行 + 请求头 + 空行 + 正文body

先通过抓包工具观察一个抓到的http请求

正文body不是所有的请求都会有

1.1.首行

在首行中,也就是第一行,又包含了三个部分:请求的方法、请求的URL、请版本号,这三部分之间使用空格分隔

 

(1)请求的方法

例如:POST或者GET

方法表名该http请求是要做什么?要从服务器中获取什么数据

(2)请求的URL

url就是要请求的网址

(3)版本号

版本号也就是使用的http协议版本

1.2.请求头(header)

(1)对于请求头,从第二行开始,到空行位置。请求头由一个个键值对构成

(2)键值对也就是一个键对应一个值,中间使用冒号分隔,每对键值对在不同行

1.3.空行

(1)空行就是空着的一行,类似换行,如果没有正文body,空行肉眼是看不出来的。

(2)空行也是一定会存在的

1.4.正文body

(1)对于正文来说,是否有都是可选择的

(2)正文里面的内容可以是任意的语言、格式、数据、字体、图片等,也可以出现空行

2.请求报文内容

这一部分,就要介绍一个请求报文中,每个部分的内容代表什么或者是什么了

2.1.URL格式内容

这里介绍的url就是指http请求的首行中的url,其实也就是一个网址,通过请求这个网址,就可以打开特定的网址。

url格式=协议名称 + 身份认证信息 + ip地址/域名 + 端口号 + 路径 + 查询字符串 + 片段标识符

以上一共七个信息,但不是每个信息都会存在,也有一些是被废弃的。

(1)协议名称

比如:https://,描述了url接下来要做什么

(2)身份认证信息

这一栏是很古老的写法,现在一般都不会有这个信息了,了解就好。

(3)ip地址/域名(必要)

也称为服务器地址,表示要访问哪一个服务器。

(4)端口号

端口号可以省略不写,浏览器会自动设置一个默认的端口

对于不同的协议,分配的端口号也有差异

(5)路径(必要)

路径,就描述了要访问服务器的哪个资源。

例如一个文件的绝对路径一样,可以确定唯一的一个资源

(6)查询字符串(query string)(必要)

查询字符串,就是请求中的参数,描述了客户端需要向服务器发送的数据/内容

query string中的内容也是一些键值对,键值对的内容都是由程序员自己定义。

又比如,我们去搜索鲜花:我们请求的关键字就会存在于query string中

(7)片段标识符

这一部分内容不是很重要,一般出现在有目录的网页中,每点击一次目录,这里的值都会发生变化。

(8)小结

对于url,我们重点掌握:协议名称 + ip地址 + 带层次的文件目录 + 查询字符串

2.2.URL encode

这里的内容也是针对请求首行中的url的query stirng,也就是针对query string中键值对中的value值,需要对value值进行转义。

(1)encode定义

就是要针对url中的特殊字符按照encode规则进行转义

(2)为什么要转义

在url中,或有很多的特殊字符,比如:/&等,如果这些字符串不做处理出现在query string中的value里,就会是url的解析出现问题,所以要进行转义。

并且,汉字也会进行转义

(3)转义的基本规则

如果在url中看到了很多%,就说明是经过转义的。

一般按照utf-8进行转义,转义后,每个字节前面就会加上一个%,

2.3.请求的方法

这里要介绍的部分位于请求首行中的第一部分:方法,前面已经见过了POST方法和GET方法,接下来,介绍更多的方法。

(1)方法总览

方法说明支持的http协议版本GET
GET 获取资源1.1、1.1
POST传输实体主体1.0、1.1
PUT传输文件1.0、1.1
HEAD获取报文首部1.0、1.1
DELETE删除文件1.0、1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINK断开连接关系1.0

方法的作用,就描述了该请求要干什么,是一个动作,并不是直接包含请求的内容。

比如,GET,就表明该请求需要获取资源,但是该请求就一定得获取资源吗?都不一定的。

(2)重点方法

上述看似有很多方法,其实就只需要掌握几个即可。

GET、POST这两个是涵盖了99.99%的请求,其中GET又占了90%。

PUT方法和POST方法类似,是用来给服务器提交数据的;

DELETE方法和GET类似,但是没有正文body,纯使用query string。

(3)POST的场景

几乎很多请求的方法都是GET,POST的请求都非常少了,不过有两个场景还是使用POST

1)登陆场景

2)上传文件

(4)如何构造http请求

GET请求:

1)浏览器地址栏直接输入url或者点击收藏夹中的网址

2)网页html中的一些特殊的标签

3)表单

4)通过Js构造

POST请求:

1)表单

2)js

(5)GET和POST的区别(重点面试题)

GET和POST从本质上来说,没有什么区别;GET的场景,使用POST也OK,PSOT的场景,使用GET也没问题

但是从使用习惯上有区别

1)从语义上来说,GET表示“获取数据”,POST表示“提交数据”

2)在传递数据的时候,GET通常使用query string,POST通常使用body

3)服务器对于请求的设计,GET请求经常设计成“幂等”,而POST不要求“幂等”

4)GET请求的结果,可以被缓存,也可以被浏览器搜藏夹搜藏,但POST一般不行

(6)一些错误理解POST和GET区别的说法

1)POST比GET安全

安全与否,不看密码啥的是否显示在屏幕上,而是看是否加密

2)GET传输的数据量比较有限、比较短;POST传输的数据量比较长,没有限制。

其实,GET中的url长度是没有限制的

3)GET只能传输文本数据,POST可以传输文本,也能传输二进制

其实都可以

2.4.请求报头header

请求报头中,都是由键值对构造,每个键值对表示的意义都不一样,下面介绍几个典型代表的键值对

(1)Host

含义:请求对应主机的ip和端口

这里的值一般和url中的ip是一样的

比如:

也有不一样的情况:

比如通过代码构造http请求,url中写的是ip,而host中写的是域名 

(2)Content-Length和Content-Type

Content-Length:表示body中的数据长度,如果不存在body,就不会存在这个键值对

作用:可以解决粘包问题,知道一个http请求是多长

Content-Type:表示body中的数据格式

作用:知道了类型,就可以去解析。

(3)User-Agent(UA)

含义:包含了浏览器版本和操作系统版本,就描述了用户使用什么样的设备打开该网页

早期作用:用来兼容不同版本的浏览器。例如:可以根据UA来给用户返回兼容的浏览器版本。因为有的可能是只有文字、有的会有图片、甚至还能交互等。

现在的作用:用来区分电脑端和手机端。因为端不同,能接受的网页大小也不同。

(4)Referer

含义:里面的值可以反应当前的页面是从哪一个页面跳转过来的。如果没有跳转,这该值不存在。

应用场景:可投放在广告上,该页面是从哪一个浏览器跳转过来的,都可以清晰的记录下来。

(5)Cookie(最重要)

为什么存在cookie?

一个网页不能直接访问客户端的硬盘,因此不能将一些必要的信息存储在客户端这边,所以浏览器就提供了一种机制:cookie。允许将一些信息存储在cookie中,进而将cookie保存在客户端硬盘上

浏览器会针对不同的域名,也就是每一个网站,都有一份Cookie文件,不同网站之间的Cookie互相不影响。而且Cookie里面存储的是键值对,每个键值对的是什么意思,是程序员自己定义的。

Cookie是啥?

 Cookie是浏览器本地存储数据的一种机制

Cookie从哪里来?

当浏览器第一次访问一个网站时,此时对应的cookie是空的;当服务器返回http响应时,就会将响应的cookie带回,并且保存在浏览器上。因此,cookie是网站服务器带回的,存在http响应的header中,在Set-Cookie上

Cookie怎么存的?

 按照不同的域名,分别存储在硬盘上。不同域名之间的Cookie互不干扰。对于里面的键值对和存储文本都是用户自定义的

Cookie到哪里去?

此时浏览器已经保存了响应网址的Cookie值,当该浏览器再次访问该网站时,就会将cookie值保存在http请求的header中,一起发送给服务器。

为什么还要将Cookie返回给服务器?

Cookie里面可以存储每个客户端选择的信息。比如:服务器第一次将Cookie保存在客户端浏览器上时,浏览器就知道了服务器提供的信息有哪些,当浏览器再次访问服务器时,就可以选择适合自己的一个信息去访问。相当于是让每个客户端保存自己的偏好。

Cookie的重要键值对

(1)Cookie里面有一个很重要的键值对,成为key,是用来标识用户信息的身份信息的,就比如身份证或者就诊卡。

(2)在Cookie里面称为会话Id(sessionId)和会话(session),通过http请求中的sessionId,网页就可以响应回来相应的会话

(3)比如,当登陆上一个网页后,一定时间在打开该网页,就是直接展示登陆后的页面,不需要再次选择登陆,这就是Cookie的一个这样应用场景,称为自动登陆。

二、http响应报文

对于http响应报文,很多内容跟请求中的是一样的,所以重复的就不会再概述一遍,只会介绍和请求中不一样的。

1.响应报文格式

同样,对于响应报文来说,也由四个部分组成:首行 + 响应报头header + 空行 + 正文

每个部分和请求中的大同小异,粗略介绍

1.1.首行

这里和请求报文的首行不太一样了,响应报文的首行由三部分组成:版本号 + 状态码 + 状态码的描述

(1)版本号

这里的版本号和请求首行中的一样,都是指http协议的版本

(2)状态码

状态码,就是一个数字(三位数),描述了http请求是否成功,表示该响应是否成功

(3)状态码的描述

这里就是对状态码的描述,成功一般就是OK,失败一般就是有Not Found,这些都是程序员可自己定义的

1.2.响应报头header

这里和请求中的报头一样,都是由一些键值对组成

1.3.空行

和请求中的空行一样

1.4.正文

和请求中的正文一样,内容都是自定义的

2.响应报文内容

2.1.状态码

状态码,描述了本次http请求是否成功和失败的原因,通过保存在http响应中。

(1)200  OK

表示访问成功,最场景的一个状态码

(2)302  Move temporarily

表示临时重定向,当访问的是旧地址,却跳转到新地址上时

(3)403  Forbiden

表示客户端权限不足,无法访问该网址,被禁止访问

(4)404  Not Found

客户端请求的资源在服务器上不存在。比如url中的路径写错了。

(5)405  Method Not Allowed

请求中方法,服务器不支持

(6)500  Internal Server Error

表示服务器内部出现了错误

(7)504  Gateway Timeout

表示服务器访问超时,一般出现在多个客户端同时访问服务器的时候

状态码小结

200成功
301永久重定向
302临时重定向
404资源不存在
403权限不够
405方法不支持
500服务器内部出现问题
504服务器返回结果超时

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小娥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值