在C# (.NET)中发送短信:API集成完全指南
在现代世界中,短信通知仍然是联系用户最可靠的方式之一。在C# (.NET)生态系统中,有多种发送消息的方法——从直接的HTTP请求到使用专门的NuGet包。在本文中,我们将通过基于HttpClient的纯实现示例,讲解如何通过流行服务(Twilio、sms.ru、Smsc)配置短信发送,并介绍一个用于俄罗斯供应商的现成库。
方法选择:库还是纯HTTP?
在C#中发送短信有两种主要途径:
- 使用官方SDK(例如,用于.NET的Twilio)——提供类型化接口、内置错误处理和文档。
- 通过HttpClient直接使用REST API——完全控制请求,最小化依赖,能够与任何供应商合作。
第二种方法更适合教育目的和需要灵活性的项目。让我们详细探讨它。
通过HTTP API发送短信的基本实现
让我们创建一个类SmsService,它将通过sms.ru(或任何其他格式类似的服务)的API发送消息。
using System;using System.Net.Http;using System.Threading.Tasks;
public class SmsService{ private readonly HttpClient _httpClient; private readonly string _apiKey;
public SmsService(string apiKey) { _httpClient = new HttpClient(); _apiKey = apiKey; }
public async Task<string> SendSmsAsync(string phone, string message) { var url = $"https://sms.ru/sms/send?api_id={_apiKey}&to={phone}&msg={Uri.EscapeDataString(message)}&json=1"; var response = await _httpClient.GetAsync(url); return await response.Content.ReadAsStringAsync(); }}使用方式:
var sms = new SmsService("您的_API_密钥");string result = await sms.SendSmsAsync("+79123456789", "你好!这是一条测试消息。");Console.WriteLine(result);优化:异步和错误处理
在实际项目中,需要添加号码验证、失败重试和日志记录。改进版本:
public async Task<SmsResult> SendSmsAsync(string phone, string message){ try { if (string.IsNullOrWhiteSpace(phone) || phone.Length < 10) return new SmsResult { Success = false, Error = "号码格式无效" };
var url = $"https://sms.ru/sms/send?api_id={_apiKey}&to={phone}&msg={Uri.EscapeDataString(message)}&json=1"; var response = await _httpClient.GetAsync(url); var json = await response.Content.ReadAsStringAsync();
// 解析JSON(可以使用System.Text.Json) var result = JsonSerializer.Deserialize<SmsApiResponse>(json); return new SmsResult { Success = result?.Status == "OK", Response = json }; } catch (HttpRequestException ex) { return new SmsResult { Success = false, Error = $"网络错误:{ex.Message}" }; }}为了解析响应,创建一个简单的模型:
public class SmsApiResponse{ public string Status { get; set; } public int Balance { get; set; }}现成库:用于.NET的Twilio
如果您需要生产就绪的解决方案,请使用Twilio SDK(NuGet:Twilio)。示例:
using Twilio;using Twilio.Rest.Api.V2010.Account;
TwilioClient.Init("ACCOUNT_SID", "AUTH_TOKEN");
var message = MessageResource.Create( body: "来自C#的问候!", from: new PhoneNumber("+1234567890"), to: new PhoneNumber("+79123456789"));
Console.WriteL