अपने ऐप में adult photo filters कैसे जोड़ें
प्रोडक्ट में adult photo filter जोड़ना देखने में इमेज की समस्या लगती है, पर निकलती है plumbing की समस्या। मॉडल का काम एक ही API कॉल में खरीदा जा चुका है। स्प्रिंट खाता है उसके आसपास का सब कुछ: अपलोड जो टाइमआउट हो जाते हैं, jobs जो तब पूरे होते हैं जब कोई सुन ही नहीं रहा, retries जो चुपचाप दो बार बिल कर देते हैं, और सपोर्ट क्यू में यह सवाल कि नतीजा गया कहाँ। यह गाइड पूरे इंटीग्रेशन को शुरू से आख़िर तक ले जाती है और उन जगहों पर उँगली रखती है जहाँ टीमें बार-बार समय गँवाती हैं।
इंटीग्रेशन असल में किन हिस्सों से बना है
Photo transformation API स्वभाव से asynchronous होती है। जनरेशन इतना समय लेती है कि उसके लिए HTTP कनेक्शन खुला रखना ख़राब विचार है: मोबाइल नेटवर्क गिरते हैं, load balancer निष्क्रिय कनेक्शन काट देते हैं, और आपके अपने request timeouts आपसे ही लड़ने लगते हैं। इसलिए ढाँचा हमेशा एक जैसा रहता है — आप काम submit करते हैं, एक identifier पाते हैं, और नतीजा बाद में उठाते हैं।
- फ़ोटो और मनचाहा preset भेजें, बदले में job identifier पाएँ।
- job को ट्रैक करें — या तो polling से, या events subscribe करके।
- job के success बताने पर तैयार इमेज fetch करें।
- failure और retry के रास्ते संभालें — असली काम का बड़ा हिस्सा यहीं है।
पहला चरण: job submit करना
Submission एक multipart request है जिसमें इमेज, preset identifier और यह पुष्टि जाती है कि फ़ोटो प्रोसेस करने के अधिकार और consent आपके पास हैं। साथ में एक idempotency key भेजें। यह अकेला header साफ़-सुथरे इंटीग्रेशन और सपोर्ट की सिरदर्दी के बीच का फ़र्क़ है, और जोड़ने में कुछ ख़र्च नहीं होता।
curl -X POST https://api.example/api/v1/jobs \ -H "X-API-Key: $API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -F image=@photo.jpg \ -F feature=bikini \ -F consent=confirmed
Response में job identifier और उसका शुरुआती status आता है। उस identifier को अपने user या session रिकॉर्ड के साथ तुरंत persist करें — बाक़ी कुछ भी करने से पहले। अगर अगले ही सेकंड आपका process मर गया, तो वही एक row है जो इस काम को दोबारा खोजने देती है।
दूसरा चरण: प्रोग्रेस ट्रैक करना
job को फ़ॉलो करने के दो तरीक़े हैं, और परिपक्व इंटीग्रेशन दोनों इस्तेमाल करते हैं। WebSocket कनेक्शन लाइव status बदलाव और प्रोग्रेस देता है — यूज़र इंटरफ़ेस में प्रोग्रेस बार चलाने के लिए यही चाहिए। job endpoint की polling वह fallback है जो सिस्टम को सुखद नहीं, बल्कि सही बनाती है: sockets गिरते हैं, फ़ोन सो जाते हैं, और हर कुछ सेकंड में एक poll लगभग मुफ़्त है।
WebSocket को optimisation मानें और polling को source of truth। जो टीमें इसे उलट देती हैं उनके पास ऐसे jobs बचते हैं जो सर्वर पर बिल्कुल ठीक पूरे हो गए पर क्लाइंट में हमेशा के लिए अटके दिखते हैं — क्योंकि जो एक इवेंट मायने रखता था वह तब आया जब socket दोबारा जुड़ रहा था।
तीसरा चरण: नतीजा उठाना
जब job success बताता है तो उसके साथ outputs की सूची आती है। हर output उसी API key से लिया जाता है जिसने job बनाया था, इसलिए नतीजे न कभी सार्वजनिक रूप से पहुँच-योग्य होते हैं और न URL से अंदाज़े में मिल सकते हैं। अगर आपके प्रोडक्ट को इमेज बाद में दिखानी है तो मिलते ही उसे अपने storage में डाउनलोड कर लें — image API एक processing सेवा है, फ़ोटो लाइब्रेरी नहीं, और नतीजे अनिश्चित काल तक नहीं रखे जाते।
चौथा चरण: failures, retries और दोहरे बिलिंग का जाल
दिलचस्प failure वह नहीं जिसमें API error लौटाती है। दिलचस्प वह अस्पष्ट वाली है: आपकी request बाहर गई, नेटवर्क गिरा, और आपको पता ही नहीं कि job बना या नहीं। बिना सोचे retry किया तो आपने दो बार पैसे दिए और एक यूज़र ऐक्शन के दो नतीजे बना दिए।
यही समस्या idempotency key हल करती है। उसी key के साथ request दोहराइए और आपको नया job नहीं, मूल job वापस मिलता है — चाहे retry कितनी भी बार चले। Key तब बनाइए जब यूज़र ऐक्शन होता है, उसे job रिकॉर्ड के साथ स्टोर कीजिए, और उसी ऐक्शन के हर retry में वही key दोबारा इस्तेमाल कीजिए — हर प्रयास पर नई key नहीं, वरना पूरा तंत्र बेकार हो जाता है।
इंटीग्रेशन आम तौर पर कहाँ अटकते हैं
- अपलोड की जाँच सिर्फ़ क्लाइंट पर करना। API कॉल ख़र्च करने से पहले फ़ाइल को सर्वर पर, extension से नहीं बल्कि content से जाँचें।
- पूरा फ़्लो synchronous बनाना, और फिर पता चलना कि जनरेशन ख़त्म होने से बहुत पहले मोबाइल क्लाइंट कनेक्शन गिरा देते हैं।
- WebSocket को प्रोग्रेस का इकलौता चैनल मानना, बिना किसी polling fallback के।
- स्थानीय रूप से कुछ न रखना, जिससे restart पर आपके users और चल रहे jobs का मैपिंग खो जाता है।
- यह भूल जाना कि नतीजे अस्थायी हैं, और API से स्थायी storage जैसा व्यवहार अपेक्षित रखना।
काम का समझदार क्रम
कोई भी ऐप्लिकेशन कोड लिखने से पहले एक फ़ोटो को curl से पूरे रास्ते ले जाइए — submit, poll, download। फिर वही चार कॉल persistence के साथ अपने backend में जोड़िए। WebSocket सबसे आख़िर में जोड़िए, केवल एक ऐसे सिस्टम के ऊपर प्रोग्रेस-बार सुधार के तौर पर जो उसके बिना भी काम करता है। इस क्रम में इंटीग्रेशन एक दिन का काम है; उल्टे क्रम में यह दो हफ़्ते की डिबगिंग है।
अक्सर पूछे जाने वाले सवाल
एक request में कितना समय लगता है?
जनरेशन asynchronous है और बैकग्राउंड में पूरी होती है। इंटरफ़ेस को blocking कॉल के बजाय progress state के इर्द-गिर्द डिज़ाइन करें, फिर सटीक अवधि आपकी आर्किटेक्चर के लिए मायने नहीं रखती।
API इस्तेमाल करने के लिए WebSocket ज़रूरी है?
नहीं। सब कुछ अकेले REST पर चलता है। WebSocket इसलिए है कि प्रोग्रेस लाइव महसूस हो; job endpoint की polling वही जानकारी देती है।
अगर मैं वही request दो बार भेज दूँ तो क्या होगा?
उसी idempotency key के साथ आपको मूल job वापस मिलता है, और न कोई दूसरी generation बनती है, न उसका बिल बनता है।
uncloth.app पर बनाएँ
एक REST endpoint, ग्यारह presets, नतीजे सीधे आपके backend को। बताइए आप क्या बना रहे हैं, हम access की जानकारी भेज देंगे।
एक्सेस का अनुरोध करें