文章目录
前言
学习HTTP
一、什么是HTTP
- 超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议
- 常基于TCP/IP协议传输数据(HTML 文件, 图片文件, 查询结果等)。
- Web内容都是存储在Web服务器上的,Web服务器使用的HTTP协议,且HTTP协议是可靠的,所以我们不用担心缺失,用于客户端和服务端之间的传递数据,发送和接收请求的响应。
- HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
- 互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
二、URI和URL
URI
每个Web服务器资源都有一个名字,这样客户端就可以说明它们感兴趣的资源是什么了。服务器资源名被称为统一资源标识符(Uniform Resource Identifier, URI)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。
这里第一个是HTTP的使用协议,下面的是访问的地址,再下一个是访问的资源
1. URL
对于URI有两种形式,分别为URL和URN,这其中我们比较常用的是URL,他也是分为三部分,类似上面的URI的格式。
我们在浏览器的地址栏里输入的网站地址就叫做URL ,URL也叫统一资源定位符(URI:统一资源标识符),URL描述了一台特定服务器上某资源的特定位置,也就是我们每个人家里的门牌号。它们可以明确说明如何从一个精确、固定的位置获取资源。
下面看个例子,比如我们一个URL链接:
https://www.weibo.com/AAA/index.jpg
那么该链接由下面的几部分组成:
-
协议:协议有多种,常见的有http以及https,mailto,ftp,上面的例子使用的就是https,该部分代表超文本传输的协议,后面是使用 // 来区分后面的域名部分。
-
域名:这里的域名是www.weibo.com,也可以使用IP地址作为域名使用,如192.168.1.5.一般用域名比较方便查看记忆,同时也便于隐藏我们的id,比较安全。
- www:代表一个Web(万维网)服务器;
- weibo.com/:这部分就是网页的服务器的域名,或站点服务器的名称;
- AAA/:这部分是服务器上的子目录,就好像我们的文件夹;
- Index.jpg:index.jpg是文件夹中的一张图片信息
-
端口:这里跟在域名后面的是端口部分,这部分是可有可无的。
2. URN
URI的第二种形式就是统一资源名(URN)。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与位置无关的URN,就可以将资源四处搬移。通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。
二、请求消息Request以及响应消息Response
所有的http报文都能分为两类,请求报文和响应报文,请求报文会向Web服务器请求一个动作。响应报文会将请求的结果返回给客户端
请求头报文
请求报文
请求报文主要是我们对服务器的操作,报文主要分为三个部分,方法,路径以及HTTP版本。每部分之间用空格来隔开。
- 方法说明对服务器执行的操作(包括GET/POST/DELETE/PUT等)。
- 路径就是跟在方法后面的哪一部分,就是资源所在的请求的URL。
- 版本号就是最后面那一部分,说明该HTTP所使用的协议。
响应报文
响应报文
响应报文就是对我们请求报文的反馈结果,包含响应报文使用的HTTP版本、状态码,以及描述操作状态的文本形式的原因短语。同样都是用空格隔开。
下方还包含很多的信息,包括我们的token,时间,内容的格式和编码方式等等
三、状态码
状态码一般用来显示我们接口的状态情况的,我们通过返回的状态码就能里理解到大致发生的问题,对其进行处理。
- 1XX :信息,服务器收到请求,需要请求者继续执行操作
- 2XX:成功,操作被成功接收并处理
- 3XX:重定向,需要进一步的操作以完成请求
- 4XX:客户端错误,请求包含语法错误或无法完成请求
- 5XX:服务器错误,服务器在处理请求的过程中发生了错误
常见的有401:没有权限,404: 页面丢失 ,301:重定向, 200:响应成功,500:服务器错误等等
具体可以看:菜鸟-状态码
四、HTTP请求方法
HTTP和浏览器交互的方式常见有下面的几种,下面对应的是,一般来说对应增,删,改,查,但现在只用post就能完成全部了,我们来了解一下每一种,同时来区分一下post和get的区别。
PUT
- 与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
DELETE
- DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。
POST
- POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
GET
- GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。
OPTIONS
- 它用于获取当前URL所支持的方法。如果请求成功,会有一个Allow的头包含类似“GET,POST”这样的信息,告诉我们所支持的方法。
TRACE
- TRACE方法被用于激发一个远程的,应用层的请求消息回路。也就是使得服务器原样返回任何客户端请求的内容(可能会附加路由中间的代理服务器的信息),由于该方法原样返回客户端提交的任意数据,因此有被用来进行跨站脚本(XSS)攻击的可能。
CONNECT
- 把请求连接转换到透明的TCP/IP通道,也就是将服务器作为代理,让服务器代替用户去访问其他网页(说白了,就是翻墙),之后将数据返回给用户。我们在网页开发中基本不会用到~
POST和GET的区别
在这里中,我们需要区分的是POST和GET,实际上你会发现其实两者可以共通的,但为什么又出现两者呢?这里我们就要去了解一下他们的区别了。
- url可见性:
get,参数url可见,请求的数据放在url上,其格式为:以?分割URL和传输数据,参数之间以&相连;
post,url参数不可见,post把数据放在HTTP的包体内 - 传输数据的大小:
get一般传输数据大小不超过2k-4k
post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大 - 后退页面的反应:
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交请求 - GET请求只能进行url编码,而POST支持多种编码方式
- GET只接受ASCII字符的参数的数据类型,而POST没有限制
那么看起来post好像很多好处呀,那么为什么还用get呢?因为get的效率高呀(不过其实现在基本都全用post的,实习中,公司的接口文档全是post的~~~)
五、HTTP的版本发展
HTTP/0.9
出现原因:
- 学术交流,便于网络间传输HTML文件
特点:
- 仅支持GET请求
- 只有请求行,不支持请求头和请求体,没有返回信息
- 只能传输纯文本内容
- 典型的无状态连接
连接流程:
- 客户端先根据IP,端口,和服务器三次握手,建立连接(TCP)
- 连接成功后发送GET请求,获取文件
- 服务器返回数据,传输完闭就断开连接
HTTP/1.0
- 默认短连接(一次请求建议一次TCP连接,请求完就断开),但是增加了keep-alive关键字来由短链接变成长连接,就是请求报文里的字段指定Connection:keep-alive;支持GET、POST、 HEAD请求。
HTTP/1.1
出现原因:
- 解决HTTP1.0中没次连接通信都得建立一个TCP连接的问题,添加了一个持久连接的方法。
特点:
- 默认长连接(一次TCP连接可以多次HTTP请求),也可以用请求报文Connection:close(默认:keep-alive)来把长连接变成短连接;
- 新增了5种请求类型;
- 引入rang头域,允许只请求资源的某部分,返回状态码206,方便开发者只有安排带宽和连接
- 请求头部增加了Host字段,在HTTP1.0中认为每台服务器都绑定一个唯一的ip地址,因此在URL中并没有传递主机名,但是随着虚拟机技术的发展,可能在一台物理机器上存在多个虚拟主机,并且他们共享了一个ip地址,http1.1中请求消息和响应消息都支持host头域;以及使用CDN实现域名分片机制,减小整个资源的下载。
- 增加了100,409等在内的一些状态响应码。
- 引入了客户端cookis机制和安全机制
连接流程:
HTTP/2.0
出现原因:
- 通过多路复用来减少延迟,同时通过压缩HTTP首部字段,降低协议开销,增加请求优先级和服务端推送的支持。
特点:
- 多路复用,降低开销(一次TCP连接可以处理多个请求), 一个连接里面并发处理请求,不像http1.1在一个tcp连接中各个请求是串行的;解析基于二进制,解析错误少,更高效(HTTP/1.X解析基于文本);在1.0版本后增加了header头信息,2.0版本通过算法把header进行了压缩这样数据体积就更小,在网络上传输就更快。
ps
其中,1.0和1.1最常用,0.9几乎不用(旧),2.0比较少用(更新代价大)