URL पैरामीटर का मान प्राप्त करें


81

मैं स्विफ्ट का उपयोग करके URL से पैरामीटर प्राप्त करने का प्रयास कर रहा हूं। मान लें कि मेरे पास निम्न URL है:

http://mysite3994.com?test1=blah&test2=blahblah

मैं टेस्ट 1 और टेस्ट 2 के मूल्यों को कैसे प्राप्त कर सकता हूं?

जवाबों:


187

आप परम प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं

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
        }
    }
}

क्यों डाली NSURLQueryItem? कुछ अनावश्यक
अलेक्जेंडर

3
इसके अलावा, यह उपयोग करने के लिए बेहतर है first(where:)के बजाय filter(_:)तो first। यह पहला मैच ढूंढते ही बंद हो जाता है, इसलिए यह बहुत तेज़ है। इसके अलावा यह एक सरणी आवंटन बचाता है
अलेक्जेंडर

1
@ user2423476 अब चेक करें मैंने स्विफ्ट के साथ खेल के मैदान में परीक्षण किया है 3.
पार्थ अद्रोजा

1
@ Matian2049 "EZSwiftExtensions" नामक एक पुस्तकालय है जिसका आप उपयोग कर सकते हैं।
पार्थ अद्रोजा

1
सही कॉलिंग विधि है: ---- let1 test1 = getQueryStringParameter (url: url, param: "test1")
pw2

72

चरण 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"

27

मैंने एक 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"

आप इस तरह का उपयोग कर सकते हैं, urlString = URL (string: url.absoluteString) जाने दें! गार्ड letNName = urlString.valueOf ("userName"), let कोड = urlString.valueOf ("कोड"), userId = urlString.valueOf ("userName") को छोड़ दें और फिर {रिटर्न असत्य} प्रिंट करें ("विवरण: (urlString)" ) प्रिंट ("userName: (userName)") प्रिंट ("कोड: (कोड)") प्रिंट ("userId: (userId)")
मेहुल

@Mehul आप किसी अन्य URL से URL क्यों बनाएंगे, let urlString = URL(string: url.absoluteString)!यह व्यर्थ है। Btw के URLपास कोई valueOfविधि नहीं है।
सिंह डबस

9

ऐसा प्रतीत होता है कि कोई भी मौजूदा उत्तर तब काम नहीं करता जब लिंक एंगुलर पर बनाई गई वेब साइट की ओर जाता है। ऐसा इसलिए होता है क्योंकि कोणीय के रास्तों में प्रायः #सभी लिंक में एक (हैश) चिन्ह शामिल होता है , जिसके परिणामस्वरूप 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.fragment का उल्लेख करके मेरा दिन बचाया। बहुत बहुत धन्यवाद।
कीहन कामंगर

2

ऐसा करने का एक और तरीका यह है कि घटकों को वापस करने के लिए 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)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.