นี่คือไลบรารี Go อย่างเป็นทางการสำหรับส่งการแจ้งเตือนด้วย Courier REST API
สำหรับคำอธิบายแบบเต็มของเพย์โหลดและคุณสมบัติของคำขอและการตอบกลับ โปรดดูเอกสาร 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 ของเรา โดยเฉพาะวิธีการส่ง ใช้การรวมหลายรายการ 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 เพื่อเป็นข้อพิสูจน์แนวคิด แต่โปรดทราบว่าเราจะไม่สามารถรวมมันเข้าด้วยกันได้ เราขอแนะนำให้เปิดประเด็นก่อนเพื่อหารือกับเรา!
ในทางกลับกัน การมีส่วนร่วมใน README นั้นยินดีต้อนรับเสมอ!