C++ SDK 开源CloudEvents 未提供C++SDK,但您可以通过发送一个http请求的形式来完成发送事件。 前提条件 1. 您的运行环境已安装libcurl、boost依赖库。支持c++11及以上,若不支持修改对应代码。 2. 下载eventBridgecppsdk.zip,查看示例代码。 签名生成工具 cpp include "EventSignHelper.h" include include include "crypt/hmac.h" include "crypt/sha1.h" include include using namespace std; string get(map m, const string &key) { string value; if (m.find(key) ! m.end()) { value m[key]; } return value; } string implode(const vector &vec, const string &glue) { string res; int n 0; for (const auto &str : vec) { if (n 0) { res str; } else { res + glue + str; } n++; } return res; } string uppercase(string str) { transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return toupper(c); }); return str; } bool startwith(string src, string prefix) { auto res mismatch(prefix.begin(), prefix.end(), src.begin()); return res.first prefix.end(); } void ltrim(string &s) { s.erase(s.begin(), findif(s.begin(), s.end(), [](unsigned char ch) { return !isspace(ch); })); } // trim from end (in place) void rtrim(string &s) { s.erase(findif(s.rbegin(), s.rend(), [](unsigned char ch) { return !isspace(ch); }) .base(), s.end()); } // trim from both ends (in place) void trim(string &s) { ltrim(s); rtrim(s); } string getCanonicalizedHeaders(const map &headers, const string &prefix "xceb") { stringstream result; for (const auto &item : headers) { if (startwith(item.first, prefix)) { string v item.second; trim(v); result query) { if (query.empty()) { return pathname; } vector tmp; tmp.reserve(query.size()); for (const auto &item : query) { tmp.pushback(string(item.first) + "" + item.second); } return pathname + "?" + implode(tmp, "&"); } string hmacsha1(const string &src, const string &key) { boost::uint8t hashval[sha1::HASHSIZE]; hmac ::calc(src, key, hashval); return base64::encodefromarray(hashval, sha1::HASHSIZE); } // 生成签名 string EventSignHelper::genSign(const string& httpMethod, const map & headers, const string& pathname, const map & query, const string& ak, const string& sk) { string contentmd5 get(headers, "contentmd5"); string contenttype get(headers, "contenttype"); string date get(headers, "date"); stringstream stringToSign; stringToSign << uppercase("POST") << "n" << contentmd5 << "n" << contenttype << "n" << date << "n"; stringToSign << getCanonicalizedHeaders(headers); stringToSign << getCanonicalizedResource(pathname, query); string sign hmacsha1(stringToSign.str(), sk); string token "ceb:" + ak + ":" + sign; return token; }