1.了解一下URL
概念:统一定位符URL:(Unifrom Resource Locator)
其实它就是我们所说的网址。
上面图片就是在开始的网络上的网址。一个需要登录信息的网站。
- http代表协议,这是现在最常用的协议(超文本传输协议)还有就是ftp协议(文件传输协议)
- 在协议后面必须写上的格式
://
,不能省略。 - 然后就是登录信息,用户名:密码
- @后面是服务器地址就是主机,你所要给谁发出请求的主机以及:服务器端口号(端口号并不是URL必须的,不写默认端口号80)
- /后面接着文件路径,你所访问的网址所在的目录的路径
就像你用浏览器在桌面打开一个文件,它所显示的目录
file:///C:/Users/Administrator/Desktop/Linux%E9%AB%98%E6%80%A7%E8%83%BD%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BC%96%E7%A8%8B.pdf
这些就是文件的路径 查询字符串:就是你在网页山所要查询的信息浏览器翻译出来的信息
https://www.baidu.com/baidu?tn=monline_3_dg&ie=utf-8&wd=urlencode
?后面的信息就是查询字符串,urlencode就是你所要查询的内容,wd就相当于key一样,它前面信息是由许多键值对组成。最后一部分片段标识符表示你在有的网页上底部看到
点击这里返回首部
就是用来做这个的但是在网址中一些字符不能随意出现,已经被URL转义了,所以需要urlencode和urldecode规则
urlencode转义规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不⾜足4位直接处理),每2位做⼀位,前⾯面加上%,编码成%XY格式
就像将空格转换为%20,!转换为%21
而urldecode就是urlencode的逆过程2.HTTP协议格式
2.1: HTTP请求消息Request
它包括四部分;请求行,请求头部,空行,请求数据
GET请求
GET /562f25980001b1b106000338.jpg HTTP/1.1
(此行是请求行使用的相对URL)
Host: img.mukewang.com
(此行是首部行的开始,这行给出主机的域名)
Connection:close
(告诉服务器发送完文档后可直接释放,还有的选项是keep-alive,
意思就是保持一段时间连接,在该时间内可以继续接收请求)
User-Agent: Chrome/51.0.2704.106
(表示用户使用的是什么浏览器,这里是谷歌浏览器)
Accept: image/webp,image/*,*/*;q=0.8
Referer: http://www.imooc.com/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
(表示用户优先得到的文档是什么语言,这里是中文)
注意最后一行是空行
POST请求
POST / HTTP/1.1
(/:浏览器所默认的主目录)
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
- 第一部分:首行是:[方法]+[url]+[版本]
- 第二部分:Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤用换行分隔;遇到空⾏行表⽰示Header部分结束
- 第三部分:空行,请求头部后面的空行是必须的
- 第四部分:请求数据也叫主体,可以添加任意的其他数据。
那么GET和POST的区别是什么呢?
2.1.2:GET和POST的区别
- 直观的区别就是GET把参数包含在URL中,POST通过请求主体(request body)中传递参数
- 但是你要知道GET和POST是HTTP协议中发送的两种方法,那么HTTP是基于TCP/IP实现的通信协议
- 所以说GET、POST底层也是TCP/IP协议,都是TCP链接,所以他俩做的事情一样的,你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
- 更形象的说,在万维网世界中,TCP就像汽车,我们用它来传输数据,它挺可靠的,一般不会发生丢件少见的现象,但是如果交通路上都是一模一样的汽车,然后汽车都在瞎跑,那肯定就乱套了,所以交通规则HTTP就诞生了,有了GET、POST、PUT、等等,就好像我们世界城市中有公交车道,自行车道,小汽车道一样,都是为了使交通运行更加顺畅。
- GET就像把数据放在汽车车顶上(URL中)暴露在外面的方便查看和记录,而POST就像把数据放在车厢里(request body中),当然你也可以在GET时在车厢里偷偷藏带点东西,但这是不光彩的,也可以在POST的车顶放点数据,但这看起来有点傻,没有必要。所以HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
在数据传输中,对于GET中的URL是有长度限制的,但是POST不是URL传输,所以理论上不受限制
- 为什么URL是有限制的呢,因为不同的浏览器和服务器装货和卸货是有成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担,大多数浏览器通常都会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。超过的部分,不会处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到
GET和POST的最大区别
:GET产生一个数据包,POST产生两个数据包- 对于GET请求,浏览器会把HTTP报头和和数据一块发送过去,服务器响应200(成功,并返回数据)
- 对于POSt请求,浏览器先发报头过去,服务器响应100(continue继续发送),浏览器再次发送数据,服务器再响应200(成功,并返回数据)
因为POST需要两步,时间消耗多一点,那么就说明GET比POST更有效吗?其实不是的
- GET 和POST都有自己的语义,不能随便交叉乱用
- 在有人研究下,在网络好的情况下发送一次包的时间和两次包的时间差别不大,在网络差的情况下,发两次包对于验证数据包的完整性上更有优点。
- 还有不是所有浏览器上POST都会发送两次包,Firefox就只发一次
2.2:HTTP响应消息Response
HTTP响应由四个部分组成分别是:状态行、消息报头(也叫首部行)、空行和响应正文。
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
- 第一部分:首行:[版本号]+[状态码]+[状态码解释]
- 第二部分:和请求一样消息报头
- Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
- 第三部分:空行,请求头部后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息,如果服务器返回了一个html页面, 那么html页⾯面内容就是在正文中
2.3:状态码
状态码都是三位数字组成,分为5大类,共三十三种
1XX:表示通知信息的,如请求收到或者正文正在进行处理
- 2XX:表示成功,接收请求或者知道了
- 3XX:表示重定向,如果要完成请求还必须采取进一步的行动
- 4XX:表示客户的差错,如果请求中有错误语法或请求不能完成
5XX:表示服务器出错,如服务器失效无法完成请求
下面是最常见的状态码
常见状态码:
200 OK //客户端请求成功
302 //重定向(资源临时移动到别的地方)
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
2.4:HTTP常见的头部
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端⼝口上;
- User-Agent: 声明⽤用户的操作系统和浏览器版本信息;
- referer: 当前页⾯面是从哪个页⾯面跳转过来的;
- location: 搭配3xx状态码使⽤, 告诉客户端接下来要去哪⾥里访问;
Cookie: ⽤用于在客户端存储少量信息. 通常⽤用于实现会话(session)的功能;
2.5:HTTP的请求方法
方法 | 说明 | 支持的HTTP版本号 |
---|---|---|
GET | 获取资源 | 1.0、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 |