如何忽略URL中的参数?

时间:2019-05-31 12:46:54

标签: swift url decode

我的应用程序对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

有帮助吗?

4 个答案:

答案 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的参数authkeycididparIdo但所有其他参数oe.le.comdcrms都不是一部分的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.comg.comu

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
    }

我真的很想这个。