MiniIO और कोटलिन के साथ S3 ऑब्जेक्ट अपलोड की समस्या का निवारण
जैसे क्लाउड स्टोरेज टूल के साथ काम करते समय मिनिओ स्थानीय सेटअप पर, अप्रत्याशित चुनौतियाँ उत्पन्न हो सकती हैं, विशेष रूप से कॉन्फ़िगरेशन और डेटा प्रबंधन के आसपास। 🛠
का उपयोग करते समय एक सामान्य त्रुटि का सामना करना पड़ा कोटलिन में मिनियो क्लाइंट S3-संगत सेवा पर ऑब्जेक्ट अपलोड करना प्राधिकरण में हेडर से संबंधित है, जिसके परिणामस्वरूप IllegalArgumentException होता है। यह समस्या न्यूलाइन वर्णों (n) के प्रबंधन से उत्पन्न होती है HTTP हेडर.
स्थानीय मिनिओ इंस्टेंस के साथ काम करने वाले डेवलपर्स के लिए, क्षेत्र कॉन्फ़िगरेशन अक्सर मामलों को जटिल बना सकता है। चूंकि मिनिओ अमेज़ॅन एस 3 का अनुकरण करता है लेकिन हेडर को अलग तरीके से संसाधित कर सकता है, विशेष रूप से ओकेएचटीटीपी के साथ टकराव हो सकता है, जो कोटलिन में एक लोकप्रिय HTTP क्लाइंट है जो हेडर प्रारूपों के बारे में सख्त है।
यह आलेख इस त्रुटि के मूल कारण का पता लगाएगा, यह जांच करेगा कि मिनिओ इस चुनौती से बचने या हल करने के लिए व्यावहारिक कदमों के साथ-साथ क्षेत्र की जानकारी कैसे पुनर्प्राप्त और कैश करता है। आइए देखें कि हम मिनियो और कोटलिन के साथ स्थानीय विकास के लिए निर्बाध S3 संगतता प्राप्त करने के लिए अपने सेटअप को कैसे समायोजित कर सकते हैं! 😊
आज्ञा | उपयोग और विवरण का उदाहरण |
---|---|
OkHttpClient.Builder() | यह बिल्डर OkHttpClient का एक उदाहरण बनाता है, जिससे डेवलपर्स को इंटरसेप्टर जैसे कस्टम कॉन्फ़िगरेशन जोड़ने की अनुमति मिलती है। यहां, यह हेडर अवरोधन और संशोधन को सक्षम बनाता है, जो हेडर में न्यूलाइन वर्णों को संभालने के लिए महत्वपूर्ण है। |
addInterceptor(Interceptor { chain ->addInterceptor(Interceptor { chain -> ... }) | अनुरोधों में हेरफेर करने के लिए HTTP क्लाइंट में एक इंटरसेप्टर जोड़ता है। इस उदाहरण में, इंटरसेप्टर समस्याग्रस्त न्यूलाइन वर्णों को हटाने के लिए हेडर मानों की जांच करता है और उन्हें साफ़ करता है, जिससे S3 प्राधिकरण के साथ संगतता सुनिश्चित होती है। |
Request.Builder().headers(headers.build()) | अवांछित वर्णों को फ़िल्टर करने के बाद हेडर का पुनर्निर्माण करके HTTP अनुरोध को संशोधित करता है। यह सुनिश्चित करता है कि मिनिओ का प्राधिकरण हेडर सही ढंग से स्वरूपित है, जिससे न्यूलाइन समस्या समाप्त हो जाती है। |
region("us-east-1") | मिनिओ क्लाइंट संचालन के लिए एक स्थिर क्षेत्र निर्दिष्ट करता है। किसी क्षेत्र को स्पष्ट रूप से सेट करने से अनावश्यक क्षेत्र सत्यापन को रोका जा सकता है और मिनीओ को स्थानीय रूप से चलाने पर त्रुटि से बचा जा सकता है, जिसके लिए विशिष्ट क्षेत्रों की आवश्यकता नहीं होती है। |
MinioClient.builder() | निर्दिष्ट सेटिंग्स के साथ एक मिनियो क्लाइंट का निर्माण करता है। कॉन्फ़िगरेशन को अनुकूलित करने के लिए MinioClient.builder() का उपयोग करना आवश्यक है, जैसे एंडपॉइंट, क्रेडेंशियल और क्षेत्र को सीधे सेट करना। |
CompletableFuture.completedFuture(region) | एसिंक्रोनस प्रोसेसिंग के लिए पहले से पूरा किया गया CompletableFuture उदाहरण बनाता है। यहां, यह एक पूर्व-निर्धारित क्षेत्र लौटाता है, क्षेत्र डेटा को गतिशील रूप से लाने की आवश्यकता के बिना अनुरोध को सुव्यवस्थित करता है। |
assertDoesNotThrow { ... } | बिना किसी अपवाद के कोड निष्पादन को मान्य करने के लिए कोटलिन में एक परीक्षण कमांड। यह जाँचने के लिए उपयोगी है कि क्या हमारा हेडर संशोधन तर्क दोषपूर्ण हेडर फ़ॉर्मेटिंग के कारण IllegalArgumentException को ट्रिगर करने से बचता है। |
bucketExists("bucket-name") | जाँचता है कि क्या MiniIO के भीतर कोई विशिष्ट बकेट मौजूद है। परीक्षणों में, यह कमांड यह सत्यापित करने में मदद करता है कि क्लाइंट सही ढंग से कॉन्फ़िगर किया गया है और विभिन्न वातावरणों में हमारे सेटअप की वैधता की पुष्टि करते हुए संसाधनों तक पहुंच सकता है। |
assertTrue { ... } | एक JUnit कमांड जो बूलियन अभिव्यक्ति का दावा करता है वह सत्य है। यहां, इसका उपयोग बकेट अस्तित्व को सत्यापित करने के लिए किया जाता है, यह दर्शाता है कि मिनिओ कॉन्फ़िगरेशन S3-संगत स्टोरेज तक सही ढंग से पहुंच रहा है। |
IOException | विशेष रूप से HTTP अनुरोध विफलताओं से संबंधित इनपुट/आउटपुट त्रुटियों को पकड़ने के लिए यहां एक अपवाद हैंडलिंग क्लास का उपयोग किया जाता है। मिनिओ के नेटवर्क संचालन से उत्पन्न होने वाले मुद्दों को संभालने के लिए इस अपवाद को लपेटना आवश्यक है। |
कोटलिन मिनियो S3 हेडर त्रुटि के समाधान को समझना
को हल करने के लिए स्क्रिप्ट विकसित की गईं मिनिआईओ हेडर फ़ॉर्मेटिंग कोटलिन के साथ समस्या यह अनुकूलित करने पर केंद्रित है कि S3-संगत अनुरोधों के दौरान HTTP हेडर को कैसे प्रबंधित किया जाता है। यहां मुख्य समस्या न्यूलाइन कैरेक्टर में है जिसे मिनिओ कुछ हेडर में जोड़ता है, जो तब इसका कारण बनता है OkHttp त्रुटि उत्पन्न करने के लिए लाइब्रेरी। पहला समाधान OkHttp के साथ एक कस्टम इंटरसेप्टर लागू करके इसका समाधान करता है, जिससे हमें हेडर को भेजे जाने से पहले हेरफेर करने की अनुमति मिलती है। यह इंटरसेप्टर अवांछित न्यूलाइन वर्णों के लिए प्रत्येक हेडर का निरीक्षण करता है और उन्हें हटा देता है, जिससे S3 की प्राधिकरण प्रक्रिया के साथ अनुकूलता सुनिश्चित होती है। 🛠️ यह दृष्टिकोण स्थानीय विकास सेटअपों के लिए एक समाधान है जहां विशिष्ट क्षेत्रीय कॉन्फ़िगरेशन की आवश्यकता नहीं होती है।
वैकल्पिक स्क्रिप्ट में, क्लाइंट कॉन्फ़िगरेशन के दौरान क्षेत्र को स्पष्ट रूप से "us-east-1" पर सेट करके एक सरल समाधान का उपयोग किया जाता है। स्थानीय स्तर पर परीक्षण करते समय यह फायदेमंद होता है, क्योंकि यह किसी क्षेत्र को गतिशील रूप से पुनः प्राप्त करने और आवंटित करने के लिए मिनिओ की आवश्यकता को दरकिनार कर देता है। क्षेत्र को स्पष्ट रूप से परिभाषित करके, कोड हेडर त्रुटियों से पूरी तरह बचता है। यह विशेष रूप से सहायक है यदि आपके मिनिओ सेटअप को विशिष्ट क्षेत्र प्रबंधन की आवश्यकता नहीं है लेकिन यह एक बुनियादी, स्थानीय उदाहरण है। साथ में, ये दोनों विधियां हेडर समस्या से निपटने में लचीलापन प्रदान करती हैं, जो इस बात पर निर्भर करता है कि उपयोगकर्ता क्षेत्र ऑटो-डिटेक्शन को संरक्षित करना चाहता है या पूर्वनिर्धारित क्षेत्र के साथ काम कर सकता है।
मुख्य समाधानों के अलावा, यह सत्यापित करने के लिए यूनिट परीक्षण बनाए जाते हैं कि ये संशोधन अपेक्षा के अनुरूप काम करते हैं। यूनिट परीक्षण दो चीजों की जांच करता है: क्लाइंट हेडर में न्यूलाइन वर्णों को सफलतापूर्वक हटा देता है, और यह कि बकेट निश्चित क्षेत्र सेटअप के साथ पहुंच योग्य है। यूनिट परीक्षण जैसे assertDoesNotThrow यह सुनिश्चित करने के लिए उपयोग किया जाता है कि किसी ऑब्जेक्ट को अपलोड करने से IllegalArgumentException ट्रिगर न हो। यह सुनिश्चित करने के लिए परीक्षण में महत्वपूर्ण है कि इंटरसेप्टर सेटअप न्यूलाइन समस्या को ठीक से संबोधित करता है। इसी प्रकार, यह दावा सही है सत्यापित करता है कि सही मिनिआईओ कॉन्फ़िगरेशन के साथ एक बकेट मौजूद है, जिससे यह सुनिश्चित होता है कि समग्र सेटअप अपेक्षित रूप से कार्य करता है। ये परीक्षण विभिन्न कॉन्फ़िगरेशन में अनुकूलता की पुष्टि करने के लिए विशेष रूप से महत्वपूर्ण हैं।
कुल मिलाकर, कस्टम इंटरसेप्टर, स्पष्ट क्षेत्र सेटिंग और व्यापक इकाई परीक्षणों का संयुक्त उपयोग एक मजबूत समाधान प्रदान करता है। यह दृष्टिकोण न केवल समस्या का समाधान करता है बल्कि वास्तविक दुनिया के विकास के लिए स्क्रिप्ट भी तैयार करता है, जहां क्षेत्रीय और कॉन्फ़िगरेशन लचीलापन आवश्यक हो सकता है। इंटरसेप्टर तकनीकों को परीक्षण-संचालित विकास के साथ जोड़कर, ये स्क्रिप्ट हेडर को प्रबंधित करने के लिए एक पूर्ण, अनुकूलनीय दृष्टिकोण प्रदान करती हैं Kotlin MiniIO और OkHttp के साथ। इन स्क्रिप्ट्स को पुन: प्रयोज्यता के लिए डिज़ाइन किया गया है और यदि आवश्यक हो तो अधिक जटिल कॉन्फ़िगरेशन या अतिरिक्त हेडर को संभालने के लिए समायोजित किया जा सकता है, जिससे वे समान वातावरण में काम करने वाले डेवलपर्स के लिए मूल्यवान बन जाते हैं। 😊
समाधान 1: कोटलिन (बैकएंड दृष्टिकोण) का उपयोग करके मिनिआईओ के साथ हेडर फ़ॉर्मेटिंग समस्याओं का समाधान करना
बैकएंड कोटलिन स्क्रिप्ट का उपयोग करना अनुकूलित मिनियो क्लाइंट हेडर फ़ॉर्मेटिंग को सही करने के लिए कॉन्फ़िगरेशन और त्रुटि प्रबंधन
// Import necessary packages
import io.minio.MinioClient
import io.minio.errors.MinioException
import okhttp3.OkHttpClient
import okhttp3.Interceptor
import okhttp3.Request
import java.io.IOException
// Function to create customized MinIO client with correct headers
fun createCustomMinioClient(): MinioClient {
// Customized OkHttpClient to intercept and fix header
val httpClient = OkHttpClient.Builder()
.addInterceptor(Interceptor { chain ->
var request: Request = chain.request()
// Check headers for unwanted characters and replace if necessary
val headers = request.headers.newBuilder()
headers.forEach { header ->
if (header.value.contains("\n")) {
headers.set(header.first, header.value.replace("\n", ""))
}
}
request = request.newBuilder().headers(headers.build()).build()
chain.proceed(request)
}).build()
// Create and return the MinIO client with custom HTTP client
return MinioClient.builder()
.endpoint("http://localhost:9000")
.credentials("accessKey", "secretKey")
.httpClient(httpClient)
.build()
}
fun main() {
try {
val minioClient = createCustomMinioClient()
minioClient.putObject("bucket-name", "object-name", "file-path")
println("Upload successful!")
} catch (e: MinioException) {
println("Error occurred: ${e.message}")
}
}
समाधान 2: मॉक रीजन कॉन्फ़िगरेशन (बैकएंड) का उपयोग करके वैकल्पिक कोटलिन कार्यान्वयन
बैकएंड कोटलिन कोड जो क्षेत्र ऑटो-डिटेक्शन को बायपास करने के लिए एक निश्चित क्षेत्र सेट करता है
// Import required packages
import io.minio.MinioClient
import io.minio.errors.MinioException
fun createFixedRegionMinioClient(): MinioClient {
// Directly assign region "us-east-1" for compatibility with MinIO
return MinioClient.builder()
.endpoint("http://localhost:9000")
.credentials("accessKey", "secretKey")
.region("us-east-1") // Set fixed region to avoid detection issues
.build()
}
fun main() {
try {
val minioClient = createFixedRegionMinioClient()
minioClient.putObject("bucket-name", "object-name", "file-path")
println("Upload successful with fixed region!")
} catch (e: MinioException) {
println("Error occurred: ${e.message}")
}
}
समाधान 3: मिनिआईओ हेडर समस्या समाधान के लिए यूनिट परीक्षण
यूनिट परीक्षण में Kotlin मिनियो क्लाइंट सेटअप को सत्यापित करने और यह सुनिश्चित करने के लिए कि हेडर सही ढंग से कॉन्फ़िगर किए गए हैं
// Import required test libraries
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Assertions.assertDoesNotThrow
// Test to verify header configuration correctness
class MinioClientHeaderTest {
@Test
fun testHeaderFormatting() {
assertDoesNotThrow {
val minioClient = createCustomMinioClient()
minioClient.putObject("bucket-name", "object-name", "file-path")
}
}
// Test fixed region configuration method
@Test
fun testFixedRegionConfiguration() {
assertTrue {
val minioClient = createFixedRegionMinioClient()
minioClient.bucketExists("bucket-name")
}
}
}
कोटलिन में मिनिओ क्षेत्र और हेडर संगतता की खोज
कोटलिन के साथ स्थानीय रूप से मिनियो का उपयोग करते समय, एक पहलू को अक्सर नजरअंदाज कर दिया जाता है क्षेत्र विन्यास. हालाँकि MiniIO Amazon S3 कार्यक्षमता का अनुकरण करता है, लेकिन इसकी आवश्यकताएं अलग-अलग हैं, विशेष रूप से स्थानीय सेटअप के लिए जहां किसी क्षेत्र को निर्दिष्ट करना अनावश्यक है। हालाँकि, MiniIO कुछ ऑपरेशन करते समय क्षेत्र डेटा लाने का प्रयास करता है, जिससे कोटलिन में MiniIO द्वारा उपयोग किए जाने वाले HTTP क्लाइंट OkHttp के साथ हेडर समस्याएँ हो सकती हैं। यह उन लोगों के लिए विशेष रूप से चुनौतीपूर्ण है जो स्थानीय भंडारण वातावरण को प्रबंधित करने में नए हैं, क्योंकि क्षेत्र कॉन्फ़िगरेशन में बेमेल से अप्रत्याशित त्रुटियां उत्पन्न हो सकती हैं।
इससे निपटने के लिए, डेवलपर्स या तो अपने मिनिओ क्लाइंट कॉन्फ़िगरेशन के भीतर क्षेत्र को स्पष्ट रूप से सेट कर सकते हैं या HTTP हेडर को सीधे संशोधित कर सकते हैं। "us-east-1" जैसा एक निश्चित क्षेत्र सेट करके, आप अनावश्यक क्षेत्र स्वतः-पहचान से बचते हैं। वैकल्पिक रूप से, एक अधिक लचीला दृष्टिकोण एक कस्टम OkHttp इंटरसेप्टर का उपयोग करना है जो न्यूलाइन वर्णों के लिए हेडर को स्कैन करता है और उन्हें प्रभावी ढंग से रोकता है प्राधिकार त्रुटियाँ. यह हेडर संशोधन विधि विशेष रूप से तब सहायक होती है जब क्षेत्रीय लचीलेपन को बनाए रखने की आवश्यकता होती है, जैसे स्थानीय और क्लाउड वातावरण के बीच स्विच करना।
S3 और MiniIO के बीच कॉन्फ़िगरेशन में इन सूक्ष्म अंतरों को समझना और संबोधित करना महत्वपूर्ण है, खासकर परीक्षण के लिए। चाहे आप मिनिओ के साथ स्थानीय रूप से विकास कर रहे हों या उत्पादन में एस3 के साथ एकीकरण कर रहे हों, सही हेडर और क्षेत्र सेटअप का उपयोग करने से डेटा भंडारण संचालन सुचारू रूप से सुनिश्चित होता है और सामान्य नुकसान से बचा जा सकता है। कस्टम हेडर कॉन्फ़िगरेशन और निश्चित क्षेत्र विकल्प दोनों का पता लगाने के लिए समय लेने से डेवलपर्स अधिक मजबूत कोटलिन एप्लिकेशन बनाने में सक्षम होते हैं जो स्थानीय और क्लाउड स्टोरेज सेटअप के बीच सहजता से अनुकूलन कर सकते हैं। 🚀
कोटलिन मिनिओ एस3 हैडर संगतता के बारे में अक्सर पूछे जाने वाले प्रश्न
- की क्या भूमिका है MinioClient.builder() इस समाधान में?
- MinioClient.builder() विधि का उपयोग मिनियो क्लाइंट को एंडपॉइंट और क्रेडेंशियल्स सहित विशिष्ट सेटिंग्स के साथ कॉन्फ़िगर करने के लिए किया जाता है। संगतता समस्याओं को हल करने के लिए क्षेत्र जैसे विकल्पों को अनुकूलित करने के लिए यह विधि महत्वपूर्ण है।
- कैसे हुआ addInterceptor हेडर त्रुटियों को हल करने में सहायता करें?
- addInterceptor OkHttp में विधि हमें अनुरोध भेजने से पहले हेडर को संशोधित करने की अनुमति देती है, जिससे हमें न्यूलाइन जैसे अवांछित वर्णों को हटाने की अनुमति मिलती है जो मिनिओ के साथ प्राधिकरण त्रुटियों का कारण बनते हैं।
- MiniIO में एक निश्चित क्षेत्र क्यों निर्धारित करें?
- जैसे एक क्षेत्र की स्थापना "us-east-1" स्थानीय सेटअप में अनावश्यक क्षेत्र लुकअप से बचने में मदद करता है, जब मिनिओ को क्लाउड के बजाय स्थानीय रूप से तैनात किया जाता है तो त्रुटियों को रोका जाता है।
- मैं अपने मिनियो क्लाइंट कॉन्फ़िगरेशन को कैसे सत्यापित करूं?
- आप यूनिट परीक्षणों का उपयोग कर सकते हैं, जैसे कि assertDoesNotThrow और assertTrue, यह जांचने के लिए कि क्या क्लाइंट सेटअप सही है और क्या ऑब्जेक्ट अपवाद ट्रिगर किए बिना अपलोड होते हैं।
- क्या है OkHttpClient.Builder() के लिए इस्तेमाल होता है?
- OkHttpClient.Builder() आपको इंटरसेप्टर जैसी कॉन्फ़िगरेशन के साथ एक कस्टम HTTP क्लाइंट बनाने की अनुमति देता है। मिनिओ संगतता के लिए हेडर को संशोधित करते समय यह महत्वपूर्ण है।
- क्या MiniIO S3 की तरह क्षेत्र स्वतः-पहचान का समर्थन करता है?
- मिनिओ के पास क्षेत्र ऑटो-डिटेक्शन के लिए सीमित समर्थन है, जिससे S3 हेडर के साथ संगतता समस्याएं हो सकती हैं। एक निश्चित क्षेत्र का उपयोग करने से अक्सर इसका समाधान हो जाता है।
- हेडर में न्यूलाइन किस प्रकार की त्रुटि का कारण बनती है?
- हेडर में न्यूलाइन वर्णों का परिणाम हो सकता है IllegalArgumentException OkHttp में, क्योंकि यह हेडर मानों में सख्त फ़ॉर्मेटिंग लागू करता है।
- क्या मैं S3 के साथ प्रोडक्शन सेटअप में समान स्क्रिप्ट का उपयोग कर सकता हूँ?
- हाँ, लेकिन समायोजन की आवश्यकता हो सकती है। उदाहरण के लिए, उत्पादन में, आपको गतिशील क्षेत्र सेटिंग्स की आवश्यकता हो सकती है, जिसके लिए स्क्रिप्ट से निश्चित क्षेत्र मानों को हटाने की आवश्यकता होती है।
- क्यों CompletableFuture.completedFuture() इस कोड में उपयोग किया गया?
- यह विधि पहले से ही पूर्ण परिणाम लौटाकर अनावश्यक नेटवर्क कॉल से बचने में मदद करती है, जो स्थानीय सेटअप में त्वरित प्रतिक्रियाओं के लिए उपयोगी है जहां क्षेत्र की जांच आवश्यक नहीं है।
- कोटलिन के साथ काम करते समय मिनियो में हेडर समस्याओं का मुख्य कारण क्या है?
- समस्या आमतौर पर OkHttp की सख्त हेडर फ़ॉर्मेटिंग आवश्यकताओं से उत्पन्न होती है, जिसका मिनिओ अनजाने में न्यूलाइन वर्णों के साथ उल्लंघन कर सकता है।
- मैं मिनिओ में बकेट एक्सेस त्रुटियों को कैसे प्रबंधित कर सकता हूं?
- जैसे तरीकों का उपयोग करना bucketExists एक बकेट की उपलब्धता को सत्यापित कर सकता है, जिससे आपको डीबग करने और पुष्टि करने में मदद मिलेगी कि मिनिओ सही ढंग से कॉन्फ़िगर किया गया है।
कोटलिन मिनियो हेडर त्रुटियों को हल करने पर अंतिम विचार
जब हेडर फ़ॉर्मेटिंग समस्याएँ उत्पन्न होती हैं, तो स्थानीय स्तर पर मिनियो के साथ काम करना चुनौतीपूर्ण हो सकता है, विशेषकर तब जब न्यूलाइन वर्ण हमेशा स्पष्ट नहीं होते हैं। इन हेडर को साफ़ करने या एक निश्चित क्षेत्र सेट करने के लिए एक कस्टम OkHttp इंटरसेप्टर जोड़ने से विकास प्रक्रिया सरल हो जाती है और इन संगतता त्रुटियों को समाप्त कर दिया जाता है। 🛠️
ये समाधान डेवलपर्स को अनुकूलनीय और विश्वसनीय एप्लिकेशन बनाने, कोटलिन में स्थानीय और क्लाउड स्टोरेज दोनों वातावरणों के साथ निर्बाध रूप से काम करने में सक्षम बनाते हैं। यह समझने से कि कॉन्फ़िगरेशन स्तर पर मिनिओ और ओकेएचटीपी कैसे इंटरैक्ट करते हैं, समान समस्याओं से बचने में मदद मिलती है, जिससे परियोजनाएं सुचारू और सुरक्षित रूप से चलती रहती हैं। 😊
कोटलिन मिनियो हेडर समस्या समाधान के लिए संदर्भ और स्रोत
- क्षेत्र कॉन्फ़िगरेशन सहित मिनिओ और एस3 एपीआई संगतता पर विवरण: मिनियो दस्तावेज़ीकरण
- OkHttp के लिए आधिकारिक दस्तावेज़, जिसमें हेडर हैंडलिंग और इंटरसेप्टर शामिल हैं: OkHttp दस्तावेज़ीकरण
- जावा और कोटलिन के भीतर HTTP हेडर में न्यूलाइन वर्णों को संभालने पर चर्चा: स्टैक ओवरफ़्लो चर्चा
- एसिंक्रोनस प्रोग्रामिंग के लिए कोटलिन कॉरआउट्स और कंप्लीटेबलफ्यूचर: कोटलिन कोरटाइन्स गाइड