Kotlin में HTTP क्लाइंट: सही तरीके से अनुरोध करना — उन्नत स्तर
\n\nKotlin में आधुनिक एप्लिकेशन विकसित करते समय, HTTP-अनुरोधों के साथ काम करना URL.readText() के सरल कॉल से कहीं आगे निकल जाता है। उन्नत स्तर पर, कनेक्शन प्रबंधन, टाइमआउट, पुनः प्रयास, लॉगिंग, एसिंक्रोनसिटी और त्रुटियों का सही प्रबंधन करना आवश्यक है। इस लेख में, हम दो लोकप्रिय लाइब्रेरीज़: OkHttp और Ktor Client का उपयोग करके, Kotlin में production-वातावरण के लिए HTTP-क्लाइंट को कॉन्फ़िगर करने का तरीका समझेंगे। यह सामग्री उन डेवलपर्स के लिए है जो Kotlin और HTTP की मूल बातों से पहले से परिचित हैं।
1. लाइब्रेरी का चयन: OkHttp बनाम Ktor Client
\nकोड लिखने से पहले, दृष्टिकोणों के बीच अंतर को समझना महत्वपूर्ण है। OkHttp Square की एक परिपक्व, समय-परीक्षित लाइब्रेरी है जो Retrofit के साथ मिलकर बहुत अच्छा काम करती है। Ktor Client JetBrains की एक मूल मल्टीप्लेटफ़ॉर्म लाइब्रेरी है जो Kotlin कोरूटीन के साथ पूरी तरह से एकीकृत है। Spring Boot पर सर्वर प्रोजेक्ट्स के लिए अक्सर OkHttp चुना जाता है, जबकि Ktor एप्लिकेशन या मल्टीप्लेटफ़ॉर्म प्रोजेक्ट्स के लिए Ktor Client चुना जाता है।
\n\nहम दोनों विकल्पों पर विचार करेंगे ताकि आप अपने स्टैक के लिए उपयुक्त विकल्प चुन सकें।
\n\n2. OkHttp की उन्नत कॉन्फ़िगरेशन
\nOkHttp का बुनियादी कॉन्फ़िगरेशन सरल है, लेकिन production के लिए सूक्ष्म कॉन्फ़िगरेशन की आवश्यकता होती है। आइए कस्टम पैरामीटर के साथ Singleton-क्लाइंट बनाने पर विचार करें।
\n\nimport okhttp3.*\nimport java.util.concurrent.TimeUnit\n\nobject HttpClientProvider {\n\n private val client: OkHttpClient by lazy {\n OkHttpClient.Builder()\n .connectTimeout(30, TimeUnit.SECONDS)\n .readTimeout(30, TimeUnit.SECONDS)\n .writeTimeout(30, TimeUnit.SECONDS)\n .retryOnConnectionFailure(true)\n .addInterceptor(LoggingInterceptor())\n .addInterceptor(RetryInterceptor(maxRetries = 3))\n .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES))\n .build()\n }\n\n fun getClient(): OkHttpClient = client\n}\n\n2.1 कस्टम इंटरसेप्टर
\nइंटरसेप्टर अनुरोधों और प्रतिक्रियाओं को संशोधित करने के लिए एक शक्तिशाली तंत्र हैं। नीचे एक लॉगिंग इंटरसेप्टर और पुनः प्रयास के लिए इंटरसेप्टर का उदाहरण दिया गया है।
\n\nclass LoggingInterceptor : Interceptor {\n override fun intercept(chain: Interceptor.Chain): Response {\n val request = chain.request()\n println("--> ${request.method} ${request.url}")\n val startTime = System.nanoTime()\n val response = chain.proceed(request)\n val duration = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)\n println("<-- ${response.code} ${response.message} (${duration}ms)")\n return response\n }\n}\n\nclass RetryInterceptor(private val maxRetries: Int) : Interceptor {\n override fun intercept(chain: Interceptor.Chain): Response {\n var retryCount = 0\n var response: Response? = null\n while (retryCount < maxRetries) {\n try {\n response = chain.proceed(chain.request())\n if (response.isSuccessful) return response\n } catch (e: Exception) {\n println("Retry #${retryCount + 1} failed: ${e.message}")\n }\n retryCount++\n if (retryCount < maxRetries) Thread.sleep(1000L * retryCount)\n }\n return response ?: throw IOException("Max retries exceeded")\n }\n}\n\n2.2 कोरूटीन के साथ एसिंक्रोनस अनुरोध
\nOkHttp सिंक्रोनस और एसिंक्रोनस (कॉलबैक-आधारित) अनुरोधों का समर्थन करता है। Kotlin कोरूटीन के साथ एकीकरण के लिए हम suspendCancellableCoroutine का उपयोग करते हैं।
suspend fun makeRequest(url: String): String {\n return suspendCancellableCoroutine { continuation ->\n val request = Request.Builder().url(url).build()\n val call = HttpClientProvider.getClient().newC