gpt4 book ai didi

swift - 如何忽略 URL 中的参数?

转载 作者:搜寻专家 更新时间:2023-11-01 06:52:16 26 4
gpt4 key购买 nike

我的应用解码 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=”之后的完整 URL。

这是对解码字符串的函数的初始调用:

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

这有帮助吗?

最佳答案

如果您修改了问题,请给我们提供以下网址:

let string = "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="

很明显-3A__://_-3F/?- 26&-3D=,等等。所以如果你这样做:

let replacements = [
"-3A__": "%3A//",
"_-3F": "/%3F",
"-26": "%26",
"-3D": "%3D",
"-2D": "%2D",
"-25": "%25"
]

let result = replacements.reduce(string) { (string, tuple) -> String in
return string.replacingOccurrences(of: tuple.key, with: tuple.value)
}

let components = URLComponents(string: result)!
for item in components.queryItems! {
print(item.name, item.value!)
}

您最终使用以下参数调用 hxxps://ue.pt.com/v2/url:

u https://oe.le.com/?authkey=%21IB-CRV-qQ88&cid=BACDF2ED353D&id=BACDF2EFB61D353D%21549&parId=root&o=OneUp
d DwMGaQ
c WNpQK9bFmT89misLWAzsd66s44iGV-VujF_o4whjrfc
r Ej_UhLznQMBqt3H3IYBQkjyx4xqdnS9mLiYA
m HOBrLfxamFr4PYdACIR-A49th_oIe3MW69N7X-E
s bXWSJ8gaSbKSlNuIf30S7Qsa6RcMKA-EOvP577XUyq0
e

这里的关键是参数authkey, cid, id, parId, o 用于 oe.le.com URL,但所有其他参数,dcr mse 不是编码为 u,而是 ue.pt.com URL 的单独参数。您不想将它们作为 oe.le.com 的 URL 的一部分。

我的原始答案如下。


让我们尝试从另一个方向来解决这个问题。

请考虑我正在构建 URL 的这两种情况。首先,我有一个 g.com 参数,它是 u,这是一个具有参数的 URL:

var components = URLComponents(string: "http://g.com")!
components.queryItems = [
URLQueryItem(name: "u", value: "http://a.com/test?d=foo&e=bar")
]
let url = components.url

你会看到那个 url 是

http://g.com/?u=http://a.com/test?d%3Dfoo%26e%3Dbar

请注意,=& 分别转义为 %3D%26,因为它们是隐藏在与 u 参数关联的值中的 URL 参数,而不是 g.com URL 本身的实际参数。

替代方案是 g.com 的 URL 具有三个参数,ude:

var components2 = URLComponents(string: "http://g.com")!
components2.queryItems = [
URLQueryItem(name: "u", value: "http://a.com/test"),
URLQueryItem(name: "d", value: "foo"),
URLQueryItem(name: "e", value: "bar")
]
let url2 = components2.url

产生:

http://g.com/?u=http://a.com/test&d=foo&e=bar

请注意,=& 没有进行百分比转义,因为它们是 g.com URL 的参数,而不是 的参数code>a.com 包含 u 值的 URL。

您似乎给了我们一个由第二种情况生成的 URL,但坚持认为它确实与第一种情况一样。如果是这样,则原始 URL 未正确进行百分比编码并且无效。更有可能的是,第二种情况适用,参数是 g.com URL,而不是 u 值的一部分。


请注意,您为我们提供了一个 URL:

hxxp://www.g.com/url?u=http://a.com/test&d=another

如果 d 确实是 a.com URL 的参数,则该 URL 将是 http://a.com/test?d=another ,而不是 http://a.com/test&d=another(注意 ?,而不是 &。)

所以这进一步证明 d 参数确实是 g.com url 的参数,而 u 参数确实只是 http://a.com/test

关于swift - 如何忽略 URL 中的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56395395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com