Go HTTP Middleware ਦੀ ਵਿਆਖਿਆ
ਹਰ ਇੱਕ handler ਵਿੱਚ ਇੱਕੋ ਜਿਹਾ ਕੋਡ ਕਾਪੀ ਅਤੇ ਪੇਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ।
ਜੇਕਰ ਤੁਹਾਨੂੰ authentication ਚੈੱਕ ਕਰਨ ਦੀ, request duration ਨੂੰ log ਕਰਨ ਦੀ, ਜਾਂ ਹਰ request ਵਿੱਚ ਇੱਕ unique ID ਜੋੜਨ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਉਸ logic ਨੂੰ ਆਪਣੇ business handlers ਦੇ ਅੰਦਰ ਨਾ ਲਿਖੋ। ਜੇਕਰ ਤੁਹਾਡੇ ਕੋਲ 20 handlers ਹਨ, ਤਾਂ ਤੁਹਾਡੇ auth logic ਵਿੱਚ ਬਦਲਾਅ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ 20 ਥਾਵਾਂ 'ਤੇ ਅਪਡੇਟ ਕਰਨਾ ਪਵੇਗਾ। ਇਹ maintenance ਦੀ ਇੱਕ ਵੱਡੀ ਮੁਸ਼ਕਲ (nightmare) ਹੈ।
Middleware ਇਸ ਦਾ ਹੱਲ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ logic ਨੂੰ ਸਿਰਫ਼ ਇੱਕ ਵਾਰ ਲਿਖਦੇ ਹੋ। ਤੁਸੀਂ ਆਪਣੇ handlers ਨੂੰ wrap ਕਰਦੇ ਹੋ। ਫਿਰ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਦੁਬਾਰਾ ਛੂਹਣ ਦੀ ਲੋੜ ਨਹੀਂ ਪੈਂਦੀ।
Middleware ਕੀ ਹੈ?
Go ਵਿੱਚ, middleware ਇੱਕ ਅਜਿਹਾ function ਹੈ ਜੋ: • ਇੱਕ http.Handler ਨੂੰ ਸਵੀਕਾਰ ਕਰਦਾ ਹੈ। • ਇੱਕ ਨਵਾਂ http.Handler ਰਿਟਰਨ ਕਰਦਾ ਹੈ। • ਅਸਲ handler ਚੱਲਣ ਤੋਂ ਪਹਿਲਾਂ ਜਾਂ ਬਾਅਦ ਵਿੱਚ ਕਾਰਵਾਈਆਂ (actions) ਕਰਦਾ ਹੈ।
ਇਸ ਨੂੰ ਇੱਕ ਪਿਆਜ਼ ਵਾਂਗ ਸਮਝੋ। ਹਰ ਪਰਤ (layer) ਅਗਲੀ ਪਰਤ ਨੂੰ ਲਪੇਟਦੀ ਹੈ। request ਅੰਦਰ ਆਉਂਦੇ ਸਮੇਂ ਹਰ ਪਰਤ ਵਿੱਚੋਂ ਲੰਘਦੀ ਹੈ। response ਬਾਹਰ ਜਾਂਦੇ ਸਮੇਂ ਹਰ ਪਰਤ ਵਿੱਚੋਂ ਲੰਘਦਾ ਹੈ।
ਤੁਸੀਂ ਕੀ ਸਿੱਖੋਗੇ:
• http.Handler interface ਦੀ ਬੁਨਿਆਦ। • ਜ਼ੀਰੋ ਤੋਂ custom middleware ਕਿਵੇਂ ਬਣਾਉਣਾ ਹੈ। • ਕਈ layers ਨੂੰ ਇਕੱਠਾ ਕਿਵੇਂ chain ਕਰਨਾ ਹੈ। • context ਦੀ ਵਰਤੋਂ ਕਰਕੇ chain ਰਾਹੀਂ data ਕਿਵੇਂ ਭੇਜਣਾ ਹੈ। • ordering ਅਤੇ panic recovery ਵਰਗੇ advanced ਟਿਪਸ।
ਮੁੱਖ ਗੱਲਾਂ (Key Takeaways):
• Order ਮਹੱਤਵਪੂਰਨ ਹੈ। ਜੇਕਰ ਇੱਕ middleware context ਵਿੱਚ ਕੋਈ value ਸੈੱਟ ਕਰਦਾ ਹੈ, ਤਾਂ chain ਵਿੱਚ ਅਗਲਾ middleware ਹੀ ਉਸ ਨੂੰ ਪੜ੍ਹਨ ਵਾਲਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਅਦਲ-ਬਦਲ ਦਿੰਦੇ ਹੋ, ਤਾਂ data ਖਾਲੀ ਹੋਵੇਗਾ।
• ਜਲਦੀ ਬਾਹਰ ਨਿਕਲਣ (early exit) ਤੋਂ ਬਾਅਦ ਹਮੇਸ਼ਾ return ਕਰੋ। ਜੇਕਰ ਤੁਹਾਨੂੰ ਕੋਈ error ਮਿਲਦਾ ਹੈ ਅਤੇ ਤੁਸੀਂ http.Error ਭੇਜਦੇ ਹੋ, ਤਾਂ ਤੁਰੰਤ return ਕਾਲ ਕਰੋ। ਜੇਕਰ ਤੁਸੀਂ error ਭੇਜਣ ਤੋਂ ਬਾਅਦ next.ServeHTTP ਕਾਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ server panic ਕਰ ਜਾਵੇਗਾ।
• context keys ਲਈ custom types ਦੀ ਵਰਤੋਂ ਕਰੋ। Keys ਲਈ plain strings ਦੀ ਵਰਤੋਂ ਨਾ ਕਰੋ। ਇਹ ਵੱਖ-ਵੱਖ packages ਨੂੰ ਇੱਕ ਦੂਜੇ ਦੇ data ਨੂੰ overwrite ਕਰਨ ਤੋਂ ਰੋਕਦਾ ਹੈ।
• data ਕੈਪਚਰ ਕਰਨ ਲਈ ਇੱਕ wrapper ਦੀ ਵਰਤੋਂ ਕਰੋ। ਕਿਉਂਕਿ standard http.ResponseWriter ਤੁਹਾਨੂੰ status code ਲਿਖਣ ਤੋਂ ਬਾਅਦ ਪੜ੍ਹਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੰਦਾ, ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣੇ logs ਲਈ ਇਸ ਨੂੰ intercept ਕਰਨ ਅਤੇ ਸੇਵ ਕਰਨ ਲਈ ਇੱਕ custom struct ਬਣਾਉਣਾ ਪਵੇਗਾ।
ਇਹਨਾਂ patterns ਵਿੱਚ ਮਾਹਰ ਬਣ ਕੇ ਆਪਣੇ Go HTTP servers ਲਈ ਇੱਕ ਮਜ਼ਬੂਤ ਬੁਨਿਆਦ ਬਣਾਓ।
