"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गोज़ स्टैंडर्ड लाइब्रेरी के साथ मजबूत एपीआई का निर्माण: एक व्यापक गाइड

गोज़ स्टैंडर्ड लाइब्रेरी के साथ मजबूत एपीआई का निर्माण: एक व्यापक गाइड

2024-12-22 को प्रकाशित
ब्राउज़ करें:453

Building Robust APIs with Go

एक गो डेवलपर के रूप में, मैंने पाया है कि मानक लाइब्रेरी मजबूत एपीआई बनाने के लिए उपकरणों की एक प्रभावशाली श्रृंखला प्रदान करती है। आइए देखें कि कुशल और स्केलेबल वेब सेवाएँ बनाने के लिए हम इन अंतर्निहित पैकेजों का लाभ कैसे उठा सकते हैं।

नेट/http पैकेज हमारे एपीआई विकास की नींव बनाता है। यह HTTP अनुरोधों और प्रतिक्रियाओं को संभालने के लिए एक सरल लेकिन शक्तिशाली इंटरफ़ेस प्रदान करता है। यहां बताया गया है कि हम एक बुनियादी सर्वर कैसे स्थापित कर सकते हैं:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handleRoot)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleRoot(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to our API!")
}

यह एक सर्वर सेट करता है जो पोर्ट 8080 पर सुनता है और रूट पथ पर अनुरोधों का जवाब देता है। लेकिन आइए उपयोगकर्ताओं के लिए एक रेस्टफुल एंडपॉइंट जोड़कर इसे और अधिक दिलचस्प बनाएं:

func main() {
    http.HandleFunc("/api/users", handleUsers)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleUsers(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case "GET":
        getUsers(w, r)
    case "POST":
        createUser(w, r)
    default:
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
    }
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    // Fetch users from database and return them
}

func createUser(w http.ResponseWriter, r *http.Request) {
    // Create a new user in the database
}

अब हमारे पास एक अधिक संरचित एपीआई है जो एक ही समापन बिंदु के लिए विभिन्न HTTP तरीकों को संभाल सकती है। लेकिन हम JSON डेटा के साथ कैसे काम करते हैं? एन्कोडिंग/जेसन पैकेज दर्ज करें।

एन्कोडिंग/जेसन पैकेज हमें आसानी से गो स्ट्रक्चर्स को जेएसओएन में मार्शल करने और जेएसओएन को गो स्ट्रक्चर्स में अनमर्शल करने की अनुमति देता है। यहां बताया गया है कि हम इसे अपने एपीआई में कैसे उपयोग कर सकते हैं:

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    users := []User{
        {ID: 1, Name: "Alice"},
        {ID: 2, Name: "Bob"},
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(users)
}

func createUser(w http.ResponseWriter, r *http.Request) {
    var newUser User
    err := json.NewDecoder(r.Body).Decode(&newUser)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // Save newUser to database
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(newUser)
}

यह कोड दर्शाता है कि JSON प्रतिक्रियाएँ कैसे भेजें और JSON अनुरोधों को कैसे पार्स करें। Json.NewEncoder(w).Encode(users) लाइन हमारे उपयोगकर्ताओं के स्लाइस को JSON में क्रमबद्ध करती है और इसे प्रतिक्रिया में लिखती है। दूसरी ओर, json.NewDecoder(r.Body).Decode(&newUser) अनुरोध निकाय से JSON पढ़ता है और हमारी newUser संरचना को पॉप्युलेट करता है।

जैसे-जैसे हमारी एपीआई बढ़ती है, हम लॉगिंग या प्रमाणीकरण जैसे कार्यों के लिए कुछ मिडलवेयर जोड़ना चाहेंगे। गो का http पैकेज इसे सरल बनाता है:

func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        log.Printf("Request: %s %s", r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    }
}

func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if token != "secret-token" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    }
}

