OkHttp Android और Kotlin के लिए एक उच्च-प्रदर्शन HTTP क्लाइंट है, जिसे Square कंपनी ने Retrofit और अन्य नेटवर्किंग लाइब्रेरियों के आधार के रूप में विकसित किया है। यह कुशल कनेक्शन प्रबंधन, अंतर्निहित कैशिंग और HTTP/2 समर्थन प्रदान करता है। Square, 2025 के अनुसार, OkHttp दुनिया भर के एप्लिकेशन में प्रतिदिन अरबों अनुरोधों को संभालता है।
मुख्य बिंदु
OkHttp Java, Android और Kotlin के लिए एक कुशल HTTP क्लाइंट है, जिसे Square कंपनी ने विकसित किया है। लाइब्रेरी HTTP/2, SPDY, WebSocket और नेटवर्क विफलताओं पर स्वचालित कनेक्शन पुनर्प्राप्ति के समर्थन के साथ HTTP अनुरोधों को निष्पादित करने के लिए निम्न-स्तरीय API प्रदान करती है।
OkHttp 2013 में एक विश्वसनीय HTTP क्लाइंट की आवश्यकता के जवाब में उभरा जो HttpURLConnection की समस्याओं को हल करता था — कनेक्शन पूल की कमी, कमज़ोर HTTP/2 समर्थन, और असुविधाजनक API। 2025 तक, OkHttp का उपयोग Android API सिस्टम स्तर पर किया जाता है: OkHttp Android 4.4 (API 19) से HttpURLConnection कार्यान्वयन में एम्बेडेड है।
Google I/O 2024 के अनुसार, OkHttp Android इकोसिस्टम में सभी HTTP अनुरोधों का 70% से अधिक संभालता है। यह संभव है क्योंकि OkHttp Retrofit, Apollo GraphQL, Firebase और कई अन्य लाइब्रेरियों के लिए ट्रांसपोर्ट लेयर के रूप में कार्य करता है। डेवलपर्स OkHttp की कार्यक्षमता स्वचालित रूप से प्राप्त करते हैं बिना इसे स्पष्ट रूप से जोड़े।
OkHttp आर्किटेक्चर इंटरसेप्टर श्रृंखला पर बनाया गया है। प्रत्येक अनुरोध इंटरसेप्टर के अनुक्रम से गुज़रता है जो अनुरोध, प्रतिक्रिया को संशोधित कर सकता है या निष्पादन को रोक सकता है। यह आर्किटेक्चर Chain of Responsibility पैटर्न जैसा दिखता है और लचीली विस्तारशीलता की अनुमति देता है।
जब कोई एप्लिकेशन अनुरोध भेजता है, OkHttp निम्नलिखित चरण करता है: DNS हल करता है, पूल से कनेक्शन चुनता है (या नया बनाता है), TLS हैंडशेक खोलता है (यदि HTTPS है), HTTP अनुरोध भेजता है, प्रतिक्रिया प्राप्त करता है और इसे एप्लिकेशन को लौटाता है। RealCall आंतरिक वर्ग है जो निर्माण से पूर्णता तक अनुरोध के पूर्ण जीवनचक्र का प्रबंधन करता है।
OkHttp स्वचालित रूप से रीडायरेक्ट (302, 301) को संभालता है, नेटवर्क विफलताओं पर अनुरोधों को पुनः प्रयास करता है, keep-alive प्रोटोकॉल का पालन करता है, और पारदर्शी gzip संपीड़न का समर्थन करता है। डेवलपर को इन संचालनों के लिए कोड लिखने की आवश्यकता नहीं है — OkHttp उन्हें सर्वर हेडर के आधार पर स्वचालित रूप से करता है।
HTTP/2 एक ही TCP कनेक्शन पर एक साथ कई अनुरोध भेजने की अनुमति देता है, बिना हेड-ऑफ-लाइन ब्लॉकिंग (HTTP/1.1 की विशेषता) के। OkHttp स्वचालित रूप से HTTP/2 का उपयोग करता है यदि सर्वर इसका समर्थन करता है, और आवश्यक होने पर पारदर्शी रूप से HTTP/1.1 पर वापस आ जाता है।
HTTP/2 मल्टीप्लेक्सिंग मोबाइल एप्लिकेशन के लिए विशेष रूप से महत्वपूर्ण है, जहाँ कनेक्शन स्थापना विलंबता (TCP + TLS) 100–300 मिलीसेकंड हो सकती है। 10 अनुक्रमिक कनेक्शनों के बजाय, OkHttp एक का उपयोग करता है, जो अस्थिर कनेक्शन वाले विशिष्ट Android उपकरणों पर कुल विलंबता को 40–60% तक कम करता है।
Interceptor एक एकल विधि intercept(Chain) वाला इंटरफ़ेस है, जो अनुरोध प्राप्त करता है, कार्रवाई करता है और प्रतिक्रिया लौटाता है। दो प्रकार के इंटरसेप्टर होते हैं: एप्लिकेशन इंटरसेप्टर (addInterceptor के माध्यम से जोड़े गए) और नेटवर्क इंटरसेप्टर (addNetworkInterceptor)।
एप्लिकेशन इंटरसेप्टर HTTP अनुरोध बनने से पहले सक्रिय होते हैं — वे मूल अनुरोध और सभी परिवर्तनों के बाद अंतिम प्रतिक्रिया देखते हैं। नेटवर्क इंटरसेप्टर नेटवर्क स्तर पर सक्रिय होते हैं: वे gzip संपीड़न, Content-Length हेडर जोड़ने, रीडायरेक्ट और पुनः प्रयास के बाद अनुरोध देखते हैं। यदि प्रतिक्रिया कैश से प्राप्त होती है तो नेटवर्क इंटरसेप्टर कॉल नहीं किए जाते हैं।
| इंटरसेप्टर प्रकार | जोड़ने की विधि | कब कॉल किया जाता है | कैश देखता है |
|---|---|---|---|
| Application Interceptor | addInterceptor() | अनुरोध से पहले और बाद में | हाँ |
| Network Interceptor | addNetworkInterceptor() | नेटवर्क स्तर पर | नहीं |
व्यवहार में, OkHttp इंटरसेप्टर तीन मुख्य कार्य हल करते हैं: प्राधिकरण (Authorization हेडर जोड़ना), लॉगिंग (डीबगिंग के लिए HttpLoggingInterceptor), और पुनः प्रयास (नेटवर्क विफलताओं पर स्वचालित अनुरोध पुनरावृत्ति)। कई इंटरसेप्टरों को मिलाकर, एप्लिकेशन के प्रत्येक HTTP कॉल में कोड दोहराए बिना एक पूर्ण अनुरोध प्रसंस्करण पाइपलाइन बनाई जा सकती है।
इंटरसेप्टर जोड़ने का क्रम मायने रखता है: पहले जोड़ा गया Interceptor प्रवेश पर पहले और निकास पर अंतिम निष्पादित होता है। NetworkInterceptor के लिए, क्रम नेटवर्क स्टैक द्वारा निर्धारित किया जाता है। अनुशंसित क्रम: AuthInterceptor (टोकन जोड़ता है), LoggingInterceptor (अनुरोध लॉग करता है), RetryInterceptor (विफलता पर पुनः प्रयास करता है)।
नेटवर्क अनुरोधों को डीबग करने के लिए, HttpLoggingInterceptor का उपयोग किया जाता है — Square का एक तैयार इंटरसेप्टर। यह विधि, URL, हेडर और अनुरोध/प्रतिक्रिया निकाय को लॉग करता है। लॉगिंग स्तर: BASIC (विधि + URL + कोड), HEADERS (हेडर के साथ), और BODY (पूर्ण अनुरोध और प्रतिक्रिया)। BODY विकास के दौरान उपयोगी है लेकिन सुरक्षा और प्रदर्शन कारणों से उत्पादन में इसे अक्षम कर दिया जाता है।
आइए OkHttp का उपयोग करके एक बुनियादी GET अनुरोध देखें। पहले, OkHttpClient बनाया जाता है — एक भारी ऑब्जेक्ट जो एक बार बनाया जाता है और पुनः उपयोग किया जाता है। फिर URL के साथ एक अनुरोध बनाया जाता है, और अनुरोध execute के माध्यम से समकालिक रूप से या enqueue के माध्यम से अतुल्यकालिक रूप से निष्पादित किया जाता है।
val client = OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build()
val request = Request.Builder()
.url("https://api.github.com/users/octocat")
.header("Accept", "application/vnd.github.v3+json")
.build()
val response = client.newCall(request).execute()
println(response.body()?.string())
अतुल्यकालिक निष्पादन के लिए, enqueue विधि का उपयोग किया जाता है, जो एक Callback स्वीकार करती है। OkHttp अनुरोध को पृष्ठभूमि थ्रेड में निष्पादित करता है और उसी थ्रेड पर कॉलबैक में परिणाम लौटाता है। Android मुख्य थ्रेड पर स्विच करने के लिए, Handler या कोरूटीन का उपयोग करें।
client.newCall(request).enqueue(object : Callback {
override fun onFailure(
call: Call, e: IOException
) {
println("अनुरोध विफल: ${e.message}")
}
override fun onResponse(
call: Call, response: Response
) {
println(response.body()?.string())
}
})
एक कस्टम Interceptor प्रत्येक अनुरोध में Bearer टोकन जोड़ता है। इंटरसेप्टर Authorization हेडर की उपस्थिति की जाँच करता है, और यदि टोकन अभी तक सेट नहीं है, तो इसे स्टोरेज से जोड़ता है। 401 प्रतिक्रिया पर, इंटरसेप्टर Authenticator के माध्यम से टोकन को रीफ़्रेश कर सकता है।
class AuthInterceptor(
private val tokenProvider: () -> String?
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
val token = tokenProvider.invoke()
val request = originalRequest.newBuilder()
.header("Authorization", "Bearer $token")
.build()
return chain.proceed(request)
}
}
कनेक्शन पूल (ConnectionPool) OkHttp का एक मुख्य अनुकूलन है जो कई अनुरोधों के लिए TCP कनेक्शन के पुन: उपयोग की अनुमति देता है। प्रत्येक अनुरोध के लिए नया सॉकेट बनाने के बजाय, OkHttp 5 मिनट के लिए 5 निष्क्रिय कनेक्शन (डिफ़ॉल्ट रूप से) संग्रहीत करता है, जो उसी होस्ट के लिए बार-बार अनुरोधों पर विलंबता को 30–70% कम करता है।
प्रतिक्रिया कैशिंग Cache वर्ग के माध्यम से कार्यान्वित की जाती है। कैशिंग सक्षम करने के लिए, OkHttpClient.Builder में निर्देशिका और अधिकतम आकार निर्दिष्ट करें। OkHttp स्वचालित रूप से Cache-Control, Expires और ETag हेडर के अनुसार GET प्रतिक्रियाओं को कैश करता है, यदि वे पुरानी नहीं हैं तो बिना नेटवर्क अनुरोध के कैश किया गया डेटा लौटाता है।
val cacheDir = File(context.cacheDir, "http-cache")
val cache = Cache(cacheDir, 10L * 1024 * 1024)
val client = OkHttpClient.Builder()
.cache(cache)
.connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES))
.build()
पूल और कैश का उचित कॉन्फ़िगरेशन विशेष रूप से बार-बार अनुरोधों वाले एप्लिकेशन — समाचार फ़ीड, चैट, डेटा अपडेट — के लिए महत्वपूर्ण है। पूल के बिना, प्रत्येक TCP कनेक्शन को तीन-तरफ़ा हैंडशेक (SYN, SYN-ACK, ACK) और संभावित TLS हैंडशेक (2–3 राउंड ट्रिप) की आवश्यकता होती है, जो प्रत्येक अनुरोध में 100–500 मिलीसेकंड जोड़ता है।
OkHttp RealWebSocket वर्ग के माध्यम से WebSocket का भी समर्थन करता है। WebSocket कनेक्शन HTTP हैंडशेक (101 Switching Protocols) के माध्यम से स्थापित होता है और फिर द्विदिश प्रोटोकॉल पर स्विच करता है। OkHttp कनेक्शन को सक्रिय रखने के लिए स्वचालित रूप से ping फ्रेम भेजता है और डिस्कनेक्ट होने पर पुनः कनेक्ट होता है। OkHttp का WebSocket wss://echo.websocket.org जैसे मानक एंडपॉइंट के साथ संगत है।
प्रत्येक अनुरोध के लिए OkHttpClient बनाना सबसे आम गलती है। OkHttpClient में कनेक्शन पूल, कैश और थ्रेड पूल होता है। प्रत्येक अनुरोध के लिए नया इंस्टेंस बनाना न केवल मेमोरी बर्बाद करता है बल्कि कनेक्शन पुन: उपयोग के लाभ को भी खो देता है। OkHttpClient को DI कंटेनर के माध्यम से सिंगलटन होना चाहिए।
Response.body() को बंद करने की अनदेखी संसाधन रिसाव का कारण बनती है। ResponseBody में एक InputStream होता है जिसे पढ़ने के बाद बंद किया जाना चाहिए। यदि body().string() या body().bytes() का उपयोग किया जाता है, OkHttp स्ट्रीम को स्वचालित रूप से बंद कर देता है, लेकिन body().byteStream() या body().charStream() पढ़ते समय finally ब्लॉक में स्पष्ट close() कॉल की आवश्यकता होती है।
टाइमआउट हैंडलिंग का अभाव एक और समस्या है। डिफ़ॉल्ट रूप से, OkHttp में connectTimeout 10 सेकंड, readTimeout 10 सेकंड और writeTimeout 10 सेकंड है। अस्थिर कनेक्शन वाले मोबाइल एप्लिकेशन के लिए, connectTimeout 15–30 सेकंड और readTimeout 15–30 सेकंड सेट करने की अनुशंसा की जाती है, अन्यथा उपयोगकर्ता कमज़ोर सिग्नल के साथ बहुत देर तक प्रतीक्षा करेगा।
अक्सर पूछे जाने वाले प्रश्न
OkHttp एक निम्न-स्तरीय HTTP क्लाइंट है जिसमें मैन्युअल अनुरोध और प्रतिक्रिया प्रबंधन है। Retrofit एनोटेशन के साथ एक उच्च-स्तरीय अमूर्तता है। OkHttp का उपयोग Retrofit के लिए ट्रांसपोर्ट लेयर के रूप में किया जाता है, लेकिन यह अतिरिक्त लाइब्रेरी के बिना स्वतंत्र रूप से भी काम कर सकता है।
OkHttp TLS हैंडशेक के लिए SSLSocketFactory का उपयोग करता है। लाइब्रेरी सर्टिफिकेट पिनिंग के लिए CertificatePinner, कस्टम वैलिडेशन के लिए TrustManager और सर्टिफिकेट के विरुद्ध होस्टनाम की जाँच के लिए HostnameVerifier का समर्थन करती है।
समकालिक अनुरोध नेटवर्क समस्याओं पर IOException फेंकते हैं। अतुल्यकालिक अनुरोधों को IOException के साथ onFailure कॉल प्राप्त होता है। HTTP त्रुटियों (4xx, 5xx) के लिए, प्रतिक्रिया सफल मानी जाती है — त्रुटि कोड response.isSuccessful() के माध्यम से जाँचा जाता है।
हाँ, OkHttp में WebSocket वर्ग और WebSocketListener के माध्यम से अंतर्निहित WebSocket समर्थन है। कनेक्शन स्थापित करने के बाद, WebSocket बार-बार HTTP अनुरोधों के बिना वास्तविक समय में संदेश भेजने और प्राप्त करने की अनुमति देता है।
OkHttpClient.Builder में followRedirects(false) और followSslRedirects(false) के माध्यम से स्वचालित रीडायरेक्ट अक्षम करें। यह तब उपयोगी होता है जब आपको मैन्युअल रूप से रीडायरेक्ट संभालने की आवश्यकता होती है, उदाहरण के लिए, रीडायरेक्ट URL से टोकन निकालने के लिए।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें