GETअनुरोध का निर्माण करते समय , अनुरोध के लिए कोई निकाय नहीं होता है, बल्कि URL पर सब कुछ चलता है। एक URL बनाने के लिए (और इसे ठीक से प्रतिशत से बचने के लिए), आप भी उपयोग कर सकते हैं URLComponents।
var url = URLComponents(string: "https://www.google.com/search/")!
url.queryItems = [
URLQueryItem(name: "q", value: "War & Peace")
]
एकमात्र चाल यह है कि अधिकांश वेब सेवाओं को +चरित्र प्रतिशत की आवश्यकता होती है, क्योंकि वे अंतरिक्ष application/x-www-form-urlencodedविनिर्देश के रूप में व्याख्या करते हैं ( विनिर्देश द्वारा तय की गई है )। लेकिन URLComponentsप्रतिशत इससे बच नहीं पाएंगे। Apple का कहना है कि +एक क्वेरी में एक वैध चरित्र है और इसलिए इसे बच नहीं जाना चाहिए। तकनीकी रूप से, वे सही हैं, कि यह एक यूआरआई की क्वेरी में अनुमति है, लेकिन application/x-www-form-urlencodedअनुरोधों में इसका एक विशेष अर्थ है और वास्तव में इसे पास नहीं किया जाना चाहिए।
Apple स्वीकार करता है कि हमें +पात्रों से बचकर प्रतिशत निकालना है , लेकिन सलाह है कि हम इसे मैन्युअल रूप से करते हैं:
var url = URLComponents(string: "https://www.wolframalpha.com/input/")!
url.queryItems = [
URLQueryItem(name: "i", value: "1+2")
]
url.percentEncodedQuery = url.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
यह एक आसन्न काम है, लेकिन यह काम करता है, और यह कि Apple क्या सलाह देता है यदि आपके प्रश्नों में एक +चरित्र शामिल हो सकता है और आपके पास एक सर्वर है जो उन्हें रिक्त स्थान के रूप में व्याख्या करता है।
इसलिए, अपनी sendRequestदिनचर्या के साथ संयोजन करके , आप कुछ इस तरह से समाप्त करते हैं:
func sendRequest(_ url: String, parameters: [String: String], completion: @escaping ([String: Any]?, Error?) -> Void) {
var components = URLComponents(string: url)!
components.queryItems = parameters.map { (key, value) in
URLQueryItem(name: key, value: value)
}
components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
let request = URLRequest(url: components.url!)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data,
let response = response as? HTTPURLResponse,
(200 ..< 300) ~= response.statusCode,
error == nil else {
completion(nil, error)
return
}
let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
completion(responseObject, nil)
}
task.resume()
}
और आप इसे पसंद करेंगे:
sendRequest("someurl", parameters: ["foo": "bar"]) { responseObject, error in
guard let responseObject = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
}
व्यक्तिगत रूप से, मैं JSONDecoderआजकल उपयोग करूंगा और structएक शब्दकोश के बजाय एक कस्टम वापस करूंगा , लेकिन यह वास्तव में यहां प्रासंगिक नहीं है। उम्मीद है कि यह कैसे GET अनुरोध के URL में पैरामीटर को एन्कोड करने के मूल विचार को दिखाता है।
स्विफ्ट 2 और मैनुअल प्रतिशत बचने के लिए इस उत्तर के पिछले संशोधन को देखें ।
extension stringकि मूल्यों का क्या कर रहा हूं ? इसके बाद मुझे कब उपयोग करने की आवश्यकता होगीHttpBody?