http协议
最常见的协议就是http协议,http协议将和服务器的一次交互看着是两段简单的过程组成:请求(request)和响应(response)
1.请求:客户端通过url地址发送数据到服务器的过程;
2.响应:服务器收到请求数据后回馈数据给客户端的过程;
当请求-响应完成后,本次交互结束,如果需要额外的服务,则需要重新发送新的请求,同时,HTTP1协议约定了请求的消息格式和响应的消息格式;
1.请求消息格式
请求消息格式有两个部分组成: **请求头request headers
和请求体request body**
请求头
请求头是一个多行文本的字符串
比如我们请求 http://www.baidu.com/s?wd=html, 得到的请求头可能如下:
GET /s?wd=html HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
...
该字符串有两部分组成
1.请求行:请求方法+path + 协议
1.请求方法:一个普通字符串,会被服务器读取到,常见的方法:GET,POST;
2.path
:即URL中的path + search + hash
, 服务器可能会用到path中的信息;
3.协议: 协议及版本号,目前固定为HTTP/1.1
2.键值对:大量的属性名和属性值组合,可以自定义;
1.Host:``url地址中的hostname
;
2.User-Agent
: 客户端信息描述;
3.其他键值对;
请求头描述了请求的元数据信息,这里的元数据的信息是指与业务无关的额外信息;当在浏览器地址栏中输入url
地址按下回车,浏览器会自动构建请求头,请求方法为GET
,然后向服务器发送请求;
请求体
包含业务数据的字符串;
理论上可以是任意格式的字符串,习惯上,服务器普遍能识别的格式为:
1.application/x-www-form-urlencoded
: 属性名=属性值&属性名=属性值...
2.application/json
: {"属性名":"属性值","属性名":"属性值"}
3.multipart/form-data
: 使用某个随机字符串作为属性之间的分隔符,通常用于文件上传;
由于请求体格式多样性,服务器在解析请求体时可能无法知晓具体格式,从而不知道如何解析请求体,因此,服务器往往要求请求头中附带一个属性Content-Type
来描述请求体的使用格式;
Content-Type:application/x-www-form-urlencoded
Content-Type:application/json
Content-Type:multipart/form-data
GET和POST
虽然http协议没有规定请求方式必须是什么,但随意的请求方法,服务器可能无法识别;
服务器一般能识别GET和POST等方式,但是有差异化处理
1.GET请求一般没有请求体,POST请求有;
2.GET请求的业务数据放在地址中,安全性较差;
3.GET请求传递的业务数据量有限,POST是无限的(除非服务器限制);
4.GET请求有利于分享页面结果,POST不行;
5.在浏览器中刷新或者回退页面时,会按照该页面之前的请求方式重新发送请求,如果是GET请求,浏览器会重新发送GET请求,如果是POST请求,浏览器会重新构建之前的消息体数据,通常会弹出提示;
2.响应消息格式
和请求类似,响应消息分为响应头(response header)和响应体(response body)
响应头
比如我们请求 http://www.baidu.com/s?wd=html, 得到的响应头可能如下:
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Server: BWS/1.1
...
可以看出,该字符串有两个部分组成
1.响应行:协议 + 状态码 + 状态文本
1.协议:协议以及版本号,目前固定为HTTP/1.1
2.状态码和状态文本:一个数字和数字对应的单词,来描述服务器的响应状态,浏览器会根据该状 态做不同的处理;
1.200 OK : 一切正常 你好,我好,大家好;
2.301 Moced Permanently: 资源已被永久重定向,你的请求我收到了,但是你要的东西不 在这个地址,我已经把它移动到一个新的地址,麻烦你去请求新的地址,地址我放在请求 头的Location中了;
3.302 Found :资源已被临时重定向,你的请求我收到了,但是你要的东西不 在这个地址,我已经把它移动到一个新的地址,麻烦你去请求新的地址,地址我放在请求 头的Location中了;
4.304 Not Modified: 文档内容未被修改, 服务器返回此状态码时,不会返回任何资源。 客户端通常会缓存访问过的资源;
5.400 Bad Request :语义有误,当前请求无法被服务器理解;
6.403 Forbidden: 资源不存在,请求已收到,找不到你需要的东西;
7.404 Not Found: 资源不存在;
8.500 Internal Server Error : 服务器内部错误,无法完成请求;
2.键值对:大量的属性名和属性值组合,可以在服务器响应的时候自定义。
- Content-Type:响应体中的数据格式,常见格式如下
- text/plain: 普通的纯文本,浏览器通常会将响应体原封不动的显示到页面上
- text/html:html文档,浏览器通常会将响应体作为页面进行渲染
- text/javascript:js代码,浏览器通常会使用JS执行引擎将它解析执行
- text/css:css代码,浏览器会将它视为样式
- image/jpeg:浏览器会将它视为jpg图片
- attachment:附件,浏览器看到这个类型,通常会触发下载功能
- 其他MIME类型
- Server:web服务器类型
响应体
响应消息的正文
3.在浏览器地址栏中输入一个页面地址,按下回车发生了什么?
1.浏览器将url地址补充完整:没有书写协议,添上协议;
2.浏览器对url地址进行url编码:如果url地址中出现非ASCII字符,则浏览器会对其进行编码;
3.浏览器构造一个没有消息体的GET请求,发送至服务器,等待服务器响应,此时浏览器标签页往往会出现一个等待图标;
4.服务器收到请求,将一个HTML页面代码组装到消息体中,响应给浏览器;
5.浏览器拿到服务器的响应后,丢弃当前页面,开始渲染消息体中的html代码,浏览器之所以知道这是一个html代码,是因为服务器的响应头指定消息类型为text/html;
6.浏览器在渲染页面的过程中,发现有其他的嵌入资源,如css,js,图片等
7.浏览器使用不阻塞渲染的方式,重新向服务器发送对该资源的请求,拿到响应结果后根据Content-Type做相应处理;
8.当所有的资源都已下载并处理后,浏览器触发window.onload