post提交的数据有哪几种编码格式?能否通过URL参数获取用户账户密码
这里是修真院前端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析前端知识/技能,本篇分享的是:
【post提交的数据有哪几种编码格式?能否通过url参数获取用户账户密码】
1.背景介绍
http/1.1 协议规定的 http 请求方法有 options、get、head、post、put、delete、trace、connect 这几种。其中 post 一般用来向服务端提交数据,本文主要讨论 post 提交数据的几种编码方式。
2.知识剖析
协议规定 post 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。但是,数据发送出去,还要服务端解析成功才有意义。
服务端通常是根据请求头(headers)中的 content-type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。post 提交数据方案,包含了 content-type 和消息主体编码方式两部分。下面就正式开始介绍它们。
3.常见问题
常用的post 提交数据方式有哪些?
4.解决方案
四种常见的 post 提交数据方式:
1.application/x-www-form-urlencoded
2.multipart/form-data
3.application/json
4.text/xml
1.application/x-www-form-urlencoded
这应该是最常见的 post 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype属性,那么最终就会默认以 application/x-www-form-urlencoded 方式提交数据。
在post提交数据中content-type 被指定为 application/x-www-form-urlencoded;提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 url 转码。大部分服务端语言都对这种方式有很好的支持。很多时候,我们用 ajax 提交数据时,也是使用这种方式。
xhr.open("post","http://www.example.com",true);
xhr.setrequestheader("content-type", "application/x-www-form-urlencoded");
2.multipart/form-data
这也是一个常见的 post 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctype 等于这个值。这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。上面提到的这两种 post 数据的方式,都是浏览器原生支持的。
xhr.open("post","http://www.example.com",true);xhr.setrequestheader("content-type", "multipart/form-data");
3.application/json
application/json 这个 content-type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 json 字符串。由于 json 规范的流行,除了低版本 ie 之外的各大浏览器都原生支持 json.stringify,服务端语言也都有处理 json 的函数,使用 json 不会遇上什么麻烦。
xhr.open("post","http://www.example.com",true);xhr.setrequestheader("content-type", "application/json");
4.text/xml
它是一种使用 http 作为传输协议,xml 作为编码方式的远程调用规范,它的使用也很广泛,能很好的支持已有的 xml-rpc 服务。不过,xml 结构还是过于臃肿,一般场景用 json 会更灵活方便。
xhr.open("post","http://www.example.com",true);xhr.setrequestheader("content-type", "text/xml");
5.编码实战
6.扩展思考
我们应该选择哪种编码方式呢?
1.选择与后端约定好的提交方式
2.看提交的数据类型,如果提交文件的话选择multipart/form-data
7.参考文献
参考三:http协议post请求问题总结
8.更多讨论
get和post有哪些区别?
传言1:get方式对长度有限制;post方式对长度没限制。
(1).因为get是通过url提交数据,那么get可提交的数据量就跟url的长度有直接关系了。而实际上,url不存在参数上限的问题,http协议规范没有对url长度进行限制。这个限制是特定的浏览器及服务器对它的限制。ie对url长度的限制是2083字节(2k+35)。对于其他浏览器,如netscape、firefox等,理论上没有长度限制,其限制取决于操作系统的支持。
(2).理论上讲,post是没有大小限制的,http协议规范也没有进行大小限制,说“post数据量存在80k/100k的大小限制”是不准确的,post数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。
传言2:get是从服务器上获取数据;post是向服务器传送数据。
回答:get方式就没有向服务器传送数据?那么url中的?子句送的是什么?不论是get还是post,都可以向服务器传送数据,只不过传送数据的位置不同,get请求的数据会附在url之后,post把提交的数据则放置在是http包的包体中;不论是get还是post,都要从服务器上获取数据,关键的问题是:
get的主要任务是获得数据,但在获得数据前也可以向服务器提交一些数据;
post的主要任务是提交数据,但在提交数据之后服务器也会向用户端返回一些显示用的数据。
传言3:get不安全,用户能从地址栏上看到传送的数据;post安全,用户不能从地址栏上看到传送的数据。
回答:通过get提交数据,用户名和密码将明文出现在url上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。post方式看不到传送的数据是因为ie浏览器做了限制。如果你通过第三方工具看到了post方式传送的数据,你还能说post方式是安全的吗?理论上说get和post方式都不安全,要不就用不着研究https了。
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,学习的路上不再迷茫。
这里是技能树.it修真院:http://www.jnshu.com,初学者转行到互联网行业的聚集地。"
欢迎加it交流群565734203与大家一起讨论交流