Http 协议

Posted1 by 呼延十 on March 26, 2018 Hot:

HTTP(Hypertext Transfer Protocol),超文本传输协议,他是现代互联网最基本也是最重要的协议。Http协议是无状态的,应用层协议,是web开发的基础。

Http基础

http协议,简单的说就是客户端用固定格式向服务器发送一条信息,服务器收到此请求之后经过处理返回一个固定格式的数据。

URL

如果我们想访问一个网站,并不需要熟悉http协议,只需要在浏览器中输入对应网站的URL即可。

URL用于描述一个网络上的资源。就像门牌号之于房子一样的作用。

http://www.google.com:80/search?name=huyanshi#top
在上面这个url中:
http:指定所用的协议,原先为http,最近大部分网站都已经使用更加安全的https。
www.google.com:host地址,经过解析可以得到网站的ip地址。
80:端口号。Http服务器的默认端口是80,这种情况下端口号可以省略。
/search:访问的资源在服务器上的路径。
?name=huyanshi:发送给服务器的数据。
#top:锚。

请求Method

我们通过url告诉了浏览器我们要访问的资源路径,那么我们对这个资源想做什么呢?这个操作就是通过method定义的,http1.1定义了8种标准的操作。

GET:GET方法应该仅被用在向服务器请求查看一个数据时。

POST:POST请求会向指定的自愿提交数据,请求服务器进行处理。

HEAD:HEAD方法只会获取服务器响应的响应头信息,常用于客户端查看服务器端的性能。

PUT:PUT方法向指定的资源位置上传其最新内容,通常用于上传文件。

DELETE:删除对应资源。

CONNECT:Http1.1预留。

OPTIONS:返回对应资源支持的Http请求方法。

TRACE:回显服务器收到的信息。

其中,PUT,DELETE,POST,GET对应数据操作的增删改查,其中又以GET和POST最为常用。

GET和POST的区别和联系

这个问题也是面试问题里的常客了,但是其实很难说的清楚,网上的答案也是各抒己见,并无统一答案。
我的理解是,GET和POST最大的区别是语义区别,GET用于请求数据,POst用于提交数据。(http规范里规定,但是具体实现的时候有没有遵守就不一定了,后面所说的很多区别都是规范,而不是强行要求的实现。)

区别有:GET是安全的,幂等的,可缓存的,POST是不安全的,不幂等的,不可缓存的。

安全性:

对于服务器的安全性:GET请求只用于获取数据,不会修改服务器资源,因此对于服务器而言GET方法是安全的,而POst会提交一部分数据,服务器根据数据对资源进行修改,因此对于服务器而言Post方法不安全。

对于用户的安全性:GET方法将请求参数放在URL里进行明文传输,如果参数中包含密码,手机号码等内容会直接显示并且所有人可见,并且Url会及谁来浏览器中。POST方法对请求数据写在请求体中,也是明文传输,但是比起GET是安全了一点点的,,,,,。

幂等的:
GET:规范中的GET方法连续执行多次,得到的结果应该是一样的。 POST:POST执行每一次可能都会对服务器端的资源进行改变,因此执行多次结果会不同。
这也就是为什么当你在浏览器中点击返回按钮,有时候会提醒你,当前页面提交表单,如果返回或者刷新会造成表单重复提交,请你确认操作的原因。

可缓存的:顾名思义就是一个方法是否可以被缓存,此RFC里GET,HEAD和某些情况下的POST都是可缓存的,但是绝大多数的浏览器的实现里仅仅支持GET和HEAD。

大多数的区别都是“语义”区别而不是“语法”区别
就像你也可以用GET来提交一个参数,而用POST方法查询一个数据,但是这样会造成语义混乱!千万不要!

关于GET和POST的区别,我看到一个讲的很好的小栗子,分享给大家:

微博场景中:

www.weibo.com?id=222 使用这个URL查看一条微博,应该用GET请求,这样你分享给别人,别人访问这个URL就可以看到这条微博。而如果使用POST,别人拿到这条URL是“www.weibo.com”,毫无意义。

www.weibo.com?user=huyanshi&content=xixixi 而发微博,点赞,评论这样的操作就应该使用POST请求。使用上面这条URL为huyanshi用户发一条内容为xixixi的微博,那么别人复制一下这条URL也可以替你发一条微博了。

HTTP状态码

客户端通过METHOD定义请求类型,服务端通过返回的状态码告诉客户端相应类型。

http1.1定义了5类状态码。状态码由三位数字组成,第一个数字定义了响应的类别。

1XX:表示q请求已经成功接收,可以继续发送请求,如果已经发送完成可以忽略此状态码。
2XX:成功。 3XX:重定向。要想完成请求需要进行下一步的处理。
4XX:客户端错误。请求有语法错误或者请求无法实现。
5XX:服务器错误。服务器对于合法的请求处理过程出现错误。

常见状态码:

200 				//成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常





ChangeLog

2018-03-27 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十