ios - ios - 如何使用包含Swift中相同键的多个值的查询参数构建URL?

  显示原文与译文双语对照的内容

我在iOS应用程序中使用 AFNetworking,并且对它所做的所有获取请求来构建 URL,而不是添加 NSDictionary key-value 对。

问题是,我需要不同的值的相同键。

下面是我所需要的最后一个网址的例子-

http://example.com/.....&id=21212&id=21212&id=33232

在NSDictionary中不可能在同一键中有不同的值。 所以我尝试了NSSet但不工作。


let productIDSet: Set = [prodIDArray]


let paramDict = NSMutableDictionary()


paramDict.setObject(productIDSet, forKey:"id")



时间:

你所需要的只是 NSURLComponents 。 基本思想是为你的id创建一组查询项 下面是你可以粘贴到运动场的代码:


import UIKit


import XCPlayground



let queryItems = [NSURLQueryItem(name:"id", value:"2121"), NSURLQueryItem(name:"id", value:"3232")]


let urlComps = NSURLComponents(string:"www.apple.com/help")!


urlComps.queryItems = queryItems


let URL = urlComps.URL!


XCPlaygroundPage.currentPage.captureValue(URL.absoluteString, withIdentifier:"URL")



你将看到一个输出

www.apple.com/help?id=2121&id=3232

它可以为你的现有URL添加英镑的QueryItem


extension URL {



 @discardableResult


 func append(_ queryItem: String, value: String?) -> URL {



 guard var urlComponents = URLComponents(string: absoluteString) else { return absoluteURL }



//create array of existing query items


 var queryItems: [URLQueryItem] = urlComponents.queryItems?? []



//create query item if value is not nil


 guard let value = value else { return absoluteURL }


 let queryItem = URLQueryItem(name: queryItem, value: value)



//append the new query item in the existing query items array


 queryItems.append(queryItem)



//append updated query items array in the url component object


 urlComponents.queryItems = queryItems//queryItems?.append(item)



//returns the url from new url components


 return urlComponents.url!


 }


}



使用


var url = URL(string:"https://www.testing.com")!


let finalURL = url.append("test", value:"123")


. append("test2", value: nil)




func queryString(_ value: String, params: [String: String]) -> String? { 


 var components = URLComponents(string: value)


 components?.queryItems = params.map { element in URLQueryItem(name: element.key, value: element.value) }



 return components?.url?.absoluteString


}



我想你只需要做这样的事情:


let params = ["id" : [1, 2, 3, 4],.. .];



将被编码为: ...id%5B%5D=1&id%5B%5D=2&id%5B%5D=3&id%5B%5D=4....

...