如何将字典附加到URL作为参数?

时间:2017-03-22 06:49:04

标签: ios swift dictionary

我需要传递简单字典:

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中的输出:

enter image description here

2 个答案:

答案 0 :(得分:12)

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

如果您想要追加并检查网址参数,可以使用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从你的字典到URLQueryItem的数组,但你可能会想到更坚实的东西:)

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

希望对你有所帮助。

答案 1 :(得分:3)

如果您只是想从值字典创建一个参数字符串,并希望它很简单,您可以这样做:

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来获取将字典内容转换为参数字符串的字符串。