Go में API: REST, GraphQL और gRPC — 2025 में क्या चुनें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Go API के लिए आदर्श भाषा क्यों है?

\n\n

जब उच्च-लोड वाले API बनाने की बात आती है, तो Go (Golang) शीर्ष स्थान पर मजबूती से बना हुआ है। इसकी कंपाइल की गई प्रकृति, गोरूटीन के माध्यम से अंतर्निहित समवर्ती समर्थन और न्यूनतम सिंटैक्स आपको तेज़ और विश्वसनीय माइक्रोसर्विसेज लिखने की अनुमति देते हैं। लेकिन आपके अगले प्रोजेक्ट के लिए कौन सा प्रोटोकॉल चुनें: क्लासिक REST, लचीला GraphQL या अति-तेज़ gRPC?

\n\n

इस लेख में, हम केवल अंतरों को सूचीबद्ध नहीं करेंगे — हम प्रत्येक दृष्टिकोण के लिए Go में वास्तविक कोड लिखेंगे, बेंचमार्क का विश्लेषण करेंगे और चयन के लिए स्पष्ट मानदंड देंगे। चलिए शुरू करते हैं!

\n\n

Go पर REST API: सिद्ध क्लासिक

\n\n

REST (Representational State Transfer) सार्वजनिक API के लिए डी-फैक्टो मानक बना हुआ है। Go उत्कृष्ट मानक लाइब्रेरी net/http प्रदान करता है, साथ ही gin और echo जैसे लोकप्रिय फ्रेमवर्क भी प्रदान करता है।

\n\n

शुद्ध Go पर REST सर्वर का उदाहरण

\n\n

आइए कार्यों के प्रबंधन के लिए एक सरल CRUD सेवा से शुरू करें। बिना किसी तीसरे पक्ष की निर्भरता के Go पर न्यूनतम REST API इस प्रकार दिखता है:

\n\n
package main\n\nimport (\n    "encoding/json"\n    "log"\n    "net/http"\n    "sync"\n)\n\ntype Task struct {\n    ID   int    `json:"id"`\n    Name string `json:"name"`\n}\n\nvar (\n    tasks   = []Task{{ID: 1, Name: "Go सीखें"}}\n    mu      sync.Mutex\n    nextID  = 2\n)\n\nfunc getTasks(w http.ResponseWriter, r *http.Request) {\n    mu.Lock()\n    defer mu.Unlock()\n    w.Header().Set("Content-Type", "application/json")\n    json.NewEncoder(w).Encode(tasks)\n}\n\nfunc createTask(w http.ResponseWriter, r *http.Request) {\n    var task Task\n    if err := json.NewDecoder(r.Body).Decode(&task); err != nil {\n        http.Error(w, err.Error(), http.StatusBadRequest)\n        return\n    }\n    mu.Lock()\n    task.ID = nextID\n    nextID++\n    tasks = append(tasks, task)\n    mu.Unlock()\n    w.WriteHeader(http.StatusCreated)\n    json.NewEncoder(w).Encode(task)\n}\n\nfunc main() {\n    http.HandleFunc("/tasks", func(w http.ResponseWriter, r *http.Request) {\n        switch r.Method {\n        case http.MethodGet:\n            getTasks(w, r)\n        case http.MethodPost:\n            createTask(w, r)\n        default:\n            http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)\n        }\n    })\n    log.Println("REST API :8080 पर शुरू हुआ")\n    log.Fatal(http.ListenAndServe(":8080", nil))\n}\n
\n\n

Go पर REST के लाभ:

\n
    \n
  • सरलता और पूर्वानुमेयता — प्रत्येक एंडपॉइंट एक निश्चित डेटा संरचना लौटाता है
  • \n
  • HTTP हेडर के माध्यम से उत्कृष्ट कैशिंग क्षमता
  • \n
  • उपकरणों की व्यापक समर्थन (Swagger, Postman)
  • \n
\n\n

नुकसान: डेटा का ओवर-फ़ेचिंग और अंडर-फ़ेचिंग। यदि क्लाइंट को केवल कार्य का नाम चाहिए, तब भी उसे पूरा JSON मिलेगा।

\n\n

Go पर GraphQL: क्वेरी में लचीलापन

\n\n

GraphQL डेटा अतिरेक की समस्या को हल करता है। क्लाइंट स्वयं तय करता है कि उसे कौन से फ़ील्ड चाहिए। Go समुदाय शक्तिशाली लाइब्रेरी gqlgen प्रदान करता है, जो स्कीमा से कोड उत्पन्न करती है।

\n\n

gqlgen के साथ GraphQL सर्वर का उदाहरण

\n\n

पहले स्कीमा schema.graphql परिभाषित करें:

\n\n
type Task {\n    id: ID!\n    name: String!\n}\n\ntype Query {\n    tasks: [Task!]!\n}\n\ntype Mutation {\n    createTask(name: String!): Task!\n}\n
\n\n

अब जनरेशन चलाएं और Go पर रिज़ॉल्वर लिखें:

\n\n
package main\n\nimport (\n    "log"\n    "net/http"\n    "github.com/99designs/gqlgen/graphql/handler"\n    "github.com/99designs/gqlgen/graphql/playground"\n)\n\n// मान लें कि जनरेटेड कोड पहले से मौजूद है\ntype Resolver struct {\n    tasks []Task\n    mu    sync.Mutex\n}\n\nfunc (r *Resolver) Tasks(ctx context.Context) ([]Task, error) {\n    r.mu.Lock()\n    defer r.mu.Unlock()\n    return r.tasks, nil\n}\n\nfunc (r *Resolver) CreateTask(ctx context.Context, name string) (*Task, error) {\n    r.mu.Lock()\n    defer r.mu.Unlock()\n                

ब्लॉग

पुस्तक अनुशंसाएँ