V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Powered
V2EX  ›  程序员

url 中有空格, encode 了之后,服务端只能拿到第一个空格前面的内容,求助?

  •  
  •   Powered · 2016-08-31 10:18:32 +08:00 via Android · 3492 次点击
    这是一个创建于 2985 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请求的参数有空格,如:/?title=aaa bbb ccc
    编码或者不编码,服务端拿到的 title 都是 aaa
    24 条回复    2016-08-31 22:53:51 +08:00
    alanjin
        1
    alanjin  
       2016-08-31 10:23:07 +08:00
    为什么 url 里面要放空格?
    Olive
        2
    Olive  
       2016-08-31 10:24:11 +08:00
    空格转成下滑线
    SharkIng
        3
    SharkIng  
       2016-08-31 10:25:12 +08:00
    URL 里面还能有空格?长见识了
    Powered
        4
    Powered  
    OP
       2016-08-31 10:25:41 +08:00 via Android
    @alanjin 因为字段的值包含空格
    isCyan
        5
    isCyan  
       2016-08-31 10:26:10 +08:00 via Android
    @SharkIng 谷歌百度搜索一个带空格的关键词 URL 里就有空格啊。
    SharkIng
        6
    SharkIng  
       2016-08-31 10:26:21 +08:00
    @SharkIng 有空格的例如 LZ 举例的标题都可以转成 %20 这样吧??
    Powered
        7
    Powered  
    OP
       2016-08-31 10:27:11 +08:00 via Android
    @SharkIng
    没说清楚,空格在 url 中被转为了%20
    然而服务端还是拿不到完整值
    lovedebug
        8
    lovedebug  
       2016-08-31 10:27:30 +08:00
    还是 JSON 大法好。很好奇服务器难道以空格分割?不是=号分割吗?
    Pastsong
        9
    Pastsong  
       2016-08-31 10:27:50 +08:00
    url encode 之后空格不都是 %20 这样吗
    lovedebug
        10
    lovedebug  
       2016-08-31 10:27:57 +08:00
    可以考虑先 escape 再 encode
    ljbha007
        11
    ljbha007  
       2016-08-31 10:28:40 +08:00
    出现这种情况其实是因为有些隐藏的逻辑错误、函数使用错误 楼主未给出完整信息无法解答
    Powered
        12
    Powered  
    OP
       2016-08-31 10:28:59 +08:00 via Android
    @lovedebug
    Json 当然好了,不过用在 post
    对啊,等号分割,然而现在像空格分割
    SourceMan
        13
    SourceMan  
       2016-08-31 10:29:03 +08:00


    虽然是 JavaScript 写的,但是道理是一样的
    lovedebug
        14
    lovedebug  
       2016-08-31 10:33:16 +08:00
    @Powered 之前碰到的
    1. 请求字段超长被截断
    2. 后端解析有问题或者按空格分割或者被后端多次处理,建议 debug 看看
    3. url 被其他函数过滤或者处理过才传给后端的,建议查一下
    Powered
        15
    Powered  
    OP
       2016-08-31 10:40:19 +08:00
    先谢谢楼上各位

    我的 URL 大概长这样: http://localhost:3000/?title=aaa%20bbb%20ccc

    使用 encodeURIComponent 和 decodeURIComponent 当然可以得到正确的值

    然而问题是...我使用了封装的对象

    (Koa2.0/es6)

    ```
    let queryBody = ctx.request.query;

    let title = queryBody.title;
    ```

    得到的是第一个空格前面的值
    gdtv
        16
    gdtv  
       2016-08-31 10:44:52 +08:00
    如果已经 encode 了服务器还是获取不到,那就是服务器端代码的问题 了
    Powered
        17
    Powered  
    OP
       2016-08-31 10:47:06 +08:00
    @gdtv 是服务端代码问题

    主要问题是 ctx.request.query 这行代码
    BoiledEgg
        18
    BoiledEgg  
       2016-08-31 11:27:30 +08:00
    ctx.request.url ctx.request.querystring 应该能拿到的吧?
    request.query 是 request.querystring 用 querystring 这个库解析出来的
    request.querystring 是 request.url 用 parseurl 这个库解析出来的
    一步步调看哪一步出问题了,应该% 20 代替空格就没问题了啊
    yhxx
        19
    yhxx  
       2016-08-31 11:29:36 +08:00
    @isCyan
    搜了一下“ 1 空格 2 ”
    https://www.google.com/search?q=1+2
    url 是这样的啊
    qiayue
        20
    qiayue  
       2016-08-31 11:40:01 +08:00
    @yhxx 你这个是搜索引擎自己做的规则,自己替换的
    bombless
        21
    bombless  
       2016-08-31 12:28:55 +08:00 via Android   ❤️ 1
    @qiayue 噗,自己搜 encodeuricomponent ,这个是 uri 规范里的规则
    qiayue
        22
    qiayue  
       2016-08-31 14:12:30 +08:00
    wmttom
        23
    wmttom  
       2016-08-31 15:19:35 +08:00   ❤️ 1
    看一下是不是中间解析 url 走了不同的 urlencode 标准,空格可能会有 + 或者 %20 的形式,确定前后端和中间处理都走一套。 可以参考 rfc 3986
    mingyun
        24
    mingyun  
       2016-08-31 22:53:51 +08:00
    url 对空格处理成+,然后服务器端接收到的会自动 urldecode ,输出空格
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2720 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:35 · PVG 16:35 · LAX 01:35 · JFK 04:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.