为什么说:"对参数的数据类型,GET只接受ASCII字符,而POST没有限制?"

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编码

图片描述

2.2 谷歌上搜相关内容基本上都是这篇文章,而且没有详细解释。

阅读 11.1k
2 个回答

在 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 字符了。

比较复杂,我长话短说吧,如果你的 Get 请求中有非 ASCII 字符,会在请求之前进行转码,得到没有非 ASCII 字符的 URL,然后去发起 Get 请求,这样请求的路径里不是没有非 ASCII 字符么?如果没看明白就多读两遍。
然后给你推荐几篇文章:关于URL编码百分号编码

推荐问题