Sign inGet Started

Go SDK

github.com/messagebird/bird-sdk-go (पैकेज bird) Bird API के लिए आधिकारिक Go SDK है। यह पेज इंस्टॉलेशन, कॉन्फ़िगरेशन, त्रुटियों, फिर से प्रयास, पेजिनेशन और वेबहुक के बारे में है। SDK से ईमेल भेजने के लिए Go ईमेल क्विकस्टार्ट से शुरू करें।

इंस्टॉल करें

कोड उदाहरण
go get github.com/messagebird/bird-sdk-go

Go 1.24 या उससे नया संस्करण ज़रूरी है। हर मेथड के चलाने योग्य उदाहरण pkg.go.dev पर हर सिंबल के नीचे दिखते हैं।

क्लाइंट बनाएँ

bird.NewClient, option पैकेज से फ़ंक्शनल ऑप्शन लेता है। केवल API कुंजी ज़रूरी है। कुंजी का bk_{region}_… प्रीफ़िक्स बेस URL तय करता है:

कोड उदाहरण
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	msg, err := client.Email.Send(context.Background(), bird.EmailSendParams{
		From:    "onboarding@messagebird.dev",
		To:      []string{"delivered@messagebird.dev"},
		Subject: "Hello from Bird",
		HTML:    "<p>My first Bird email.</p>",
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(msg.Id, *msg.Status)
}

हर API मेथड पहले पैरामीटर के रूप में context लेता है और (T, error) लौटाता है। अपने अनुरोध का context पास करें, ताकि रद्दीकरण context.Canceled या context.DeadlineExceeded के रूप में आगे पहुँचे और SDK त्रुटि में लिपटा न हो।

ऑप्शन

ऑप्शन क्रम से लागू होते हैं (बाद वाला ऑप्शन मान्य रहता है)। चार ऑप्शन केवल क्लाइंट बनाते समय दिए जा सकते हैं और किसी एक कॉल में पास करने पर त्रुटि लौटाते हैं: WithAPIKey, WithBaseURL, WithRegion और WithHTTPClient। बाकी सभी ऑप्शन क्लाइंट बनाते समय (पूरे क्लाइंट का डिफ़ॉल्ट) और हर कॉल में (उस एक अनुरोध के लिए ओवरराइड) दोनों तरह काम करते हैं:

कोड उदाहरण
client, err := bird.NewClient(
  option.WithAPIKey(os.Getenv("BIRD_API_KEY")),
  option.WithTimeout(10*time.Second), // per-attempt; each retry gets a fresh budget
)

// This send does not retry transient failures.
msg, err := client.Email.Send(ctx, params, option.WithMaxRetries(0))
ऑप्शनदायरायह क्या करता है
WithAPIKey, WithBaseURL, WithRegion, WithHTTPClientकेवल निर्माण के समयक्रेडेंशियल, एंडपॉइंट का निर्धारण और अंतर्निहित *http.Client।
WithTimeout, WithMaxRetriesनिर्माण के समय या प्रति कॉलप्रति प्रयास टाइमआउट और अस्थायी विफलताओं के लिए फिर से प्रयास करने की सीमा।
WithIdempotencyKeyप्रति कॉलकिसी एक बदलाव करने वाली कॉल के लिए idempotency कुंजी तय करें (अन्यथा आपके लिए एक कुंजी बनाई जाती है)।
WithHeaderनिर्माण के समय या प्रति कॉलअतिरिक्त अनुरोध हेडर। SDK के अपने हेडर (Authorization, Idempotency-Key, …) प्राथमिकता पाते हैं।
WithEmailDefaults, WithWebhookSecret, WithResponseIntoनिर्माण के समय या प्रति कॉलपूरे चैनल के लिए भेजने के डिफ़ॉल्ट, वेबहुक साइनिंग सीक्रेट, और कच्चे ट्रांसपोर्ट मेटाडेटा का संग्रह।

यह कैसे बना है

वायर टाइप और निम्न-स्तरीय क्लाइंट Bird के OpenAPI स्पेसिफ़िकेशन से जनरेट किए जाते हैं। हाथ से लिखा गया bird पैकेज चुनी हुई रिसोर्स सतह (client.Email, client.Webhooks) और []string व time.Time जैसे Go टाइप वाले पैरामीटर स्ट्रक्ट देता है। इसके रिस्पॉन्स टाइप जनरेट किए गए मॉडलों के उपनाम हैं, ताकि वे वायर फ़ॉर्मेट के अनुरूप रहें। कोर हर रिसोर्स के लिए फिर से प्रयास, टाइमआउट और idempotency संभालता है। पूरे मॉडल के लिए SDK अवधारणाएँ देखें।

त्रुटियाँ

हर सर्वर विफलता एक *bird.APIError होती है, जिसमें StatusCode, Type (मोटी त्रुटि श्रेणी), Code (स्थिर E##### कोड), Message, और सपोर्ट से मिलान के लिए RequestID होते हैं। दो वेरिएंट अतिरिक्त डेटा रखते हैं: *bird.RateLimitError (एक 429, RetryAfter के साथ) और *bird.ValidationError (एक 422, प्रति-फ़ील्ड Details के साथ)। दोनों *APIError में अनरैप होते हैं, इसलिए एक ही errors.As(err, &apiErr) हर सर्वर रिस्पॉन्स को पकड़ लेता है। errors.As से ब्रांच करें:

कोड उदाहरण
package main

import (
	"context"
	"errors"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	_, err = client.Email.Send(context.Background(), bird.EmailSendParams{
		From: "onboarding@messagebird.dev", To: []string{"delivered@messagebird.dev"}, Subject: "Hello from Bird", HTML: "<p>My first Bird email.</p>",
	})
	if err != nil {
		var rle *bird.RateLimitError
		var ve *bird.ValidationError
		var ae *bird.APIError
		switch {
		case errors.As(err, &rle):
			fmt.Println("rate limited; retry after", rle.RetryAfter)
		case errors.As(err, &ve):
			for _, d := range ve.Details {
				fmt.Printf("%s: %s\n", d.Param, d.Message)
			}
		case errors.As(err, &ae):
			fmt.Printf("API error %s (status %d, request %s)\n", ae.Code, ae.StatusCode, ae.RequestID)
		default:
			log.Print(err) // transport: *bird.ConnectionError or *bird.TimeoutError
		}
	}
}

जिन विफलताओं में कोई HTTP रिस्पॉन्स नहीं होता, वे अलग टाइप हैं: *bird.ConnectionError (DNS, कनेक्शन अस्वीकार) और *bird.TimeoutError (किसी एक प्रयास ने अपना टाइमआउट पार कर दिया)। गलत वेबहुक सिग्नेचर *bird.WebhookVerificationError होता है।

सुरक्षित रूप से फिर से प्रयास करना

अस्थायी विफलताओं, जैसे टाइमआउट, 429 रिस्पॉन्स और 5xx रिस्पॉन्स, पर अपने आप फिर से प्रयास होता है। डिफ़ॉल्ट सीमा दो फिर से प्रयास है; इसे WithMaxRetries से बदलें, या फिर से प्रयास बंद करने के लिए शून्य दें। डेटा बदलने वाली कॉल के लिए SDK हर तार्किक कॉल पर एक idempotency कुंजी बनाता है और हर प्रयास में उसी का दोबारा उपयोग करता है। अपनी कुंजी तय करने और एप्लिकेशन-स्तर पर फिर से प्रयास करना सुरक्षित बनाने के लिए option.WithIdempotencyKey पास करें।

पेजिनेशन

List मेथड एक iter.Seq2[*T, error] लौटाते हैं। यह एक लेज़ी range-over-func इटरेटर है, जो आपके उपयोग करते समय पेज लाता है:

कोड उदाहरण
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	for msg, err := range client.Email.List(context.Background(), bird.EmailListParams{Status: bird.EmailStatusBounced}) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(msg.Id)
	}
	page, err := client.Email.ListPage(context.Background(), bird.EmailListParams{}, "")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(len(page.Data)) // page.NextCursor carries the next starting_after
}

