V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
aWangami
V2EX  ›  问与答

URL 里的特殊符号应该怎么处理,比如问号?

  •  
  •   aWangami · 2014-10-10 17:44:58 +08:00 · 3623 次点击
    这是一个创建于 3698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大概的需求是这样的
    别人有一个接口,暂且定义为 http://www.api.com/url.php?src=xxx
    然后我需要传一个xxx给这个接口

    xxx其实也是一个url,那么现在问题来了
    这个url是自己定义的,当然会有一些诸如?/&之类的符号
    对这个xxx进行urlencode当然可以,api就可以正确的得到我的地址了
    但是,我自己的url就无法正确的得到其中的参数了,因为被编码了嘛

    那如果自己的encode当然也可以,只要api能够正确的拿到url,同时自己正确的拿到参数

    [原始的URL]
    [A] http://www.api.com/url.php?src=xxx
    [B] http://www.my.com/api.php?key1=xxx&key2=xxx

    [未编码] api是拿不到完整的url的
    http://www.api.com/url.php?src=http://www.my.com/api.php?key1=xxx&key2=xxx

    [编码B] B自己就拿不到key1和key2等参数了
    http://www.api.com/url.php?src=http%3A%2F%2Fwww.my.com%2Fapi.php%3Fkey1%3Dxxx%26key2%3Dxxx

    [只编码B中的问号?这样似乎不可以]
    http://www.api.com/url.php?src=http://www.my.com/api.php%3Fkey1=xxx&key2=xxx
    => The requested URL xxx was not found on this server.

    像上面的情况,我应该怎么处理呢?请教大神~
    16 条回复    2014-10-12 09:21:45 +08:00
    wingoo
        1
    wingoo  
       2014-10-10 18:12:01 +08:00
    [编码B] 拿到src解码再取
    aWangami
        2
    aWangami  
    OP
       2014-10-10 18:15:30 +08:00
    @wingoo 不是api要参数,是src=xxx后面的xxx(xxx也是一个url)需要获取参数
    lizheming
        3
    lizheming  
       2014-10-10 18:35:17 +08:00
    url标准就是要把参数urlencode了之后再传递的好么,所以只能也必须编码了之后再传。标准的做法应该是这样的:

    $src = parse_url($_GET['src']);
    parse_str($src['query']);
    echo $key1,$key2;
    lizheming
        4
    lizheming  
       2014-10-10 18:37:31 +08:00
    啊,等下,我说的是PHP是这么写的...没有实现了解语言什么的真是抱歉了OwQ
    aWangami
        5
    aWangami  
    OP
       2014-10-10 19:59:28 +08:00
    @lizheming 是PHP,不过我需要的是在www.my.com里获取参数,而不是在www.api.com获取参数,因为www.my.com的那一串是我传递给api的,但是如果编码了的话,www.my.com就获取不到参数了(当www.api.com请求我的地址时)
    wingoo
        6
    wingoo  
       2014-10-10 20:06:46 +08:00
    src的地址会回传给你吗?
    回传的话,你在根据这个url解析出来是了,如3楼的parse_url
    多层url的只能自己解析了
    iyaozhen
        7
    iyaozhen  
       2014-10-10 20:13:08 +08:00
    但是如果编码了的话,www.my.com就获取不到参数了(当www.api.com请求我的地址时)
    不懂这句话的意思,难道不是你请求api然后得到数据完事。
    aWangami
        8
    aWangami  
    OP
       2014-10-10 20:19:33 +08:00
    @wingoo
    @iyaozhen
    多层URL怎么解析呢?
    嗯,需求大概是像微信开发那样子(不是微信),类似于www.api.com需要获取数据的时候,就请求www.my.com然后www.my.com返回数据给www.api.com。区别就在于,www.api.com请求的时候不会传递任何参数过来,所以我需要把参数放到www.my.com的url中,以便处理
    lizheming
        9
    lizheming  
       2014-10-10 20:56:29 +08:00   ❤️ 1
    @aWangami 最好先认真试了再来认真吐槽,说的好像我回答的文不对题一样。
    http://3v4l.org/X5ajP
    aWangami
        10
    aWangami  
    OP
       2014-10-10 21:34:44 +08:00
    @lizheming 我没有那个意思哦,我很多时候表述得不清楚,这个网站不错哎。我的情况大概是这样的,http://3v4l.org/C43GH ,参数拿到得不完整
    anheiyouxia
        12
    anheiyouxia  
       2014-10-10 22:28:29 +08:00   ❤️ 1
    我不知道你问这个问题是不是希望 [别人有一个接口] 的这个接口不需要做改变的情况下在你这边解决这个问题,如果是,那应该是不可能的了,如果不是,那就这样:

    [编码B] B自己就拿不到key1和key2等参数了
    http://www.api.com/url.php?src=http%3A%2F%2Fwww.my.com%2Fapi.php%3Fkey1%3Dxxx%26key2%3Dxxx


    你传过去的时候先把src的值编码一下再传过去
    对方获取到这个src的值的时候再decode不久可以拿到key12的值了?
    你自己要用你自己也可以decode
    exceloo
        13
    exceloo  
       2014-10-10 22:31:28 +08:00 via iPhone   ❤️ 1
    lz你多滤了吧 通常情况下 A地址拿到url之后如果再发请求出去会自动解码 所以你B地址接受A那边发来的请求的时候应该是可以拿到参数的。
    如果还不行,那解决办法是要么让A那边处理一下,解码src的地址之后再发请求;要么你就不要用问号&号和#号来处理参数,你可以改用5个连写的1当成问号,5个连写的2当成&,5个连写的3当成#,反正到了B地址你可以自己处理这些连接符,兼容一下就好了
    aWangami
        14
    aWangami  
    OP
       2014-10-10 23:32:27 +08:00
    @Mutoo
    @anheiyouxia
    对方确实会对src参数进行一次encode之后再处理的,是我自己处理的有问题,应该使用这种方式
    escape("http://www.api.com/url.php?src="+escape("http://www.my.com/api.php?key1=xxx&key2=xxx"))

    @exceloo
    后来发现,urlencode后的url通过浏览器传递给程序的时候会自动进行一次(其实是浏览器帮忙了)decode,所以导致了获取到的参数有误。本来想实在不行确实可以像你说的那样自己来处理,现在可以啦~也可以把所有的参数打包base64_encode一下,这样自己拿到的参数就不会有问题了

    按照大家说的尝试了一下,现在可以啦
    不知道escape(xxx) 是不是等价于 urlencode(urlencode(xxx)),不过这样确实可以~
    我在代码里面对参数进行了两次encode,把%->%25,这样子获取的参数就完整了
    [ http://3v4l.org/Uh3TW ]

    [ http://3v4l.org/C43GH ]
    'http://www.my.com/api.php?url=http%3A%2F%2Fwww.my2.com%2Fapi.php%3Fkey1%3Dxxx%26key2%3Dyyy%26key3%3Dzzz';
    www.my.com 获取到的url为: http://www.my.com/api.php?key1=xxx ,后面的参数没有了,这也是一开始遇到的问题

    [ http://3v4l.org/WDd4E ]
    'http://www.my.com/api.php?url='.'http%253A%252F%252Fwww.my.com%252Fapi.php%253Fkey1%253Dxxx%2526key2%253Dxxx';
    www.my.com 获取到的url为: http://www.my.com/api.php?key1=xxx&key2=xxx

    上面就是我想要的结果~
    谢谢大家~
    lizheming
        15
    lizheming  
       2014-10-11 13:40:26 +08:00
    @aWangami 一个简单的问题搞的这么复杂... http://3v4l.org/qCa74
    一般来说前面2-4行是不需要的,因为请求过来的url会被程序解析,第6行的$url在实际上就是$_GET['url'],也就回到了我3楼的答案。
    你10楼的错误在于urldecode过早,在parse_str前urldecode导致了$src['query']变成了`url=http://www.my2.com/api.php?key1=xxx&key2=yyy`,这个你自己解析都解析不过去了吧。
    aWangami
        16
    aWangami  
    OP
       2014-10-12 09:21:45 +08:00
    @lizheming 嘿嘿,是的,这也是学习的过程嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1305 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:55 · PVG 07:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.