परिचय: बुनियादी GET से औद्योगिक HTTP-क्लाइंट तक
\nSwift पर मानक HTTP-अनुरोध URLSession.shared.dataTask के साथ कोड की तीन पंक्तियाँ हैं। लेकिन वास्तविक परियोजनाओं (फ़ाइल अपलोड, टोकन के साथ प्रमाणीकरण, कैशिंग, रीट्राई) में यह पर्याप्त नहीं है। इस लेख में हम iOS और macOS के लिए Swift पर HTTP-क्लाइंट बनाने की उन्नत तकनीकों पर चर्चा करेंगे: कस्टम प्रोटोकॉल, सत्र प्रबंधन, async/await और Combine के माध्यम से मल्टीथ्रेडिंग, और विश्वसनीय त्रुटि प्रबंधन। यह सामग्री URLSession की मूल बातों से पहले से परिचित डेवलपर्स के लिए है।
उन्नत HTTP-क्लाइंट की आर्किटेक्चर
\nऔद्योगिक क्लाइंट केवल एक अनुरोध फ़ंक्शन नहीं है, बल्कि एक अमूर्तता परत है। इसे तीन स्तरों में विभाजित करें:
\n- \n
- Transport Layer — URLSession के साथ निम्न-स्तरीय कार्य, कॉन्फ़िगरेशन प्रबंधन। \n
- Service Layer — सीरियलाइज़ेशन/डीसीरियलाइज़ेशन, स्थिति-कोड प्रबंधन, रीट्राई। \n
- Application Layer — व्यावसायिक तर्क, कैशिंग, प्रमाणीकरण। \n
URLProtocol के माध्यम से Transport Layer को कस्टमाइज़ करके शुरू करें।
\n\n1. अनुरोधों को इंटरसेप्ट और संशोधित करने के लिए कस्टम URLProtocol
\nURLProtocol एप्लिकेशन में सभी नेटवर्क अनुरोधों को इंटरसेप्ट करने के लिए एक शक्तिशाली तंत्र है। इसकी मदद से लॉगिंग, अनुरोधों पर हस्ताक्षर या परीक्षण के लिए मॉक-डेटा जोड़ा जा सकता है।
\nimport Foundation\n\nclass LoggingProtocol: URLProtocol {\n override class func canInit(with request: URLRequest) -> Bool {\n // सभी HTTP/HTTPS अनुरोधों को इंटरसेप्ट करें\n return request.url?.scheme == "http" || request.url?.scheme == "https"\n }\n\n override class func canonicalRequest(for request: URLRequest) -> URLRequest {\n return request\n }\n\n override func startLoading() {\n print("📤 अनुरोध: \\(request.httpMethod ?? "GET") \\(request.url?.absoluteString ?? "")")\n print("📦 हेडर: \\(request.allHTTPHeaderFields ?? [:])")\n\n let task = URLSession.shared.dataTask(with: request) { [weak self] data, response, error in\n guard let self = self else { return }\n if let error = error {\n print("❌ त्रुटि: \\(error.localizedDescription)")\n self.client?.urlProtocol(self, didFailWithError: error)\n } else if let data = data, let response = response {\n print("✅ उत्तर: \\(response.expectedContentLength) बाइट")\n self.client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .allowed)\n self.client?.urlProtocol(self, didLoad: data)\n }\n self.client?.urlProtocolDidFinishLoading(self)\n }\n task.resume()\n }\n\n override func stopLoading() {\n // कुछ नहीं करते, कार्य स्वयं समाप्त हो जाता है\n }\n}\n\n// प्रोटोकॉल पंजीकरण\nURLProtocol.registerClass(LoggingProtocol.self)\nlet config = URLSessionConfiguration.default\nconfig.protocolClasses = [LoggingProtocol.self]\nlet session = URLSession(configuration: config)\nअब इस सत्र के माध्यम से सभी अनुरोध लॉग होंगे। इसी तरह Bearer-टोकन का स्वचालित जोड़ या 401 स्थिति का प्रबंधन जोड़ा जा सकता है।
\n\n2. सत्र प्रबंधन: कस्टम कॉन्फ़िगरेशन और मल्टीथ्रेडिंग
\nविभिन्न उद्देश्यों के लिए अलग-अलग URLSessionConfiguration का उपयोग करें: सामान्य अनुरोधों के लिए .default, निजी डेटा के लिए .ephemeral (बिना कैश और कुकीज़ के), पृष्ठभूमि डाउनलोड के लिए .background।
let backgroundConfig = URLSessionConfiguration.background(withIdentifier: "com.pythonlib.background")\nbackgroundConfig.isDiscretionary = true\nbackgroundConfig.sessionSendsLaunchEvents = true\nlet backgroundSession = URLSession(configuration: backgroundConfig, delegate: self, delegateQueue: nil)\nमल्टीथ्रेडिंग के लिए async/await (Swift 5.5+) का उपयोग करें:
func performRequest(url: URL) async throws -> Data {\n let (data, response)