使用 C++ 发送短信:libcurl 和 cpprestsdk API 库
在现代 C++ 开发中,经常需要与外部服务集成,包括发送短信消息。尽管 C++ 标准库没有提供用于处理 HTTP 请求的内置工具,但存在强大的第三方库可以解决此问题。在本文中,我们将介绍两个流行的库——libcurl (CURL) 和 cpprestsdk (Casablanca)——并展示如何使用它们通过流行短信服务商的 API 发送短信。
为什么需要用于 C++ 发送短信的库?
通过 C++ 发送短信是服务器应用程序、监控系统、通知或自动化中的典型任务。在 C++ 中直接处理套接字和 HTTP 协议既复杂又容易出错。像 libcurl 和 cpprestsdk 这样的库抽象了这种复杂性,提供了执行 HTTP 请求(GET、POST、PUT)和处理 JSON/XML 响应的便捷接口。
我们将使用短信服务商的 API(例如 Twilio、SMS.ru 或任何其他支持 REST API 的服务商)。在下面的示例中,请将 YOUR_API_KEY、YOUR_SENDER 和 YOUR_PHONE 替换为您自己的实际数据。
库 1:libcurl (CURL)
libcurl 是一个久经考验的 URL 处理库,支持多种协议(HTTP、HTTPS、FTP 等)。它用 C 语言编写,但拥有出色的 C++ 绑定。要在 C++ 项目中使用它,只需包含头文件 curl/curl.h 并与 libcurl 链接即可。
安装 libcurl
- Linux (Ubuntu/Debian):
sudo apt-get install libcurl4-openssl-dev - Windows: 从 官方网站 下载预编译的二进制文件,或使用 vcpkg:
vcpkg install curl - macOS:
brew install curl
通过 libcurl 发送短信的示例(C++ 语法)
在此示例中,我们使用一个简单的 POST 请求,数据格式为 JSON。libcurl 库处理 HTTP 头部和请求体。
#include <iostream>#include <string>#include <curl/curl.h>
// 用于写入服务器响应的回调函数size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { size_t totalSize = size * nmemb; output->append((char*)contents, totalSize); return totalSize;}
bool sendSMS_via_libcurl(const std::string& phone, const std::string& message) { CURL* curl = curl_easy_init(); if (!curl) return false;
std::string response; std::string url = "https://api.sms-provider.com/v1/send"; // 替换为您服务商的 URL std::string jsonData = R"({ "api_key": "YOUR_API_KEY", "sender": "YOUR_SENDER", "phone": ")" + phone + R"(", "text": ")" + message + R"(" })";
struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
CURLcode res = curl_easy_perform(curl); curl_slist_free_all(headers); curl_easy_cleanup(curl);
if (res != CURLE_OK) { std::cerr << "curl 错误: " << curl_easy_strerror(res) << std::endl; return false; }
std::cout << "服务器响应: " << response << std::endl; return true;}
int main() { curl_global_init(CURL_GLOBAL_DEF