美文网首页angular 2+ 点点滴滴angular2
Angular2 get请求 加号转为空格

Angular2 get请求 加号转为空格

作者: zxqian1991 | 来源:发表于2017-02-09 10:00 被阅读172次

    之前,在开发的过程中,发现了一个很奇怪的问题,那就是关于get请求带来的字符乱码的问题,困扰了我很久,那就是在使用Get请求的时候,请求中带了参数 +,而后,后台无论如何都收不到这个+,只会显示空格,奇怪的是,当我把请求过来的URL完整打印出来时却又是正确的,基本情况可以用下面的例子展示:

    完整的get请求

    http://www.test.com/test?a=21398+kjad
    

    按道理,我后台想收到的应该是:

    21398+kjad
    

    但实际上收到的却是:

    21398 kjad
    

    出现这个问题后,本以为是前端的请求出了问题,于是,在后台把请求打印出来发现,完整的URL并没有变,依然是上面的请求:

    http://www.test.com/test?a=21398+kjad
    

    那么,是什么原因导致的呢?

    后来网上查找了一下,发现很多人都遇到了和我一样的问题,其实,这是一个历史性的遗留问题,这篇博客这么写道:

    html中因为一些非标准的做法,将+等同于空格进行处理 (当Html的表单被提交时,每个表单域都会被Url编码之后才在被发送。由于历史的原因,表单使用的Url编码实现并不符合最新的标准。例如对于空格使用的编码并不是%20,而是+号,如果表单使用的是Post方法提交的,我们可以在HTTP头中看到有一个Content-Typeheader,值为application/x-www-form-urlencoded,大部分应用程序均能处理这种非标准实现的Url编码)。

    可以看到,其实,当后端收到+后,会以为是空格的编码,从而将其转换成了空格。(一般来讲,服务器会默认帮你做了这些处理的)

    ** Angular2中的坑 **
    眼看着问题似乎解决了,于是乎,在Angular2中,我在使用params设置键值的时候,将键值encodeUrlComponent了一下,本来准备坐等胜利的果实,结果却又仿佛一场噩梦:
    后台依然有空格!!!

    徘徊了许久、尝试了多次,依然不行,百无聊赖,只能看源码了:
    在使用URLSearchParams对象设置键值的时候,Angular2中的源码对字符有如下处理:

    function standardEncoding(v) {
        return encodeURIComponent(v)
            .replace(/%40/gi, '@')
            .replace(/%3A/gi, ':')
            .replace(/%24/gi, '$')
            .replace(/%2C/gi, ',')
            .replace(/%3B/gi, ';')
            .replace(/%2B/gi, '+')
            .replace(/%3D/gi, '=')
            .replace(/%3F/gi, '?')
            .replace(/%2F/gi, '/');
    }
    

    看到这儿,真的忍不住想吐血,心里暗骂了angular2一百遍。
    大家看出什么问题了吗?
    是的,它把我辛辛苦苦转化的%2B又给转换回去了!!!!

    写到这里,我真的没有明白,Angular2为什么要这么做,浪费了我好多时间。

    最后的解决方法也很简单很暴力了,直接自己拼接encodeUrlComponent后的字符,不使用URLSearchParams对象。

    相关文章

      网友评论

      本文标题:Angular2 get请求 加号转为空格

      本文链接:https://www.haomeiwen.com/subject/nadzbttx.html