【发布时间】:2019-10-17 02:55:22
【问题描述】:
我的应用程序对 URL 进行解码,我注意到当它遇到“&”时,该过程会停止并忽略 URL 的其余部分。似乎 URLComponents 正在将 URL 分解为多个部分 - 我的必需参数和它认为是参数的那个。
hxxp://www.g.com/url?u=http://a.com/test&d=another
- scheme : "hxxp"
- host : "www.g.com"
- path : "/url"
▿ queryItems : 2 elements
▿ 0 : u=http://a.com/test
- name : "u"
▿ value : Optional<String>
- some : "http://a.com/test"
▿ 1 : d=another
- name : "d"
▿ value : Optional<String>
- some : "another"
我需要的是“u=”之后的完整网址。
这是对解码字符串的函数的初始调用:
if (fullDecode.contains("?u=")) {
initialDecode = getQueryStringParameter(urlToAttempt: fullDecode, param: "u")!
这里是返回解码字符串的函数:
func getQueryStringParameter(urlToAttempt: String, param: String) -> String? {
guard let urlDecoded = URLComponents(string: urlToAttempt) else { return nil }
print(urlDecoded)
return urlDecoded.queryItems?.first(where: { $0.name == param })?.value
}
对于这段代码,如果 url 是“http://www.g.com/url?u=http://a.com/test&d=another”,它将返回“http://a.com/test”——其他所有内容都被删除了。我希望它返回“http://a.com/test&d=another”
有没有一种方法可以让我使用 URLComponents 做到这一点,或者我是否需要编写自定义代码来支持这一点?
更新 如果我更改传递给“hxxp://www.g.com/url?u=http://a.com/test%26d=another”的 url,URLComponents 会返回完整的 url,并且 &d=another 不变。我现在将尝试在发送到函数之前对特殊字符进行百分比编码,看看是否能解决问题。
第二次更新
这是我需要解码的经过大量修改的链接类型:
hxxps://ue.pt.com/v2/url?u=https-3A__oe.le.com_-3Fauthkey-3D-2521IB-2DCRV-2DqQ88-26cid-3DBACDF2ED353D-26id-3DBACDF2EFB61D353D-2521549-26parId-3Droot-26o-3DOneUp&d=DwMGaQ&c=WNpQK9bFmT89misLWAzsd66s44iGV-VujF_o4whjrfc&r=Ej_UhLznQMBqt3H3IYBQkjyx4xqdnS9mLiYA&m=HOBrLfxamFr4PYdACIR-A49th_oIe3MW69N7X-E&s=bXWSJ8gaSbKSlNuIf30S7Qsa6RcMKA-EOvP577XUyq0&e=
这些链接是生成的,这就是为什么我无法控制链接的构建方式。我需要能够将此链接解码为清晰的 URL。我有特殊混淆的字典,例如“-3A__”是“://”上面失败的地方是你看到 &d=DwM... 它没有被编码,这就是 URLComponents 失败的地方:
https://oe.le.com/?authkey=!IB-CRV-qQ88&cid=BACDF2ED353D&id=BACDF2EFB6353D!549&parId=root&o=OneUp
这有帮助吗?
【问题讨论】:
-
这种行为似乎合乎逻辑。我读到:http://...url...?key1=param1&key2=param2,其中 key1 = u,param1 是 a.com/test,key2 = d,param2 = another。我们怎么知道“&key2=param2”不是一个新的参数,而是在param1里面呢?我猜错过了一些转义。
-
Url-in-url 应该是percent encoded
-
@Rob - 网址就是这样。它根本不是百分比编码的。我可以在它到达函数之前或在函数中对其进行百分比编码,但我不确定这是否能解决 &d 仍然被视为 URLComponents 的参数
-
另外,
http://a.com/test&d=another— 不是有效的 URL,就像它的查询无效:它应该以?而不是&开头。所以,URLComponents只会以正确的方式解析它。 -
“我想我不明白。我从来没有说过我有问题? - 它始终是与号 (&)” ...您在修改后的示例中提供的 URL 有一个
-3F(这是?在包含在u参数中的 URL 中,但在您的原始示例)。这里的问题是哪些参数与哪个 URL(主 URL,或隐藏在u参数中的 URL)和缺少的?之间的混淆是解释实际情况的关键。最重要的是,不用担心,因为您修改后的示例清楚地说明了发生了什么。