लूप से बाहर निकलने पर पेज लाना बंद हो जाता है। पेज लाने में त्रुटि होने पर वह एक बार लौटाई जाती है और क्रम समाप्त हो जाता है। कर्सर को स्वयं नियंत्रित करने के लिए ListPage एक पेज और अगला कर्सर लौटाता है।

वेबहुक

client.Webhooks.Unwrap रॉ अनुरोध बॉडी पर Standard Webhooks सिग्नेचर की जाँच करता है और एक टाइप्ड इवेंट लौटाता है। साइनिंग सीक्रेट को क्लाइंट पर या हर कॉल में option.WithWebhookSecret से कॉन्फ़िगर करें। Unwrap को वही बाइट्स दें जो आपको मिले थे, क्योंकि उन्हें पार्स करके दोबारा सीरियलाइज़ करने से सिग्नेचर टूट जाता है:

कोड उदाहरण
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(
		option.WithAPIKey(os.Getenv("BIRD_API_KEY")),
		option.WithWebhookSecret(os.Getenv("BIRD_WEBHOOK_SECRET")),
	)
	if err != nil {
		log.Fatal(err)
	}
	http.HandleFunc("/webhooks/bird", func(w http.ResponseWriter, r *http.Request) {
		body, _ := io.ReadAll(r.Body)
		event, err := client.Webhooks.Unwrap(body, r.Header)
		if err != nil {
			http.Error(w, "invalid signature", http.StatusBadRequest)
			return
		}
		w.WriteHeader(http.StatusNoContent) // ack fast, then process

		payload, _ := event.AsAny()
		switch p := payload.(type) {
		case bird.EmailDeliveredEvent:
			fmt.Println("delivered:", p.Data.EmailId, p.Data.Recipient)
		case bird.EmailBouncedEvent:
			fmt.Println("bounced:", p.Type)
		}
	})
}

डिस्क्रिमिनेंट के लिए event.Type() पर, या ठोस पेलोड के लिए AsAny() पर switch करें। भविष्य का कोई अज्ञात इवेंट प्रकार panic के बजाय त्रुटि लौटाता है, इसलिए पुराना SDK नए सर्वर के साथ भी काम करता रहता है।

वैकल्पिक रास्ता

जो एंडपॉइंट अभी टाइप्ड इंटरफ़ेस में नहीं हैं, उन तक client.Get / Post / Put / Patch / Delete से पहुँचा जा सकता है। इनमें भी वही ऑथ, फिर से प्रयास और idempotency प्रबंधन लागू होते हैं:

कोड उदाहरण
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	bird "github.com/messagebird/bird-sdk-go"
	"github.com/messagebird/bird-sdk-go/option"
)

func main() {
	client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
	if err != nil {
		log.Fatal(err)
	}
	var out struct {
		Data []struct {
			Recipient string `json:"recipient"`
		} `json:"data"`
	}
	if err := client.Get(context.Background(), "/v1/email/suppressions", &out); err != nil {
		log.Fatal(err)
	}
	fmt.Println(len(out.Data))
}

पाथ API संदर्भ में देखें।

अगले कदम

इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।