هذه هي مكتبة 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 )
تستخدم واجهة برمجة التطبيقات الخاصة بنا، وخاصة طريقة الإرسال، عدة اتحادات. تحدد 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
. مثل واجهات برمجة التطبيقات، يمكنك الوصول إلى الخطأ على النحو التالي:
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) هذه، إلا أنه يتم إنشاء هذه المكتبة برمجيًا. يجب نقل الإضافات التي تمت مباشرة إلى هذه المكتبة إلى رمز الجيل الخاص بنا، وإلا فسيتم استبدالها عند الإصدار التالي الذي تم إنشاؤه. لا تتردد في فتح ملف العلاقات العامة كدليل على المفهوم، ولكن اعلم أننا لن نكون قادرين على دمجه كما هو. نقترح فتح مشكلة أولاً لمناقشتها معنا!
من ناحية أخرى، المساهمات في README هي دائمًا موضع ترحيب كبير!