這是使用 Courier REST API 發送通知的官方 Go 程式庫。
有關請求和回應負載及屬性的完整說明,請參閱官方 Courier API 文件。
此模組需要 Go 版本 >= 1.13。
執行以下命令以在 Go 模組中使用 Go 庫:
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,特別是 send 方法,使用了多個聯合。我們的 Go SDK 定義了建構這些聯合的結構,例如courier.Message
,如下所示:
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!" ,
},
},
},
},
}
我們在3.0.8中引入了更好的工會建立體驗。例如, courier.Message
類型之前是使用以下內容建構的:
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!" ,
},
),
},
),
}
儘管建構看起來非常相似,但舊方法需要導覽各種繁瑣的建構函式名稱(例如courier.NewContentFromElementalContentSugar
)。
新方法完全放棄了這些建構函數,從而顯著簡化了體驗。從舊方法遷移就像將具體類型設為適當的欄位一樣簡單,如下所示:
前
...
Content : courier . NewContentFromElementalContentSugar (
& courier. ElementalContentSugar {
Title : "Back to the Future" ,
Body : "Oh my {{name}}, we need 1.21 Gigawatts!" ,
},
),
...
後
...
Content : & courier. Content {
ElementalContentSugar : & courier. ElementalContentSugar {
Title : "Back to the Future" ,
Body : "Oh my {{name}}, we need 1.21 Gigawatts!" ,
},
},
...
為每個單獨的請求設定逾時就像使用標準context
文庫一樣簡單。為單一 API 呼叫設定一秒逾時如下所示:
ctx , cancel := context . WithTimeout ( context . TODO (), time . Second )
defer cancel ()
response , err := client . Send (
ctx ,
& courier. SendMessageRequest {
Message : ...
},
)
包含各種客戶端選項來適應庫的行為,其中包括配置在每個請求上發送的授權令牌,或提供您自己的檢測*http.Client
。這兩個選項如下所示:
client := courierclient . NewClient (
option . WithAuthorizationToken ( "" ),
option . WithHTTPClient (
& http. Client {
Timeout : 5 * time . Second ,
},
),
)
建議提供您自己的
*http.Client
。否則,將使用http.DefaultClient
,並且您的客戶端將無限期地等待回應(除非使用每個請求、基於上下文的逾時)。
結構化錯誤類型是從傳回非成功狀態代碼的 API 呼叫傳回的。例如,您可以使用下列命令檢查錯誤是否是由於錯誤請求(即狀態代碼 400)引起的:
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
}
這些錯誤也與errors.Is
和errors.As
API相容,因此您可以像這樣存取錯誤:
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
}
如果您想要用附加資訊包裝錯誤,並且仍然保留使用errors.Is
和errors.As
存取類型的能力,您可以使用%w
指令:
response , err := client . Send (
context . TODO (),
& courier. SendMessageRequest {},
)
if err != nil {
return fmt . Errorf ( "failed to list employees: %w" , err )
}
雖然我們重視對此 SDK 的開源貢獻,但該程式庫是透過程式設計方式產生的。直接對該庫進行的新增必須移至我們的生成程式碼中,否則它們將在下一個生成的版本中被覆蓋。請隨意打開 PR 作為概念證明,但要知道我們無法按原樣合併它。我們建議先打開一個問題與我們討論!
另一方面,我們始終非常歡迎對自述文件做出貢獻!