Ini adalah perpustakaan Go resmi untuk mengirim notifikasi dengan Courier REST API.
Untuk penjelasan lengkap tentang muatan dan properti permintaan dan respons, silakan lihat dokumen resmi Courier API.
Modul ini memerlukan versi Go >= 1.13.
Jalankan perintah berikut untuk menggunakan perpustakaan Go di modul Go Anda:
go get github.com/trycourier/courier-go/v3
import (
"context"
"fmt"
courierclient "github.com/trycourier/courier-go/v3/client"
option "github.com/trycourier/courier-go/v3/option"
)
client := courierclient . NewClient (
option . WithAuthorizationToken ( "" ),
)
import ( "context" "fmt" courier "github.com/trycourier/courier-go/v3" courierclient "github.com/trycourier/courier-go/v3/client" option "github.com/trycourier/courier-go/v3/option" ) client := courierclient . NewClient ( option . WithAuthorizationToken ( "" ), ) sendResponse , err := client . Send ( context . TODO (), & courier. SendMessageRequest { Message : courier. NewMessageFromTemplateMessage ({ Template : "" , }), }, ) if err != nil { return err } fmt . Printf ( "Sent message %s n " , sendResponse . RequestId )
API kami, khususnya metode pengiriman, menggunakan beberapa gabungan. Go SDK kami mendefinisikan struct untuk membangun gabungan ini, seperti courier.Message
, yang ditunjukkan di bawah ini:
import (
courier "github.com/trycourier/courier-go/v3"
)
request := & courier. SendMessageRequest {
// Construct a content message.
Message : & courier. Message {
ContentMessage : & courier. ContentMessage {
// Construct a single recepient that is a user recepient.
To : & courier. MessageRecipient {
Recipient : & courier. Recipient {
UserRecipient : & courier. UserRecipient {
Email : courier . String ( "[email protected]" ),
Data : & courier. MessageData {
"name" : "Marty" ,
},
},
},
},
// Construct content from elemental content sugar.
Content : & courier. Content {
ElementalContentSugar : & courier. ElementalContentSugar {
Title : "Back to the Future" ,
Body : "Oh my {{name}}, we need 1.21 Gigawatts!" ,
},
},
},
},
}
Kami memperkenalkan pengalaman konstruksi serikat pekerja yang lebih baik di 3.0.8. Misalnya, jenis courier.Message
sebelumnya dibuat dengan yang berikut:
import (
courier "github.com/trycourier/courier-go/v3"
)
request := courier. SendMessageRequest {
// Construct a content message.
Message : courier . NewMessageFromContentMessage (
& courier. ContentMessage {
// Construct a single recepient that is a user recepient.
To : courier . NewMessageRecipientFromRecipient (
courier . NewRecipientFromUserRecipient (
& courier. UserRecipient {
Email : courier . String ( "[email protected]" ),
Data : & courier. MessageData {
"name" : "Marty" ,
},
},
),
),
// Construct content from elemental content sugar.
Content : courier . NewContentFromElementalContentSugar (
& courier. ElementalContentSugar {
Title : "Back to the Future" ,
Body : "Oh my {{name}}, we need 1.21 Gigawatts!" ,
},
),
},
),
}
Meskipun konstruksinya terlihat cukup mirip, pendekatan lama memerlukan navigasi berbagai nama fungsi konstruktor yang rumit (misalnya courier.NewContentFromElementalContentSugar
).
Pendekatan baru ini menghilangkan konstruktor ini sepenuhnya, sehingga menyederhanakan pengalaman secara signifikan. Bermigrasi dari pendekatan lama semudah mengatur tipe beton ke bidang yang sesuai seperti:
Sebelum
...
Content : courier . NewContentFromElementalContentSugar (
& courier. ElementalContentSugar {
Title : "Back to the Future" ,
Body : "Oh my {{name}}, we need 1.21 Gigawatts!" ,
},
),
...
Setelah
...
Content : & courier. Content {
ElementalContentSugar : & courier. ElementalContentSugar {
Title : "Back to the Future" ,
Body : "Oh my {{name}}, we need 1.21 Gigawatts!" ,
},
},
...
Menetapkan batas waktu untuk setiap permintaan semudah menggunakan pustaka context
standar. Menyetel batas waktu satu detik untuk setiap panggilan API terlihat seperti berikut:
ctx , cancel := context . WithTimeout ( context . TODO (), time . Second )
defer cancel ()
response , err := client . Send (
ctx ,
& courier. SendMessageRequest {
Message : ...
},
)
Berbagai opsi klien disertakan untuk mengadaptasi perilaku perpustakaan, yang mencakup mengonfigurasi token otorisasi untuk dikirim pada setiap permintaan, atau menyediakan instrumen Anda sendiri *http.Client
. Kedua opsi ini ditunjukkan di bawah ini:
client := courierclient . NewClient (
option . WithAuthorizationToken ( "" ),
option . WithHTTPClient (
& http. Client {
Timeout : 5 * time . Second ,
},
),
)
Disarankan untuk menyediakan
*http.Client
Anda sendiri. Jika tidak,http.DefaultClient
akan digunakan, dan klien Anda akan menunggu respons tanpa batas waktu (kecuali batas waktu berbasis konteks per permintaan digunakan).
Jenis kesalahan terstruktur dihasilkan dari panggilan API yang mengembalikan kode status tidak berhasil. Misalnya, Anda dapat memeriksa apakah kesalahan tersebut disebabkan oleh permintaan yang buruk (yaitu kode status 400) dengan yang berikut ini:
response , err := client . Send (
context . TODO (),
& courier. SendMessageRequest {},
)
if err != nil {
if apiErr , ok := err .( * core. APIError ); ok && apiErr . StatusCode == http . StatusBadRequest {
// Do something with the bad request ...
}
return err
}
Kesalahan ini juga kompatibel dengan errors.Is
dan errors.As
API, sehingga Anda dapat mengakses kesalahan seperti ini:
response , err := client . Send (
context . TODO (),
& courier. SendMessageRequest {},
)
if err != nil {
var apiErr * core. APIError
if errors . As ( err , apiError ); ok {
switch apiErr . StatusCode {
case http . StatusBadRequest :
// Do something with the bad request ...
}
}
return err
}
Jika Anda ingin menggabungkan kesalahan dengan informasi tambahan dan tetap mempertahankan kemampuan untuk mengakses tipe dengan errors.Is
dan errors.As
, Anda dapat menggunakan direktif %w
:
response , err := client . Send (
context . TODO (),
& courier. SendMessageRequest {},
)
if err != nil {
return fmt . Errorf ( "failed to list employees: %w" , err )
}
Meskipun kami menghargai kontribusi sumber terbuka pada SDK ini, pustaka ini dibuat secara terprogram. Penambahan yang dilakukan langsung ke perpustakaan ini harus dipindahkan ke kode generasi kami, jika tidak, penambahan tersebut akan ditimpa pada rilis berikutnya. Jangan ragu untuk membuka PR sebagai bukti konsep, tapi ketahuilah bahwa kami tidak akan bisa menggabungkannya apa adanya. Kami menyarankan untuk membuka terbitan terlebih dahulu untuk berdiskusi dengan kami!
Di sisi lain, kontribusi terhadap README selalu sangat kami harapkan!