【问题标题】:How can I append dictionary to URL as parameters?如何将字典作为参数附加到 URL?
【发布时间】:2017-08-14 03:34:03
【问题描述】:

我需要传递简单的字典:

var dictionary: [AnyHashable: Any] = [
    "a": 1,
    "b": "title",
    "c": ["a", "b"],
    "d": ["a": 1, "b": ["a", "b"]]
]

到网址:

let url = URL(string: "http://example.com")!

我该怎么做?

另一方面,如何从 URL 访问参数?

imessage 中的输出:

【问题讨论】:

    标签: ios swift dictionary


    【解决方案1】:

    如果您只是想从值字典中创建一个参数字符串,并且希望它简单,您可以执行以下操作:

    var str = ""
    for key in dictionary.keys {
        if str.isEmpty {
            str = "\(key)=\(dictionary[key]!)"
        } else {
            str += "&\(key)=\(dictionary[key]!)"
        }
    

    但是,上面没有对特殊字符进行编码,也没有做任何其他特殊处理。因此,更好的选择是按照以下几行向 Dictionary 添加扩展:

    extension Dictionary {
        var queryParameters: String {
            var parts: [String] = []
            for (key, value) in self {
                let part = String(format: "%@=%@",
                                  String(describing: key).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!,
                                  String(describing: value).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
                parts.append(part as String)
            }
            return parts.joined(separator: "&")
        }
    
    }
    
        }
    

    然后,您可以简单地说dictionary.queryParameters 来获取将字典内容转换为参数字符串的字符串。

    【讨论】:

    • 像魅力一样工作。
    【解决方案2】:

    根据您的参数要求,我不知道这是否是您要寻找的,但是...

    如果您想附加和检查 URL 参数,您可以使用 NSURLComponents

    在你的情况下,你可以摆脱这样的事情:

    var dictionary: [AnyHashable: Any] = [
        "a": 1,
        "b": "title",
        "c": ["a", "b"],
        "d": ["a": 1, "b": ["a", "b"]]
    ]
    
    let url = URL(string: "http://example.com")!
    
    var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)
    
    let queryItems = dictionary.map{
        return URLQueryItem(name: "\($0)", value: "\($1)")
    }
    
    urlComponents?.queryItems = queryItems
    
    print(urlComponents?.url) //gives me Optional(http://example.com?b=title&a=1&d=%5B%22b%22:%20%5B%22a%22,%20%22b%22%5D,%20%22a%22:%201%5D&c=%5B%22a%22,%20%22b%22%5D)
    

    有趣的部分是URLComponents 本身,它将您提供给它的 URL “分解”成您可以检查的部分。

    然后,要添加 URL 查询参数,您可以使用 URLQueryItem 类并将这些 URLQueryItem 项目的数组提供给您的 URLComponents 实例。在这个快速示例中,我只是将您的字典中的map 转换为URLQueryItems 的数组,但您可能会想到一些更可靠的东西:)

    URLComponents 当然也可以反过来使用...我的意思是,如果你有一个带参数的 URL,你可以创建一个 URLComponents 的实例,然后查询 queryItems

    希望对你有所帮助。

    【讨论】:

    • cocoapods 中是否有用于此的库?;)
    • @BartłomiejSemańczyk 不是我知道的 :) 所以你有机会创建自己的函数,或者 - 如果你愿意的话 - 扩展 URL 例如......如何很酷的是;)
    • 我会检查的。你为什么说我需要更坚实的东西?您的解决方案是否适用于更复杂的词典?
    • @BartłomiejSemańczyk 我在想,只是试图通过执行"\($1)" 将字典中的任何内容转换为String 在某些奇怪的情况下可能会出错,例如如果字典更复杂可能是。我的意思是,我在这里走的是简单的道路,只是依靠内置的“转换为字符串”方法......也许有时会产生奇怪的结果。但是......我不知道,这纯粹是为了预测潜在的问题,嘿,也许它只是有效:) 至少祝你好运 :)
    • 那么如何将整个字典转换为 base64 编码?并且这些数据转换为一个参数...
    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2019-06-29
    • 2021-11-07
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    相关资源
    最近更新 更多