http协议
基础概念
- HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
- HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
HTTP协议的主要特点可概括如下:
- 1.支持客户/服务器模式。
- 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议介绍
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
1、HTTP
REQUEST:请求阶段,客户端向服务器端发送请求
RESPONSE:响应阶段,服务器端把内容返回给客户端客户端和服务器端可以进行内容或者数据的传输
->客户端可以把内容传给服务器
->服务器也可以把内容传递给客户端
都是通过传输协议(HTTP)进行传输的2、HTTP报文:客户端和服务器端传输的内容统称为HTTP报文
起始行:请求起始行、响应起始行
首部(头):通用头信息(请求和响应都有的)、请求头信息、响应头信息、自定义首部(自定义的请求头和自定义的响应头)
主体:请求主体、响应主体
在谷歌浏览器的控制台,NET WORK选项中可以查看当前客户端和服务器端的”全部”请求信息,而且客户端和服务器端传输的所有内容都可以在这里看到
->请求头:客户端设置的,服务器端获取的 真实项目中我们有些时候,客户端会把一些内容放在请求头中传递给服务器,例如:客户端可以把COOKIE信息通过请求头传递给服务器
->响应头:服务器端设置的,客户端获取的 真实项目中我们有些时候,服务器端会把一些内容放在响应头信息中传递给客户端,例如:服务器端在开始给客户端返回内容的时候,会把当前服务器的时间放在响应头信息中(Date)返回给客户端,而且存储的这个时间是“格林尼治时间GMT+0000”主体才是主要用来实现客户端和服务器端传输的
->请求主体:客户端一般都会把需要传递给服务器的内容放在请求主体中,服务器端可以从请求主体中接收到客户端传递的内容
->响应主体:服务器端把需要给客户端返回的内容放在响应主体中,客户端可以在响应主体中获取这些内容- 总结:
客户端传递给服务器端内容
->URL问号传参:客户端在请求的URL中通过问号传参的方式把内容传递给服务器 http://localhost:80/getAllList?name=zmc&age=1
->设置请求头信息
->设置请求主体信息
服务器端传递给客户端内容
->设置响应头
->设置响应主体- 总结:
3、HTTP METHOD (HTTP请求的方式)
[GET]
GET:从服务器端获取数据 (客户端给服务器端的内容少,服务器端给客户端的内容多,一般项目开发过程中使用GET请求最多了)
DELETE:从服务器上删除内容 (QQ空间相册,我们想把之前上传的图片在服务器上删除)
HEAD:只获取服务器端的响应头信息,响应主体内容不获取 (经常应用于客户端只想获取服务器的时间,这样在响应头中就有服务器的时间了,主体内容可以不用获取)
[POST]
POST:向服务器端推送数据 (客户端给服务器端的内容多,服务器端给客户端的内容少,例如:用户注册,客户端需要把很多的用户信息传递给服务器端,而服务器端只需要返回成功或者失败,这样的情况我们使用POST)
PUT:在服务器上存放内容 (QQ空间相册,我们上传图片其实就可以使用PUT请求)
…这些请求方式从本质上是没有太大区别的,不管使用哪一种方式,客户端都可以把内容传给服务器,服务器也可以把内容传递给客户端,而我们接下来讲解的请求方式区别仅仅是目前市场上大家约定俗成的一些规范而已
[GET] PK [POST]
->一般项目中,我们使用GET请求,传递给服务器的数据都是通过问号传参的方式传递的;而使用POST请求,传给服务器的内容都是放在请求主体中传递给服务器的;
GET
var xhr=new XMLHttpRequest;
xhr.open(‘GET’,’/getAllList?name=zf&age=8’,true);
xhr.onreadystatechange=function(){}
xhr.send(null);POST var xhr=new XMLHttpRequest; xhr.open('POST','/getAllList',true); xhr.onreadystatechange=function(){} xhr.send('{"name":"zmc","age":1}');//->SEND中存放的内容就是请求主体内容(一般传递给服务器的请求主体内容都是JSON格式的字符串)
1)大小限制问题
GET传给服务器的内容少,POST传递给服务器的内容多
因为GET请求一般都是把要传递的内容放在URL的末尾,通过问号传参的方式传递的,如果传递的内容多,请求的URL就会很长,而浏览器对于URL地址的长度是有限制的:谷歌8KB、火狐7KB、IE2KB,超出的部分浏览器会把其进行截取
而POST是放在请求主体中传递给服务器的,理论上不存在大小的限制,但是在真实项目中为了保证传输的速度,我们一般也会限制大小,例如:我之前做的图片上传,一般限定用户上传图片的大小在2M以内2)缓存问题
GET请求经常出现默认的缓存(这个缓存是浏览器和服务器之间的一些猫腻,我们项目中一般是不想要这些缓存的,因为不可控,项目中真正使用的缓存都是我们使用相关技术去实现的),而POST请求浏览器不会给其默认进行缓存
清除GET请求的缓存:在每一次请求的URL地址后面加随机数
xhr.open(‘GET’,’/getAllList?name=zmc&age=1&_=’+Math.random());3)安全问题
GET请求相对于POST请求不太安全,因为GET请求把传递给服务器的内容放在URL上了,而有一种黑客手段叫做URL劫持,可以获取我们传递给服务器端的内容,所以项目中客户端如果需要传递一个重要信息给服务器我们一般都使用POST请求,例如:用户登录的用户名密码我们就是POST请求给服务器的.