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

2014-10-10 17:44:58 +08:00
 aWangami
大概的需求是这样的
别人有一个接口,暂且定义为 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.

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

$src = parse_url($_GET['src']);
parse_str($src['query']);
echo $key1,$key2;
lizheming
2014-10-10 18:37:31 +08:00
啊,等下,我说的是PHP是这么写的...没有实现了解语言什么的真是抱歉了OwQ
aWangami
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
2014-10-10 20:06:46 +08:00
src的地址会回传给你吗?
回传的话,你在根据这个url解析出来是了,如3楼的parse_url
多层url的只能自己解析了
iyaozhen
2014-10-10 20:13:08 +08:00
但是如果编码了的话,www.my.com就获取不到参数了(当www.api.com请求我的地址时)
不懂这句话的意思,难道不是你请求api然后得到数据完事。
aWangami
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
2014-10-10 20:56:29 +08:00
@aWangami 最好先认真试了再来认真吐槽,说的好像我回答的文不对题一样。
http://3v4l.org/X5ajP
aWangami
2014-10-10 21:34:44 +08:00
@lizheming 我没有那个意思哦,我很多时候表述得不清楚,这个网站不错哎。我的情况大概是这样的,http://3v4l.org/C43GH ,参数拿到得不完整
Mutoo
2014-10-10 21:57:43 +08:00
anheiyouxia
2014-10-10 22:28:29 +08:00
我不知道你问这个问题是不是希望 [别人有一个接口] 的这个接口不需要做改变的情况下在你这边解决这个问题,如果是,那应该是不可能的了,如果不是,那就这样:

[编码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
2014-10-10 22:31:28 +08:00
lz你多滤了吧 通常情况下 A地址拿到url之后如果再发请求出去会自动解码 所以你B地址接受A那边发来的请求的时候应该是可以拿到参数的。
如果还不行,那解决办法是要么让A那边处理一下,解码src的地址之后再发请求;要么你就不要用问号&号和#号来处理参数,你可以改用5个连写的1当成问号,5个连写的2当成&,5个连写的3当成#,反正到了B地址你可以自己处理这些连接符,兼容一下就好了
aWangami
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
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
2014-10-12 09:21:45 +08:00
@lizheming 嘿嘿,是的,这也是学习的过程嘛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138091

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX