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 호출에 대해 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에 대한 기여는 언제나 환영합니다!