1 问题描述
我在:99%的人都理解错了HTTP中GET与POST的区别中看到下面:
"对参数的数据类型,GET只接受ASCII字符,而POST没有限制"
我对这句话理解是这样的:GET的请求参数中不可以带有非ASCII码字符。
但是一般来说:无论是URL还是请求参数中的非ASCII码都会字符被URL编码成ASCII码字符吗?
那么这个区别到底是什么意思呢?是我理解错了吗?
2 我做的其他尝试:
2.2 我自己也在一个demo里尝试了下,请求如下
axios.get('/static/jsons/goodDetail.json',{
params:{
goodId:this.$route.params.goodId,
id:"μ"
}
})
如下图可以被正常URL编码
在 HTTP 协议中,URL 是 HTTP 的一个首部。既然作为一个首部,那么根据约定,一定是 ASCII 字符的(毕竟计算机是美帝发明的嘛),而 GET 参数取的正是 URL 中的 QUERY STRING。最初 HTTP 也和计算机一样只是应用的很少,美帝也没想到会覆盖全球,于是他们就很 naive 地使用非 ASCII 的头部 URL 来传输 GET。后来有了 UTF-8,浏览器开发公司发现,编码都是十六进制的嘛。于是开始使用 % 加编码的一个字节来组成新编码,这就是 URL code 的由来,其实本质上传输的还是 ASCII,只不过对它硬转码了。
HTTP 是直接使用 MIME 的,它是为了收发非 ASCII 邮件而存在的一种扩展。最初电子邮件也是只支持 ASCII,可是由于邮件越来越复杂,美帝才对协议进行扩展,让它能够传输小电影、小图片或者其它的文件,然后就有了 MIME,它有一个 MIME type,来说明具体是什么类型的文件。后来,其他国家的人一想:诶,卧槽,我直接用 MIME 来传输我们国家的字符不就完了么。然后 MIME 就能传非 ASCII 字符了。
我们说的 POST,它其实就是 HTTP 的实体,通过 MIME,也就可以传输非 ASCII 字符了。