إرسال الرسائل النصية القصيرة (SMS) باستخدام Go (Golang): مكتبات API للعمل مع بوابات SMS
في تطوير الويب الحديث، لا يزال إرسال رسائل SMS وظيفة مطلوبة: المصادقة الثنائية، الإشعارات، الحملات التسويقية. لغة Go (Golang) بفضل أدائها وبساطتها مثالية لإنشاء الخدمات المصغرة المسؤولة عن إرسال الرسائل. في هذه المقالة، سنشرح كيفية الاتصال ببوابة SMS عبر API باستخدام المكتبة القياسية net/http والحزم الشائعة للعمل مع طلبات HTTP.
اختيار النهج: المكتبة القياسية مقابل الأطر (Frameworks)
توفر Go مكتبة قياسية قوية تكفي للعمل مع أي REST API. لإرسال SMS، لا حاجة لتثبيت أطر ثقيلة — فقط الحزمة المدمجة net/http تكفي. ومع ذلك، للراحة، سننظر أيضًا في استخدام مكتبة resty التي تبسط إنشاء الطلبات.
الهيكل الأساسي لطلب HTTP بلغة Go
أي بوابة SMS تستقبل طلب POST مع نص JSON. لنلق نظرة على مثال لإرسال رسالة عبر خدمة افتراضية sms-provider.com:
package main
import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" "time")
type SMSRequest struct { Phone string `json:"phone"` Message string `json:"message"` APIKey string `json:"api_key"`}
type SMSResponse struct { Status string `json:"status"` Message string `json:"message"`}
func sendSMS(phone, message, apiKey string) (*SMSResponse, error) { url := "https://api.sms-provider.com/v1/send"
reqBody := SMSRequest{ Phone: phone, Message: message, APIKey: apiKey, }
jsonData, err := json.Marshal(reqBody) if err != nil { return nil, fmt.Errorf("خطأ في تسلسل JSON: %w", err) }
client := &http.Client{Timeout: 10 * time.Second} resp, err := client.Post(url, "application/json", bytes.NewBuffer(jsonData)) if err != nil { return nil, fmt.Errorf("خطأ في طلب HTTP: %w", err) } defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("خطأ في قراءة الرد: %w", err) }
var smsResp SMSResponse if err := json.Unmarshal(body, &smsResp); err != nil { return nil, fmt.Errorf("خطأ في تحليل الرد: %w", err) }
return &smsResp, nil}
func main() { resp, err := sendSMS("+79123456789", "رسالة اختبارية", "your-api-key-123") if err != nil { fmt.Printf("خطأ: %v", err) return } fmt.Printf("الحالة: %s, الرسالة: %s", resp.Status, resp.Message)}استخدام مكتبة resty لتبسيط الكود
مكتبة go-resty/resty/v2 تقلل بشكل كبير من حجم الكود التكراري (boilerplate). التثبيت:
go get github.com/go-resty/resty/v2مثال لإرسال SMS باستخدام resty:
package main
import ( "fmt" "github.com/go-resty/resty/v2")
type SMSResponse struct { Status string `json:"status"` Message string `json:"message"`}
func sendSMSResty(phone, message, apiKey string) (*SMSResponse, error) { client := resty.New() resp, err := client.R(). SetHeader("Content-Type", "application/json"). SetBody(map[string]interface{}{ "phone": phone, "message": message, "api_key": apiKey, }). SetResult(&SMSResponse{}). Post("https://api.sms-provider.com/v1/send")
if err != nil { return nil, fmt.Errorf("خطأ في الطلب: %w", err) }
return resp.Result().(*SMSResponse), nil}
func main() { resp, err := sendSMSResty("+79123456789", "مرحباً من Go!", "my-secret-key") if err != nil { fmt.Prin أيضاً في المكتبة
التعلم الآلي باستخدام Kotlin: نظرة عامة على مكتبات KMath وSmile وKotlinDL وDeepLearning4J
مقاييس Prometheus في Rust: مكتبة prometheus و metrics-exporter-prometheus
Prisma لجافا سكريبت (Node.js): دليل شامل مع أمثلة
HikariCP في Java: دليل شامل مع أمثلة عملية