Sign inGet started

Go SDK

github.com/messagebird/bird-sdk-go (package bird) adalah SDK Go resmi untuk Bird API SDK. Halaman ini membahas instalasi, konfigurasi, error, retry, paginasi, dan webhook. Untuk mengirim email dengan SDK, mulai dengan Quickstart email Go.

Instal

Contoh kode
go get github.com/messagebird/bird-sdk-go
Membutuhkan Go 1.24+. Contoh per-method yang dapat dijalankan ditampilkan di bawah setiap simbol pada pkg.go.dev.

Membuat client

bird.NewClient menerima functional option dari package option. Hanya key API yang wajib. Prefix bk_{region}_… pada key menentukan base URL:
Contoh kode
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)
}
Setiap method API menerima context sebagai parameter pertama dan mengembalikan (T, error). Teruskan context dari request Anda untuk menyebarkan pembatalan sebagai context.Canceled atau context.DeadlineExceeded tanpa membungkusnya dalam error SDK.

Option

Option diterapkan secara berurutan (option terakhir menang). Empat option bersifat khusus konstruksi dan mengembalikan error jika diteruskan ke satu panggilan: WithAPIKey, WithBaseURL, WithRegion, dan WithHTTPClient. Semua option lainnya berfungsi baik saat konstruksi (default seluruh client) maupun per panggilan (override untuk satu request tersebut):
Contoh kode
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))
OptionCakupanFungsi
WithAPIKey, WithBaseURL, WithRegion, WithHTTPClientKhusus konstruksiKredensial, resolusi endpoint, dan *http.Client yang mendasarinya.
WithTimeout, WithMaxRetriesKonstruksi atau per panggilanTimeout per percobaan dan anggaran retry untuk kegagalan sementara.
WithIdempotencyKeyPer panggilanTetapkan idempotency key untuk satu panggilan mutasi (jika tidak, key dibuat otomatis).
WithHeaderKonstruksi atau per panggilanHeader request tambahan. Header milik SDK (Authorization, Idempotency-Key, …) tetap menang.
WithEmailDefaults, WithWebhookSecret, WithResponseIntoKonstruksi atau per panggilanDefault pengiriman seluruh channel, signing secret webhook, dan penangkapan transport-metadata mentah.

Cara pembuatannya

Wire type dan client level rendah dihasilkan dari spesifikasi OpenAPI Bird. Package bird yang ditulis manual menyediakan permukaan resource terkurasi (client.Email, client.Webhooks) dan struct parameter dengan tipe Go seperti []string dan time.Time. Tipe responsnya mengaliaskan model yang dihasilkan agar tetap selaras dengan format wire. Inti SDK mengelola retry, timeout, dan idempotensi untuk setiap resource. Lihat Konsep SDK untuk model lengkap.

Error

Setiap kegagalan server adalah *bird.APIError yang membawa StatusCode, Type (kategori error kasar), Code (kode E##### yang stabil), Message, dan RequestID untuk korelasi dukungan. Dua varian membawa data tambahan: *bird.RateLimitError (429, dengan RetryAfter) dan *bird.ValidationError (422, dengan Details per field). Keduanya di-unwrap ke *APIError, sehingga satu errors.As(err, &apiErr) menangkap setiap respons server. Percabangan dengan errors.As:
Contoh kode
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
		}
	}
}
Kegagalan tanpa respons HTTP adalah tipe terpisah: *bird.ConnectionError (DNS, koneksi ditolak) dan *bird.TimeoutError (satu percobaan melewati timeout-nya). Tanda tangan webhook yang tidak valid adalah *bird.WebhookVerificationError.

Retry yang aman

Kegagalan sementara, termasuk timeout, respons 429, dan respons 5xx, di-retry secara otomatis. Anggaran default adalah dua retry; atur dengan WithMaxRetries, atau gunakan nol untuk menonaktifkan retry. Untuk panggilan mutasi, SDK menghasilkan satu idempotency key per panggilan logis dan menggunakannya kembali di setiap percobaan. Teruskan option.WithIdempotencyKey untuk menetapkan key Anda sendiri dan membuat retry tingkat aplikasi aman.

Paginasi

Method list mengembalikan iter.Seq2[*T, error], iterator range-over-func yang malas dan mengambil halaman saat Anda mengonsumsinya:
Contoh kode
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
}
Keluar dari loop menghentikan pengambilan; error pengambilan dihasilkan sekali dan mengakhiri urutan. Untuk kontrol kursor manual, ListPage mengembalikan satu halaman beserta kursor berikutnya.

Webhook

client.Webhooks.Unwrap memverifikasi tanda tangan Standard Webhooks atas body request mentah dan mengembalikan event bertipe. Konfigurasikan signing secret dengan option.WithWebhookSecret pada client atau per panggilan. Teruskan ke Unwrap byte persis yang Anda terima karena mem-parse dan men-serialize ulang akan merusak tanda tangan:
Contoh kode
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)
		}
	})
}
Gunakan switch pada event.Type() untuk diskriminan, atau AsAny() untuk payload konkret. Tipe event masa depan yang tidak dikenal mengembalikan error alih-alih panic, sehingga SDK yang lebih lama tetap bekerja terhadap server yang lebih baru.

Jalan pintas

Endpoint yang belum ada di permukaan bertipe dapat dijangkau melalui client.Get / Post / Put / Patch / Delete, dengan autentikasi, retry, dan penanganan idempotensi yang sama:
Contoh kode
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))
}
Temukan path-nya di Referensi API.

Langkah selanjutnya

  • Quickstart email Go: Kirim pesan pertama Anda dan gunakan Send, Get, dan List.
  • Konsep SDK: Pelajari model lintas-SDK untuk error, idempotensi, paginasi, dan webhook.
  • Referensi API: Tinjau kontrak HTTP yang mendasarinya.

Sumber daya terkait

Lanjutkan dengan dokumentasi, panduan, dan contoh untuk topik ini. Sumber daya tersedia dalam bahasa Inggris.

Dapatkan ringkasan implementasi