これは、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
を構築するための structs を定義します。
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 呼び出しに 1 秒のタイムアウトを設定すると、次のようになります。
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 を自由に開いてください。ただし、そのままではマージできないことに注意してください。まずは問題を開いて話し合うことをお勧めします。
一方、README への貢献はいつでも大歓迎です。