您的位置:首页 > 理论基础 > 计算机网络

Http协议-get、post、put、delete

2015-11-13 23:12 411 查看
http协议、一种网络中,文件传送遵循的协议。一种无状态的协议、http协议服务器端不跟浏览器端建立长久的通信连接,即服务端无法识别请求端的到底是谁!建立http通信之后,服务端将文件内容传送给浏览器端接收就完成一次请求。当然一个页面,往往由多个http请求构成、图片,CSS等资源的请求~可能是一个页面进行多个http请求之后得到的结果。

http的无状态,理解成:不论是哪个浏览求向百度发送请求,都是得到同样的结果。百度服务器不能确定前后两次向百度发起请求的是不是同一个客户端。(当然可以通过cookies、ip分析跟踪到具体的浏览器以及用户行为)

在我的机器上请求百度https://www.baidu.com 如图所示,当请求www.baidu.com这个网址之后,解析到百度服务下对应的资源,同理浏览器端所呈现的各种背景图片、样式,都会发起http请求得到对应的文件资源。包括图片、css样式文件信息跟请求的html文件,整体构成用户的浏览器端的看到的状态。



Http协议,发起请求成功,首先是通过DNS域名解析器,将www.baidu.com这个域名,解析到正确的ip地址的服务器上,一般情况没有指定后面具体的资源,浏览器会将自动定位到根目录"/"下即将www.baidu.com拼凑成www.baidu.com/ ,www.baidu.com只是DNS可以解析到ip的域名,"/"是指定资源的位置,一般根目录下会默认为index文件(当然这个随意服务器配置进行更改)。其实在浏览器直接输入对应ip地址,进行请求是一样的。因为服务器最后请求的实质,就是通过ip进行定位。



Http协议的状态码,常见的应该是404错误,直接抛出页面不存在的错误。当时实际在浏览器工作当中,200跟304的响应码应该是最多的。只是大多数人没有去看底层http请求响应流程。200应该是浏览器发送请求,服务器接收到了请求,建立连接成功的响应码。所以当200状态码时候,就是可以正常把服务器文件内容传送到浏览器端。304就是在页面刷新时候,直接从缓存里面拿数据。避免频繁大量的请求增加服务器响应的压力,同时减少用户等待重新加载CSS、js。图片的时间~

(意外发现一个彩蛋~~~百度console有招聘信息~~~~哈哈~~~)



同时发现我登陆状态请求www.baidu.com跟直接请求ip地址是不一样的协议,记住密码登陆下情况下是https协议,走的是443端口。而直接ip地址走的是默认的80端口。





记住密码,会请求登陆页面,会走post请求~


这里就会出现http协议,请求方式get跟post的区别,get请求的时候,一般都是url资源后面“?”跟着对应的参数,多个参数以‘&’符进行连接~所以如果以get方式请求,请求内容一般都是可以直接在url地址栏直接捕捉看到的。但是get请求,会把请求的参数内容封装在http请求body中~貌似这样会安全一点,其实用wireshark或者fidder抓包工具,就能很容易捕捉到http请求,body体中传送的内容。

就以前为了面试:get跟post 的区别,都会常说两点,第一,get请求方式,不安全。post安全。第二,get请求参数内容有限制大小,post请求没有限制。

这是一种似是而非的答案,其实http协议定义跟这完全没有关系!第一,get请求不安全,post请求同样也不安全。原因基于抓包一看,就得到内容。第二,http协议从来就没有限制过get请求内容的大小,而是浏览求对url地址的长度的限制,不同浏览器对url请求的参数内容大小会有限制。

这根http协议定义就有点关联啦,put/delete/get/pos依次可以对应数据库的增、删、改、查。所以get请求一般是查数据的,而且内容是无论请求多少,都是一样不会发生改变的。当然,get也可以带参数,这里狭义的认为,只要不会影响数据结构的请求方式,都是等幂请求。get请求也是http协议定义中的标准使用。

post、put、delete自然就是不等幂请求,一般会改变数据结构。对应会发生数据结构的改变。这里如果用过Laravel框架,其中的resource路由的定义,就会这个get、post、delete、put请求方式有深刻的理解。

同样的url地址,同样的参数形式,会因为请求方式的get、post、put、delete的不同,会分别发生不同的行为。得到不同的结果。

php是一种弱语言,所以当时我选择php入门的原因。就是因为php使用便捷,没有其他语言那么严格。其中get、post请求应该是php中用得最多的地方,phper都知道,可以通过$_GET/$_POST分别获得get、post方式提交的数据。但是经常为了方便,我们会用到$_REQUEST这个全局变量来获取前台不论是post还是get方式提交过来的值。但是这样就会产生一个问题,没有严格区分到底是get还是post请求方式提交的数据。容易产生问题,举一个简单的例子:如果在页面删除一条数据,没有严格区分提交方式,"xxx.delete.php?id=44"类似于这种请求,可以现象这种请求在一个页面默认都是get请求方式,谷歌浏览器有一个加速器,就是会提前把get请求方式的东西,比如CSS跟js等提前给加载进来,以加快运行效率。如果页面存在这种delete请求,也会不知不觉中被删除了数据。这样就容易导致很严重的bug~~当然这只是一个简单的便于实际理解的例子,实际情况远远没有这么简单容易。不过由此可以引出,明确分清楚,get跟post请求方式,以及put、delete请求方式,在项目中还是很有必要的!

在了解http协议的基础上,多看看http请求头,body体,http应答头~看这个都就会自然注意到重要信息明文传送的危险性。然后在此基础上加深对get、post、delete、put请求方式的理解,特别推崇Laravel框架的路由resource的路由风格~严格遵循了RESTful风格的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: