إرسال SMS باستخدام Go (Golang): التكامل مع مكتبة API
في العالم الحديث، تظل وظيفة إرسال رسائل SMS مطلوبة للتحقق من المستخدمين والإشعارات والحملات التسويقية. باستخدام Go (Golang)، يمكن تحقيق ذلك بسهولة وكفاءة بفضل الأدوات المدمجة للعمل مع HTTP وJSON. في هذه المقالة، سنشرح كيفية كتابة مكتبة خاصة بك لإرسال SMS عبر REST API باستخدام Go. سيتم بناء المثال على مزود افتراضي، لكن الكود قابل للتكيف بسهولة مع أي خدمة (Twilio، SMS.ru، Vonage وغيرها).
هندسة المكتبة
ستتكون مكتبتنا من المكونات التالية:
- عميل لطلبات HTTP مع دعم المهلات وإعادة المحاولة
- هياكل للطلب (الرقم، النص، المرسل) والرد (الحالة، معرف الرسالة، الخطأ)
- دالة تهيئة مع مفتاح API وعنوان URL أساسي
- طريقة
SendSMSلإرسال رسالة واحدة
التثبيت والتحضير
للعمل، ستحتاج فقط إلى المكتبة القياسية لـ Go (net/http, encoding/json). لا حاجة لأي تبعيات خارجية. قم بإنشاء ملف sms.go وأضف الحزمة:
package smsclient
import ( "bytes" "encoding/json" "fmt" "net/http" "time")هياكل البيانات
سنحدد الأنواع للطلب والرد:
// SMSRequest يمثل جسم الطلب إلى APItype SMSRequest struct { To string `json:"to"` // رقم المستلم بالتنسيق الدولي Text string `json:"text"` // نص الرسالة Sender string `json:"sender"` // اسم المرسل (الاسم الأبجدي)}
// SMSResponse يحتوي على نتيجة الإرسالtype SMSResponse struct { Success bool `json:"success"` MessageID string `json:"message_id,omitempty"` Error string `json:"error,omitempty"`}عميل للعمل مع API
سننشئ هيكل العميل مع التهيئة:
// Client يدير إرسال SMS عبر APItype Client struct { apiKey string baseURL string httpClient *http.Client}
// NewClient ينشئ مثيلاً جديداً للعميلfunc NewClient(apiKey, baseURL string) *Client { return &Client{ apiKey: apiKey, baseURL: baseURL, httpClient: &http.Client{ Timeout: 10 * time.Second, }, }}طريقة إرسال SMS
سننفذ المنطق الرئيسي — إرسال طلب POST مع جسم JSON:
// SendSMS يرسل SMS ويعيد الرد من APIfunc (c *Client) SendSMS(req SMSRequest) (*SMSResponse, error) { // 1. تسلسل الطلب إلى JSON body, err := json.Marshal(req) if err != nil { return nil, fmt.Errorf("خطأ في تسلسل الطلب: %w", err) }
// 2. إنشاء طلب HTTP httpReq, err := http.NewRequest("POST", c.baseURL+"/sms/send", bytes.NewBuffer(body)) if err != nil { return nil, fmt.Errorf("خطأ في إنشاء الطلب: %w", err) }
// 3. تعيين الرؤوس httpReq.Header.Set("Content-Type", "application/json") httpReq.Header.Set("Authorization", "Bearer "+c.apiKey)
// 4. تنفيذ الطلب resp, err := c.httpClient.Do(httpReq) if err != nil { return nil, fmt.Errorf("خطأ في تنفيذ الطلب: %w", err) } defer resp.Body.Close()
// 5. فك تشفير الرد var smsResp SMSResponse if err := json.NewDecoder(resp.Body).Decode(&smsResp); err != nil { return nil, fmt.Errorf("خطأ في فك تشفير الرد: %w", err) }
// 6. التحقق من رمز حالة HTTP if resp.StatusCode != http.StatusOK { return &smsResp, fmt.Errorf("أعاد API الرمز %d: %s", resp.StatusCode, smsResp.Error) }
return &smsResp, nil}مثال على الاستخدام
الآن سنعرض كيفية تطبيق المكتبة في كود حقيقي:
package main
impo