𝗚𝗼 𝗛𝗧𝗧𝗣 𝗠𝗶𝗱𝗱𝗹𝗲𝘄𝗮𝗿𝗲 𝗘𝘅𝗽𝗹𝗮𝗶𝗻𝗲𝗱

प्रत्येक हँडलरमध्ये (handler) तोच कोड कॉपी आणि पेस्ट करणे थांबवा.

जर तुम्हाला ऑथेंटिकेशन (authentication) तपासायचे असेल, विनंतीचा कालावधी (request duration) लॉग करायचा असेल किंवा प्रत्येक विनंतीला एक युनिक ID जोडायचा असेल, तर ती लॉजिक तुमच्या बिझनेस हँडलर्समध्ये (business handlers) लिहू नका. जर तुमच्याकडे २० हँडलर्स असतील, तर ऑथ लॉजिक बदलल्यावर तुम्हाला २० ठिकाणी बदल करावे लागतील. हे मेंटेनन्ससाठी एक nightmare ठरू शकते.

Middleware या समस्येवर उपाय देते. तुम्ही लॉजिक एकदाच लिहिता. तुम्ही तुमचे हँडलर्स 'wrap' करता. त्यानंतर तुम्हाला त्यात पुन्हा बदल करण्याची गरज पडत नाही.

𝗪𝗵𝗮𝘁 𝗶𝘀 𝗠𝗶𝗱𝗱𝗹𝗲𝘄𝗮𝗿𝗲?

Go मध्ये, middleware हे असे एक function आहे जे: • http.Handler स्वीकारते. • एक नवीन http.Handler रिटर्न करते. • मूळ हँडलर चालण्यापूर्वी किंवा त्यानंतर काही कृती करते.

याचा विचार एका कांद्यासारखा करा. प्रत्येक थर (layer) पुढच्या थराला वेढतो. विनंती (request) आत येताना प्रत्येक थरातून जाते. प्रतिसाद (response) बाहेर जाताना प्रत्येक थरातून जातो.

𝗪𝗵𝗮𝘁 𝘆𝗼𝘂 𝘄𝗶𝗹𝗹 𝗹𝗲𝗮𝗿𝗻:

• http.Handler interface चा पाया. • शून्यापासून कस्टम middleware कसे तयार करायचे. • अनेक लेयर्सना एकत्र साखळीप्रमाणे (chain) कसे जोडायचे. • context वापरून साखळीतून डेटा कसा पास करायचा. • ऑर्डरिंग आणि panic recovery सारख्या प्रगत टिप्स.

𝗞𝗲𝘆 𝗧𝗮𝗸𝗲𝗮𝘄𝗮𝘆𝘀:

• क्रम महत्त्वाचा आहे. जर एका middleware ने context मध्ये एखादी व्हॅल्यू सेट केली असेल, तर साखळीतील पुढच्या middleware ने ती वाचणे आवश्यक आहे. जर तुम्ही त्यांचा क्रम बदलला, तर डेटा रिकामी (empty) मिळेल.

• लवकर बाहेर पडताना (early exit) नेहमी return वापरा. जर तुम्हाला त्रुटी (error) आढळली आणि तुम्ही http.Error पाठवला, तर लगेच return कॉल करा. जर तुम्ही त्रुटी पाठवल्यानंतर next.ServeHTTP कॉल केला, तर तुमचा सर्व्हर panic होईल.

• context keys साठी कस्टम टाइप्स वापरा. की (keys) साठी साध्या स्ट्रिंग्सचा (plain strings) वापर करू नका. यामुळे वेगवेगळ्या पॅकेजेसनी एकमेकांचा डेटा ओव्हरराईट (overwrite) करणे टाळता येते.

• डेटा कॅप्चर करण्यासाठी wrapper वापरा. कारण standard http.ResponseWriter तुम्हाला स्टेटस कोड लिहून झाल्यावर तो वाचू देत नाही, त्यामुळे तुम्हाला तो इंटरसेप्ट (intercept) करण्यासाठी आणि तुमच्या लॉग्ससाठी सेव्ह करण्यासाठी एक कस्टम struct तयार करावा लागेल.

या पॅटर्नमध्ये प्रभुत्व मिळवून तुमच्या Go HTTP सर्व्हरसाठी एक भक्कम पाया तयार करा.

Source: https://dev.to/ferztyle/go-http-middleware-explained-what-it-is-how-it-works-and-how-to-build-your-own-1ma7