边缘设备、IoT 网关、高性能常驻进程——这些场景往往只有 C++ 可选。WTAPI 官方支持的五种语言中就包含 C++。好消息是接 WTAPI 不需要重型框架:一个 header-only 的 cpp-httplib 承接 Webhook,libcurl 发 HTTP 请求就够了。本文给出一套符合现代 C++ 资源管理习惯的写法。(接口路径与字段以文档 weiti.apifox.cn 为准)

一、依赖选择:轻、可静态编译

用途选型特点
起 HTTP 服务承接回调cpp-httplibheader-only,引用头文件即用
主动调用平台接口libcurl成熟稳定,可静态链接
JSON 解析nlohmann/json(或其他)header-only,处理回调与响应

整套东西可以静态编译成单个二进制,丢到目标设备直接跑——这对边缘部署很关键。

二、RAII 封装 libcurl:资源自动释放

C++ 写这类程序的第一课就是别手动管理 CURL 句柄。用 RAII 把它包起来,构造即初始化、析构即清理:

#include <curl/curl.h>
#include <string>

class CurlGuard {
public:
    CurlGuard() : curl_(curl_easy_init()) {}
    ~CurlGuard() { if (curl_) curl_easy_cleanup(curl_); }
    CurlGuard(const CurlGuard&) = delete;
    CurlGuard& operator=(const CurlGuard&) = delete;

    CURL* get() { return curl_; }
private:
    CURL* curl_;
};

// 调用 WTAPI:成功判定 code == "1000"
bool wtapiCall(const std::string& path, const std::string& jsonBody) {
    CurlGuard guard;
    if (!guard.get()) return false;

    std::string url = "https://wx.chuapi.com" + path;
    struct curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, "X-finder-TOKEN: 你的平台Token");
    headers = curl_slist_append(headers, "Authorization: Bearer 你的鉴权凭证");
    headers = curl_slist_append(headers, "Content-Type: application/json");

    std::string response;
    curl_easy_setopt(guard.get(), CURLOPT_URL, url.c_str());
    curl_easy_setopt(guard.get(), CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(guard.get(), CURLOPT_POSTFIELDS, jsonBody.c_str());
    curl_easy_setopt(guard.get(), CURLOPT_WRITEFUNCTION,
        +[](char* p, size_t s, size_t n, void* ud) {
            static_cast<std::string*>(ud)->append(p, s * n); return s * n;
        });
    curl_easy_setopt(guard.get(), CURLOPT_WRITEDATA, &response);
    curl_easy_setopt(guard.get(), CURLOPT_TIMEOUT, 15L);

    CURLcode rc = curl_easy_perform(guard.get());
    curl_slist_free_all(headers);   // 请求头列表也要及时释放

    if (rc != CURLE_OK) return false;
    return response.find("\"code\":\"1000\"") != std::string::npos; // 以文档为准
}

请求体中 appIdinstanceId 同样必传(拼进 jsonBody 即可)。

三、cpp-httplib 承接 Webhook:回调快响应

#include <httplib.h>
#include <nlohmann/json.hpp>
using json = nlohmann::json;

int main() {
    curl_global_init(CURL_GLOBAL_ALL);

    httplib::Server svr;
    svr.Post("/webhook", [](const httplib::Request& req, httplib::Response& res) {
        try {
            json event = json::parse(req.body);   // 回调字段以文档为准
            std::string content = event.value("content", "");
            // 群消息取 chatroomId,私聊取 fromWxId
            std::string target = event.contains("chatroomId")
                ? event["chatroomId"].get<std::string>()
                : event.value("fromWxId", "");

            // 耗时逻辑(AI、入库)建议投递到独立线程/队列,回调立即返回
            if (content.find("价格") != std::string::npos) {
                json body = {
                    {"appId", "你的appId"},
                    {"instanceId", "你的实例ID"},
                    {"to", target},
                    {"content", "价目表已发送"}
                };
                wtapiCall("/finder/v2/api/发送路径以文档为准", body.dump());
            }
        } catch (...) { /* 记录异常日志 */ }

        res.set_content(R"({"code":1000})", "application/json");
    });

    svr.listen("0.0.0.0", 8080);
    curl_global_cleanup();
}

四、C++ 特有的工程要点

  • RAII 管理一切句柄:CURL、slist、socket 都用对象生命周期托管,异常路径也不泄漏
  • 回调线程模型:cpp-httplib 每连接一线程,重任务丢任务队列,避免阻塞回调
  • 静态编译部署:依赖静态链接,目标设备无需配齐运行时,契合边缘/IoT 场景
  • 交叉编译:工具链换成交叉编译器即可产出 ARM 等平台二进制

什么场景才需要动用 C++

设备资源受限、与现有 C++ 系统深度集成、对推送时延极敏感(高频消息推送)。普通业务用 Python/Java/Go/PHP 开发更快——WTAPI 五语言的接口约定完全一致,按场景选语言即可,能力没有差别。平台 10w+ 日均调用、99.9% 可用性同样为 C++ 方案兜底。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