GET与POST的区别?APPLICATION JSON与FORM表单的区别?

大家好,我是IT修真院深圳分院第06期学员,一枚正直善良的web程序员。

今天给大家分享一下,修真院官网 JS-05任务中可能会使用到的知识点:

1.背景介绍

GET和POST是什么?

GET和POST是 HTTP协议中的两种发送请求的方法。

HTTP又是什么?
HTTP是hypertext transfer protocol(超文本传输协议)的简写, 它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。 一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容
请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST

APPLICATION JSON与FORM 是什么?
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。 实际上,我们完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
Content-Type的类型有很多种:可以参考对照表。
这里常用的两种类型:application/x-www-form-urlencoded 和 application/json

2.知识剖析

GET和POST的区别?

get: 从服务器上获取数据,将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接, 而各个变量之间使用“&”连接。
post: 向服务器传送数据,将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
get 和 post只是一种传递数据的方式,get也可以把数据传到服务器,他们的本质都是发送请求和接收结果。只是组织格式和数据量上面有差别。

GET和POST长度的限制问题

GET
    1.GET是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。
    2.实际上HTTP协议对URL长度是没有限制的;限制URL长度大多数是浏览器或者服务器的配置参数。
POST
    1.同样的,HTTP协议没有对POST进行任何限制,一般是受服务器配置限制或者内存大小。
    2.PHP下可以修改php.conf的postmaxsize来设置POST的大小。

GET和POST的安全性

1.GET是通过URL方式请求,可以直接看到,明文传输。
2.POST是通过请求header请求,可以开发者工具或者抓包可以看到,同样也是明文的。
3.GET请求会保存在浏览器历史纪录中,还可能会保存在Web的日志中。

GET幂等,POST不幂等

幂等是指同一个请求方法执行多次和仅执行一次的效果完全相同。
1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。

2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。 这也是浏览器在后退/刷新时遇到POST会给用户提示的原因: POST语义不是幂等的,重复请求可能会带来意想不到的后果。


APPLICATION/X-WWW-FORM-URLENCODED

这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性, 那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样

APPLICATION/JSON

application/json 这个 Content-Type 作为响应头大家肯定不陌生。 实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。 由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify, 服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。 JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。 Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。


3.常见问题


4.解决方案


5.代码实战

参考视频

6.拓展思考

1.put 和 delete 请求

PUT:上传指定的 URI 表示。
DELETE:删除指定资源。
PUT,DELETE操作是幂等的。


7.参考文献

参考一:get和post区别?—— 知乎

参考二:http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

8.更多讨论

问题一:还有哪些其他的提交表头的方法?

参考 http://tool.oschina.net/commons/  对照表

问题二:浏览器发送post请求的时候,发生了什么?

会发生三次请求。
第一次
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

问题三:get请求参数可以放在请求体里发送吗?

        get跟post只是请求的形式不同而已,实际上两者并没有本质上的区别,get请求也可以把参数放到请求体里面。


PPT  视频

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

有兴趣学习编程的同学可以参考我的每天总结,互相学习,共同进步

http://www.jnshu.com/login/1/21055279

阅读更多
上一篇cookie,sessionStorage和localStorage的区别?
下一篇小程序的授权机制
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