get 与 post 的区别?application json 与 form 表单的区别?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/88774019

大家好,这里是修真院前端小课堂,今天给大家带来的是

《get 与 post 的区别?application json 与 form 表单的区别?》

1. 背景介绍

基本概念 HTTP:在 Web 应用中,服务器把网页传给浏览器,实际上就是把网页的 HTML 代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是 HTTP。

HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

工作原理:HTTP 协议工作于客户端 - 服务端,浏览器作为 HTTP 客户端通过 URL (统一资源定位符) 向 HTTP 服务端发送请求,服务器接收到请求后,向客户端发送响应信息。

三大特点:1. 无连接 2. 灵活快速 3. 无状态

消息结构客户端请求消息:由请求行、请求头部、空行、请求数据组成。

2. 知识剖析

1.get 与 post 的区别首先我们要知道 GET 和 POST 都是 HTTP 定义的和服务器互交的不同方法。

1. 语义上的不同:GET:获取指定 URL 上的资源,是读操作。

POST:向指定资源 “追加 / 添加” 数据。

2. 对于 “安全” 所代表的设定。根据 HTTP 规范,GET 用于信息获取,而且应该是安全的和幂等的。所谓的安全意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。这里安全的含义仅仅是指是非修改信息。幂等意味着对同一 URL 的多个请求应该返回同样的结果。

根据 HTTP 规范,POST 表示可能修改变服务器上的资源的请求。对于传递过程来说,指的是提交的数据不会直接在地址栏看见。

POST 的安全性要比 GET 的安全性高。注意:这里所说的安全性和上面 GET 提到的 “安全” 不是同个概念。上面 “安全” 的含义仅仅是不作数据修改,而这里安全的含义是真正的 Security 的含义,比如:通过 GET 提交数据,用户名和密码将明文出现在 URL 上,因为:

(1) 登录页面有可能被浏览器缓存

(2) 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用 GET 提交数据还可能会造成 Cross-site request forgery 攻击。

3. 请求数据方法不同: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

4.GET 是幂等的,POST 是非幂等的先介绍下幂等的概念:如果一个操作没有副作用,或者多次操作对资源产生的副作用相同,我们就说这个操作是幂等的。

get 方法用户获取资源,没有副作用,所以是幂等的;post 用于创建资源,是有副作用的,且副作用不同,所以 post 不是幂等的。(两次相同的 POST 请求会在服务器端创建两份资源,它们具有不同的 URI)

上图是在 W3C 上找到的答案.

因为 POST 请求的协议并没有规定数据必须使用什么编码方式,而数据发送出去,还要服务器解析成功才行。服务器则通常根据请求头里的 Content-Type 字段来获知消息是以什么方式编码,再以对应方式解析。而有的接口服务器则不能解析某些编码方式的数据。因此需要对 Content-Type 进行设置。

2.application json 与 form 表单的区别?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 方式提交数据。请求的时候,首先,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. 参考文献

参考一:理解本真的 REST 架构风格

参考二:W3C

参考三:99% 的人理解错 HTTP 中 GET 与 POST 的区别

8. 更多讨论

Q: 还有哪些其他的提交表头的方法?

A:multipart/form-data,这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。

text/xml 它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范

Q:get 和 post 的安全性?

A:Get 提交,将要提交的内容方法哦 URL 后边使用?进行连接。这种提交方式可能让一些用户看到一些保密信息,比如用户名,密码等信息。带来的一定的安全隐患。而 post 提交方式,是将请求的信息放到数据报中(请求体),其他人职能看到 URL 的信息,而不能看到别的信息。从而提高了安全性,这就是我们最通常的认识偶然看到了一篇博客,里边提到 get 方式也是安全的。因为我们提交的敏感信息,一般都是进行不可逆加密的!所以得到了页没有什么。他们安全性我们只考虑了用户而没有考虑服务器,post 方式提交的数据的长度不受限制,所以黑客可以向服务器提交大量的数据,致使服务器忙于处理这些数据,而无暇处理用户的正常请求,到处服务器瘫痪!当我们使用 get 提交的时候,不要提交一些敏感数据。


【更多内容,可以加入IT交流群565734203与大家一起讨论交流】

【这里是技能树·IT修真院:IT修真院官网,初学者转行到互联网的聚集地】

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/88774019