HTTP API एरर हैंडलिंग की कठिनाइयाँ और RFC7807
(gosuda.org)HTTP API विकसित करते समय एरर हैंडलिंग अक्सर एक झंझटभरा हिस्सा होती है। जैसे-जैसे API की संख्या बढ़ती है और internal logic जटिल होती जाती है, तीन पहलुओं में कठिनाइयाँ सामने आती हैं.
- उचित एरर कोड लौटाना: कम अनुभव वाले डेवलपर के लिए जटिल logic में लगातार एकसमान HTTP status code का उपयोग करना कठिन होता है।
- बहुत अधिक result log लिखना: एरर होने पर हर संभावित exit point पर log रिकॉर्ड करना code की मात्रा बढ़ाता है और management को जटिल बनाता है।
- स्पष्ट एरर संदेश भेजना: client को केवल एरर संदेश भेज देने से एरर को स्पष्ट रूप से समझना और संभालना मुश्किल होता है।
उचित एरर कोड लौटाने में सुधार
एरर कोड के उपयोग में consistency की समस्या हल करने के लिए StatusCode और Message को शामिल करने वाला HttpError interface या struct लागू करने का सुझाव दिया गया है।
- समाधान:
HttpErrortype परिभाषित करना: HTTP status code और message को encapsulate करना।- helper function प्रदान करना:
httperror.BadRequest("wrong format")की तरह विशेष एरर कोड लौटाने वाले helper function का उपयोग करके एरर object आसानी से बनाना।
- फायदे:
- IDE के auto-completion feature का उपयोग करके सुविधाजनक और स्थिर तरीके से एरर code और message दर्ज करना।
- हाथ से numeric code डालने की तुलना में गलती की संभावना कम होना।
- पहले से तैयार design document को बार-बार देखने की झंझट कम होना।
log लेखन का केंद्रीकरण
दोहराव वाले log लेखन को कम करने और एरर हैंडलिंग logic को एक जगह प्रबंधित करने के लिए HTTP handler को wrap करने की विधि प्रस्तुत की गई है।
- समाधान:
- custom router(
chiwrap.Router) लागू करना:chi.Routerजैसे मौजूदा router को अंदर शामिल करके उसमें एरर हैंडलिंग logic जोड़ना। - handler wrapping: custom router के
Getजैसे methodHandlerFuncको लेकर उसे अंदर चलाते हैं, और एरर होने पर उसे केंद्रीय processing logic तक पहुँचाते हैं। - एरर callback function:
NewRouterबनाते समयerrCallbackfunction लेना, ताकि एरर होने पर वही callback कॉल हो और वहीं से केंद्रीय log लेखन या अतिरिक्त processing की जा सके।
- custom router(
- फायदे:
- API logic में एरर होने पर अपने-आप उचित एरर code और message response में लौटते हैं।
- service के अनुसार उपयुक्त log लिखने के लिए callback function register किया जा सकता है, जिससे log management आसान होता है।
- code duplication कम होती है और maintainability बेहतर होती है।
स्पष्ट एरर संदेश भेजना (RFC7807 का उपयोग)
client एरर को अधिक स्पष्ट रूप से समझ सके और उसे संभाल सके, इसके लिए RFC7807 standard का उपयोग कर structured एरर संदेश भेजने का तरीका सुझाया गया है।
- RFC7807 के मुख्य तत्व:
type: एरर प्रकार की पहचान करने वाला URI (उदाहरण:https://example.com/errors/validation)।title: एरर के लिए छोटा एक-पंक्ति विवरण।status: HTTP status code के समान।detail: इंसानों द्वारा पढ़ा जा सकने वाला विस्तृत एरर विवरण।instance: वह विशिष्ट URI जहाँ एरर हुआ (उदाहरण:/api/users/abc)।extensions: अतिरिक्त जानकारी रखने वाला JSON object (उदाहरण:invalid_field,expected_format)।
- कार्यान्वयन:
-
RFC7807Errorstruct बनाना और उसमें मुख्य तत्व शामिल करना। -
method chaining pattern (
WithType(),WithInstance(),WithExtension()) के जरिए structured एरर object आसानी से बनाना। -
ToHttpError()method के जरिएRFC7807ErrorकोHttpErrorमें बदलना, ताकि इसे centralized router के साथ जोड़ा जा सके। -
client एरर के प्रकार, कारण और होने की जगह को स्पष्ट रूप से समझ सकता है।
-
API response की consistency और उपयोगिता बढ़ती है, जिससे client development की efficiency बेहतर होती है।
-
5 टिप्पणियां
अच्छा लेख है, धन्यवाद
अच्छा लेख, धन्यवाद!
जानकारी के लिए, Spring में
org.springframework.http.ProblemDetailके लिए implementationspring-webलाइब्रेरी में मौजूद है!अच्छी परिचयात्मक पोस्ट के लिए धन्यवाद!
देखा तो पता चला कि इसे RFC 9457 से बदल दिया गया है।
https://datatracker.ietf.org/doc/html/rfc9457
(पुराना 7807 दस्तावेज़: https://datatracker.ietf.org/doc/html/rfc7807)
RFC 7807 और RFC 9457 के बीच मुख्य अंतर
errorsarray का उपयोग करके संबंधित errors को group किया जाता हैpointerfield का आधिकारिक support हैजुलाई 2023 के बाद शुरू होने वाले नए projects में RFC 9457 लागू करने की सिफारिश की जाती है
typeफ़ील्ड को dereference किया जा सकने वाले URI के रूप में सेट करना सुझाया गया लगता है।आंतरिक सेवाओं में इसे Swagger-ui दस्तावेज़ लिंक से बदलना भी ठीक लग रहा है।