我的应用程序对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 =另一个。现在,我将尝试在发送给函数之前对特殊字符进行百分比编码,以查看是否可以解决问题。
第二次更新
这里是我需要解码的链接的严重修改类型:
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
有帮助吗?
答案 0 :(得分:1)
URLComponents
在这种情况下正在正确解析您的网址。
&
可以而且可能属于外部URL
,因为内部URL
甚至都不会启动查询部分(它没有{{1} })。
因此?
被解析为:
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"
(hxxp://www.g.com/url?u=http://a.com/test?d=another
替换为&d
)的解析方式类似于
?d
在这里,您在- scheme: "hxxp"
- host: "www.g.com"
- path: "/url"
▿ queryItems: 1 element
▿ u=http://a.com/test?d=another
- name: "u"
▿ value: Optional("http://a.com/test?d=another")
- some: "http://a.com/test?d=another"
查询参数中获得了所有内部URL
。
答案 1 :(得分:1)
如果您的问题有修改,请给我们提供以下网址:
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
是{{1} }等。如果您这样做:
=
您最终使用以下参数调用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
URL的参数authkey
,cid
,id
,parId
和o
但所有其他参数oe.le.com
,d
,c
,r
,m
和s
都不是一部分的URL编码为e
的一部分,而是u
URL的单独参数。您不想将它们作为ue.pt.com
的URL的一部分。
我的原始答案如下。
让我们尝试从另一个方向解决这个问题。
请考虑以下两种情况,即我在其中构建URL。首先,我对oe.le.com
有一个参数,即g.com
,这是一个具有参数的URL:
u
您会看到网址是
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
请注意,http://g.com/?u=http://a.com/test?d%3Dfoo%26e%3Dbar
和=
分别以&
和%3D
的百分比进行转义,因为它们是与{关联的值中埋藏的URL的参数{1}}参数,实际上不是%26
URL本身的参数。
另一种情况是u
的URL具有三个参数g.com
,g.com
和u
:
d
结果是:
e
请注意,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
并不是转义的百分比,因为它们是=
URL的参数,而不是{{1 }}值。
您似乎在给我们一个类似于第二种情况生成的URL,但坚持认为它确实与第一种情况类似。如果是这样,则原始网址尚未正确编码,因此无效。更有可能出现第二种情况,并且参数是&
URL的,而不是g.com
值的一部分。
关于它的价值,请注意,您给我们提供了以下网址:
a.com
如果u
确实是g.com
URL的参数,则该URL将是u
,而不是hxxp://www.g.com/url?u=http://a.com/test&d=another
(请注意,d
而不是{{ 1}}。)
因此,这进一步证明了a.com
参数实际上是http://a.com/test?d=another
url的参数,而http://a.com/test&d=another
参数实际上只是?
。
答案 2 :(得分:0)
您可以使用“?u =“作为分隔符来拆分URL字符串,并使用this function
获取第二个数组元素否则,您可以循环所有queryItems并将它们连接起来。
答案 3 :(得分:0)
我想发布我为纠正此问题所做的工作,但是所有提交的答案都帮助我走上了这条路。发送给该函数的代码如下:
if (fullDecode.contains("?u=")) {
fullDecode = fullDecode.replacingOccurrences(of: "&", with: "%26")
initialDecode = getQueryStringParameter(urlToAttempt: fullDecode, param: "u")!
如果uitextview fullDecode包含“?u =“,那么我知道视图中有文本。文本应该是完全模糊的URL,并且如果包含“&”,我会手动将其转换为%26。在我使用自定义词典进行其他转换之前,这将被发送到URLComponents函数。
func getQueryStringParameter(urlToAttempt: String, param: String) -> String? {
guard let urlDecoded = URLComponents(string: urlToAttempt) else { return nil }
return urlDecoded.queryItems?.first(where: { $0.name == param })?.value
}
我真的很想这个。