工作当中经常用到这两种类型的接口,一直对它们两个的区别一知半解,并不能从原理上说出区别。
GET和POST最直观的区别应该就是GET将url包含在参数当中,POST通过request body(请求主体)传递参数。
其余的区别有
1.GET请求在浏览器回退时是无害的,POST会再次提交请求;
这句话简单理解就是,get会将请求参数放在请求的url中,回退操作实际上浏览器会从之前的缓存中拿结果;post每次调用都会创建新的资源。还有人说从method的定义上说,get是幂等的,老衲查了一下,等幂性的意思就是一个请求和多次请求,资源的状态是一样的。get,head,put,delete都有等幂性。
2.GET产生的URL地址可以被Bookmark,而POST不可以。
我理解就是一个可以在浏览器的历史纪录里看到。。。可以要是ajax发起的GET请求,不是也不能看到吗?不明白
3.GET请求会被浏览器主动cache,而POST不会。
浏览器缓存又分为强缓存和协商缓存。
4.GET只能进行url编码,POST支持多种方式编码。
url编码指的是urlEncode,POST提交数据的方式有application/x-www-form-urlencoded(浏览器form表单默认的编码方式,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码),multipart/form-data(表单上传文件时,必须让 form 的 enctype 等于这个值),application/json(告诉服务端消息主体是序列化后的 JSON 字符串),text/xml
5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
怎么感觉跟第2条有点重复,要么就是我对第2条有些误解
6.GET请求在URL中传送的参数是有长度限制的,而POST没有。
在开发API的时候就遇到过把接口创建成了get类型,因为参数太多太长请求不能成功,具体长度上限应该是2048字节。POST接口按理说是不会有限制的,但是webconfig文件中可以设置maxQueryStringLength,需要验证一下对POST请求起不起作用。
7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
URL 是 HTTP 的一个首部。既然作为一个首部,那么根据约定,一定是 ASCII 字符的。
8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
这句话好像还比较好理解,嘿嘿嘿。
GET和POST还有一些共同点
GET和POST是http协议的两种发送请求的方法。因为http的底层是TCP/IP,所以GET和POST的底层也是TCP/IP,有人说GET和POST请求都是TCP链接。又查了一下TCP是什么,感觉还比较复杂,今天理解应该无望,暂且不论。暂时简单粗暴地理解TCP就是传输数据用的,GET请求会产生一个TCP数据包,POST请求会产生两个TCP数据包。GET请求是把http header和data一并发出去,服务器响应200,POST请求是浏览器先发送header,服务器响应100,浏览器发送data,浏览器再响应200。