func main() {
    http.HandleFunc("/api/users", authMiddleware(loggingMiddleware(handleUsers)))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

यहां, हमने दो मिडलवेयर फ़ंक्शन बनाए हैं: एक लॉगिंग के लिए और एक साधारण टोकन-आधारित प्रमाणीकरण के लिए। हम अपने अनुरोधों पर प्रसंस्करण की कई परतें लागू करने के लिए इन मिडलवेयर फ़ंक्शंस को श्रृंखलाबद्ध कर सकते हैं।

एपीआई विकास का एक अन्य महत्वपूर्ण पहलू उचित त्रुटि प्रबंधन है। गो का त्रुटि प्रबंधन दर्शन स्पष्ट त्रुटि जाँच को प्रोत्साहित करता है, जिससे कोड अधिक मजबूत होता है। आइए बेहतर त्रुटि प्रबंधन के साथ अपने createUser फ़ंक्शन को बढ़ाएं:

func createUser(w http.ResponseWriter, r *http.Request) {
    var newUser User
    err := json.NewDecoder(r.Body).Decode(&newUser)
    if err != nil {
        http.Error(w, "Invalid request payload", http.StatusBadRequest)
        return
    }

    if newUser.Name == "" {
        http.Error(w, "Name is required", http.StatusBadRequest)
        return
    }

    // Simulate database error
    if newUser.ID == 999 {
        http.Error(w, "Database error", http.StatusInternalServerError)
        return
    }

    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(newUser)
}

यह संस्करण विभिन्न त्रुटि स्थितियों की जांच करता है और उचित HTTP स्थिति कोड और त्रुटि संदेश लौटाता है।

जैसे-जैसे हमारी एपीआई बढ़ती है, हमें अधिक जटिल परिदृश्यों को संभालने की आवश्यकता हो सकती है, जैसे लंबे समय से चल रहे अनुरोध या संचालन रद्द करने की आवश्यकता। यहीं पर संदर्भ पैकेज काम आता है। यह हमें अनुरोध-दायरे वाले मूल्यों को ले जाने, टाइमआउट को संभालने और रद्दीकरण को प्रबंधित करने की अनुमति देता है।

यहां बताया गया है कि हम अपने एपीआई में संदर्भ का उपयोग कैसे कर सकते हैं:

func handleLongRunningTask(w http.ResponseWriter, r *http.Request) {
    ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
    defer cancel()

    result := make(chan string, 1)
    go func() {
        // Simulate a long-running task
        time.Sleep(6 * time.Second)
        result 



इस उदाहरण में, हमने अनुरोध के लिए 5 सेकंड का टाइमआउट निर्धारित किया है। यदि लंबे समय से चल रहा कार्य इस समय के भीतर पूरा नहीं होता है, तो हम क्लाइंट को एक टाइमआउट त्रुटि लौटाते हैं।

प्रदर्शन किसी भी एपीआई के लिए एक महत्वपूर्ण चिंता का विषय है। गो की मानक लाइब्रेरी हमारे एपीआई के प्रदर्शन को अनुकूलित करने में मदद करने के लिए कई उपकरण प्रदान करती है। उदाहरण के लिए, हम वस्तुओं का पुन: उपयोग करने और कचरा संग्रहकर्ता पर भार कम करने के लिए सिंक.पूल का उपयोग कर सकते हैं:

var bufferPool = sync.Pool{
    New: func() interface{} {
        return new(bytes.Buffer)
    },
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
    buf := bufferPool.Get().(*bytes.Buffer)
    defer bufferPool.Put(buf)
    buf.Reset()

    // Use buf for some operation
    json.NewEncoder(buf).Encode(someData)
    w.Write(buf.Bytes())
}

यह कोड बाइट बफ़र्स का पुन: उपयोग करता है, जो उच्च-ट्रैफ़िक परिदृश्यों में मेमोरी आवंटन को काफी कम कर सकता है।

एक अन्य प्रदर्शन विचार कुशल रूटिंग है। जबकि मानक http.ServeMux सरल एपीआई के लिए पर्याप्त है, अधिक जटिल रूटिंग आवश्यकताओं के लिए, हम एक कस्टम राउटर लागू करना चाह सकते हैं:

type router struct {
    handlers map[string]http.HandlerFunc
}

func newRouter() *router {
    return &router{
        handlers: make(map[string]http.HandlerFunc),
    }
}

func (r *router) HandleFunc(pattern string, handler http.HandlerFunc) {
    r.handlers[pattern] = handler
}

func (r *router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    for pattern, handler := range r.handlers {
        if matched, _ := path.Match(pattern, req.URL.Path); matched {
            handler(w, req)
            return
        }
    }
    http.NotFound(w, req)
}

func main() {
    r := newRouter()
    r.HandleFunc("/api/users", handleUsers)
    r.HandleFunc("/api/posts/*", handlePosts)
    log.Fatal(http.ListenAndServe(":8080", r))
}

यह कस्टम राउटर वाइल्डकार्ड पैटर्न सहित अधिक लचीले पथ मिलान की अनुमति देता है।

जैसे-जैसे हमारी एपीआई बढ़ती है, हमें समवर्ती अनुरोधों को कुशलतापूर्वक संभालने की आवश्यकता हो सकती है। गो के गोरआउट्स और चैनल इसके लिए बिल्कुल उपयुक्त हैं:

func handleConcurrentRequests(w http.ResponseWriter, r *http.Request) {
    results := make(chan string, 3)

    go func() { results 



यह कोड एक साथ तीन सेवाओं से डेटा प्राप्त करता है, परिणामों को एक ही प्रतिक्रिया में जोड़ता है।

एपीआई विकास में सुरक्षा सर्वोपरि है। गो का क्रिप्टो पैकेज हैशिंग, एन्क्रिप्शन और बहुत कुछ के लिए उपकरण प्रदान करता है। यहां एक उदाहरण दिया गया है कि हम पासवर्ड कैसे हैश कर सकते हैं:

import "golang.org/x/crypto/bcrypt"

func hashPassword(password string) (string, error) {
    bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
    return string(bytes), err
}

func checkPasswordHash(password, hash string) bool {
    err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
    return err == nil
}

इन फ़ंक्शन का उपयोग उपयोगकर्ता पासवर्ड को सुरक्षित रूप से संग्रहीत और सत्यापित करने के लिए किया जा सकता है।

परीक्षण एपीआई विकास का एक अभिन्न अंग है, और गो का परीक्षण पैकेज परीक्षण लिखना और चलाना आसान बनाता है। यहां एक उदाहरण दिया गया है कि हम अपने हैंडलयूजर्स फ़ंक्शन का परीक्षण कैसे कर सकते हैं:

func TestHandleUsers(t *testing.T) {
    req, err := http.NewRequest("GET", "/api/users", nil)
    if err != nil {
        t.Fatal(err)
    }

    rr := httptest.NewRecorder()
    handler := http.HandlerFunc(handleUsers)

    handler.ServeHTTP(rr, req)

    if status := rr.Code; status != http.StatusOK {
        t.Errorf("handler returned wrong status code: got %v want %v",
            status, http.StatusOK)
    }

    expected := `[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]`
    if rr.Body.String() != expected {
        t.Errorf("handler returned unexpected body: got %v want %v",
            rr.Body.String(), expected)
    }
}

यह परीक्षण एक अनुरोध बनाता है, इसे हमारे हैंडलर को भेजता है, और प्रतिक्रिया स्थिति और मुख्य भाग की जांच करता है।

निष्कर्ष रूप में, गो की मानक लाइब्रेरी कुशल और स्केलेबल एपीआई के निर्माण के लिए उपकरणों का एक मजबूत सेट प्रदान करती है। HTTP अनुरोधों को संभालने और JSON के साथ काम करने से लेकर समवर्ती प्रबंधन और सुरक्षा उपायों को लागू करने तक, मानक लाइब्रेरी ने हमें कवर किया है। इन अंतर्निहित पैकेजों का प्रभावी ढंग से लाभ उठाकर, हम बाहरी ढांचे पर भरोसा किए बिना शक्तिशाली एपीआई बना सकते हैं। यह न केवल हमारे निर्भरता प्रबंधन को सरल बनाता है बल्कि यह भी सुनिश्चित करता है कि हमारा कोड बढ़ने के साथ-साथ क्रियाशील और रखरखाव योग्य बना रहे। जैसे-जैसे हम गो की मानक लाइब्रेरी की गहराई का पता लगाना जारी रखेंगे, हम अपनी एपीआई विकास प्रक्रिया को बढ़ाने के और भी तरीके खोजेंगे।


हमारी रचनाएँ

हमारी रचनाएँ अवश्य देखें:

इन्वेस्टर सेंट्रल | निवेशक सेंट्रल स्पैनिश | निवेशक सेंट्रल जर्मन | स्मार्ट लिविंग | युग और गूँज | पहेली रहस्य | हिंदुत्व | एलिट देव | जेएस स्कूल


हम मीडियम पर हैं

टेक कोआला इनसाइट्स | युग और गूँज विश्व | निवेशक केंद्रीय माध्यम | पहेली रहस्य माध्यम | विज्ञान और युग माध्यम | आधुनिक हिंदुत्व

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/aaravjoshi/building-robust-apis-with-gos-standard-library-a-comprehenive-guide-3036?1 यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग@163 से संपर्क करें इसे हटाने के लिए .com
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3