【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析前端知识/技能,本篇分享的是:
【get 与 post的区别?application json 与form表单的区别?】
1.背景介绍
首先说HTTP的概念:在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP。HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。 工作原理:HTTP协议工作于客户端-服务端,浏览器作为HTTP客户端通过URL(统一资源定位符)向HTTP服务端发送请求,服务器接收到请求后,向客户端发送响应信息。
三个特点:无连接、无状态、灵活快速
消息结构:
两种请求方法:
GET:请求指定的页面信息,并返回实体主体
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
2.知识剖析
1.)get和post的区别:
语义不同:
GET:获取指定URL上的资源,是读操作,
POST:向指定资源“追加/添加”数据.
对于安全所表达的设定:
根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。这里安全的含义仅仅是指是非修改信息。
幂等的意味着对同一URL的多个请求应该返回同样的结果
根据HTTP规范,POST表示可能修改变服务器上的资源的请求。
对于传递过程来说,指的是提交的数据不会直接在地址栏看见。(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录。
POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。
请求数据的方法:
GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。HTTP协议没有对get和post做长度的限制,但是浏览器会对url长度做限制最多1024字节,所以get方法传递数据受限制。
POST把提交的数据则放置在是HTTP包的包体中。如:name1=value1&name2=value2
幂等:
GET是幂等的,POST是非幂等的,先介绍下幂等的概念:如果一个操作没有副作用,或者多次操作对资源产生的副作用相同,我们就说这个操作是幂等的.
get方法用户获取资源,没有副作用,所以是幂等的;post用于创建资源,是有副作用的,且副作用不同,所以post不是幂等的。(两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI)
2.application JSON和Form表单的区别
因为POST请求的协议并没有规定数据必须使用什么编码方式,而数据发送出去,还要服务器解析成功才行。服务器则通常根据请求头里的Content-Type字段来获知消息是以什么方式编码,再以对应方式解析。而有的接口服务器则不能解析某些编码方式的数据。因此需要对Content-Type进行设置。
application/json这个Content-Type作为响应头大家肯定不陌生。实际上, 现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的JSON字符串。 由于JSON规范的流行,除了低版本IE之外的各大浏览器都原生支持JSON.stringify, 服务端语言也都有处理JSON的函数,使用JSON不会遇上什么麻烦。angular中默认的就是这个格式
application/x-www-form-urlencoded这应该是最常见的POST提交数据的方式了。浏览器的原生form表单,如果不设置enctype属性, 那么最终就会以application/x-www-form-urlencoded方式提交数据。请求类似于下面这样( 无关的请求头在本文中都省略掉了):POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3首先,Content-Type被指定为application/x-www-form-urlencoded; 其次,提交的数据按照key1=val1&key2=val2的方式进行编码,key和val都进行了URL转码。 大部分服务端语言都对这种方式有很好的支持。
3.常见问题
GET和POST使用的环境
4.解决方案
应该符合语义的使用;即获取数据使用GET,增加数据使用POST.
当请求无副作用时(如进行搜索),便可使用GET方法;当请求有副作用时(如添加数据行),则用POST方法。
5.编码实战:
参考任务代码
6.拓展思考
如何回答get和post的不同:
普通回答:
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
清新回答:
GET和POST是什么?HTTP协议中的两种发送请求的方法。HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
7.参考文献
https://www.oschina.net/news/77354/http-get-post-different
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
更多内容,可以加入IT交流群565734203与大家一起讨论交流
这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地