मैं स्विफ्ट का उपयोग करके URL से पैरामीटर प्राप्त करने का प्रयास कर रहा हूं। मान लें कि मेरे पास निम्न URL है:
http://mysite3994.com?test1=blah&test2=blahblah
मैं टेस्ट 1 और टेस्ट 2 के मूल्यों को कैसे प्राप्त कर सकता हूं?
मैं स्विफ्ट का उपयोग करके URL से पैरामीटर प्राप्त करने का प्रयास कर रहा हूं। मान लें कि मेरे पास निम्न URL है:
http://mysite3994.com?test1=blah&test2=blahblah
मैं टेस्ट 1 और टेस्ट 2 के मूल्यों को कैसे प्राप्त कर सकता हूं?
जवाबों:
आप परम प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं
func getQueryStringParameter(url: String, param: String) -> String? {
guard let url = URLComponents(string: url) else { return nil }
return url.queryItems?.first(where: { $0.name == param })?.value
}
जैसे विधि को बुलाओ let test1 = getQueryStringParameter(url, param: "test1")
एक्सटेंशन के साथ अन्य विधि:
extension URL {
public var queryParameters: [String: String]? {
guard
let components = URLComponents(url: self, resolvingAgainstBaseURL: true),
let queryItems = components.queryItems else { return nil }
return queryItems.reduce(into: [String: String]()) { (result, item) in
result[item.name] = item.value
}
}
}
first(where:)
के बजाय filter(_:)
तो first
। यह पहला मैच ढूंढते ही बंद हो जाता है, इसलिए यह बहुत तेज़ है। इसके अलावा यह एक सरणी आवंटन बचाता है
चरण 1: URL एक्सटेंशन बनाएं
extension URL {
func valueOf(_ queryParamaterName: String) -> String? {
guard let url = URLComponents(string: self.absoluteString) else { return nil }
return url.queryItems?.first(where: { $0.name == queryParamaterName })?.value
}
}
चरण 2: विस्तार का उपयोग कैसे करें
let newURL = URL(string: "http://mysite3994.com?test1=blah&test2=blahblah")!
newURL.valueOf("test1") // Output i.e "blah"
newURL.valueOf("test2") // Output i.e "blahblah"
मैंने एक URL एक्सटेंशन भी बनाया, लेकिन क्वेरी पैराम लुकअप को सबस्क्रिप्ट में डाल दिया।
extension URL {
subscript(queryParam:String) -> String? {
guard let url = URLComponents(string: self.absoluteString) else { return nil }
return url.queryItems?.first(where: { $0.name == queryParam })?.value
}
}
उपयोग:
let url = URL(string: "http://some-website.com/documents/127/?referrer=147&mode=open")!
let referrer = url["referrer"] // "147"
let mode = url["mode"] // "open"
let urlString = URL(string: url.absoluteString)!
यह व्यर्थ है। Btw के URL
पास कोई valueOf
विधि नहीं है।
ऐसा प्रतीत होता है कि कोई भी मौजूदा उत्तर तब काम नहीं करता जब लिंक एंगुलर पर बनाई गई वेब साइट की ओर जाता है। ऐसा इसलिए होता है क्योंकि कोणीय के रास्तों में प्रायः #
सभी लिंक में एक (हैश) चिन्ह शामिल होता है , जिसके परिणामस्वरूप url.queryItems
हमेशा वापस लौटना पड़ता है।
यदि कोई लिंक इस तरह दिखता है: http://example.com/path/#/morepath/aaa?test1=blah&test2=blahblah
तब पैरामीटर केवल से प्राप्त किया जा सकता है url.fragment
। @ मैट के विस्तार में जोड़े गए कुछ अतिरिक्त पार्सिंग तर्क के साथ, एक अधिक सार्वभौमिक कोड इस तरह दिखाई देगा:
extension URL {
subscript(queryParam: String) -> String? {
guard let url = URLComponents(string: self.absoluteString) else { return nil }
if let parameters = url.queryItems {
return parameters.first(where: { $0.name == queryParam })?.value
} else if let paramPairs = url.fragment?.components(separatedBy: "?").last?.components(separatedBy: "&") {
for pair in paramPairs where pair.contains(queryParam) {
return pair.components(separatedBy: "=").last
}
return nil
} else {
return nil
}
}
}
उपयोग समान रहता है:
let url = URL(string: "http://example.com/path/#/morepath/aaa?test1=blah&test2=blahblah")!
let referrer = url["test1"] // "blah"
let mode = url["test2"] // "blahblah"
ऐसा करने का एक और तरीका यह है कि घटकों को वापस करने के लिए URL पर एक एक्सटेंशन बनाया जाए, और फिर queryItems से मान प्राप्त करने के लिए [URLQueryItem] पर एक एक्सटेंशन बनाएं।
extension URL {
var components: URLComponents? {
return URLComponents(url: self, resolvingAgainstBaseURL: false)
}
}
extension Array where Iterator.Element == URLQueryItem {
subscript(_ key: String) -> String? {
return first(where: { $0.name == key })?.value
}
}
और यह एक उदाहरण है कि इसका उपयोग कैसे किया जा सकता है:
if let urlComponents = URL(string: "http://mysite3994.com?test1=blah&test2=blahblah")?.components,
let test1Value = urlComponents.queryItems?["test1"] {
print(test1Value)
}
NSURLQueryItem
? कुछ अनावश्यक