C++ SDK
更新时间 2025-06-18 17:56:19
最近更新时间: 2025-06-18 17:56:19
开源CloudEvents 未提供C++SDK,但您可以通过发送一个http请求的形式来完成发送事件。
前提条件
您的运行环境已安装libcurl、boost依赖库。支持c++11及以上,若不支持修改对应代码。
下载eventBridge-cpp-sdk.zip,查看示例代码。
签名生成工具
#include "EventSignHelper.h"
#include <sstream>
#include <iomanip>
#include "crypt/hmac.h"
#include "crypt/sha1.h"
#include <string>
#include <algorithm>
using namespace std;
string get(map<string, string> m, const string &key) {
string value;
if (m.find(key) != m.end()) {
value = m[key];
}
return value;
}
string implode(const vector<string> &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 start_with(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(), find_if(s.begin(), s.end(), [](unsigned char ch) {
return !isspace(ch);
}));
}
// trim from end (in place)
void rtrim(string &s) {
s.erase(find_if(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<string, string> &headers,
const string &prefix = "x-acs-") {
stringstream result;
for (const auto &item : headers) {
if (start_with(item.first, prefix)) {
string v = item.second;
trim(v);
result << item.first << ":" << v << "\n";
}
}
return result.str();
}
string getCanonicalizedResource(string pathname, map<string, string> query) {
if (query.empty()) {
return pathname;
}
vector<string> tmp;
tmp.reserve(query.size());
for (const auto &item : query) {
tmp.push_back(string(item.first) + "=" + item.second);
}
return pathname + "?" + implode(tmp, "&");
}
string hmacsha1(const string &src, const string &key) {
boost::uint8_t hash_val[sha1::HASH_SIZE];
hmac<sha1>::calc(src, key, hash_val);
return base64::encode_from_array(hash_val, sha1::HASH_SIZE);
}
// 生成签名
string EventSignHelper::genSign(const string& httpMethod,
const map<string, string>& headers,
const string& pathname,
const map<string, string>& query,
const string& ak,
const string& sk) {
string content_md5 = get(headers, "content-md5");
string content_type = get(headers, "content-type");
string date = get(headers, "date");
stringstream stringToSign;
stringToSign << uppercase("POST") << "\n"
<< content_md5 << "\n"
<< content_type << "\n"
<< date << "\n";
stringToSign << getCanonicalizedHeaders(headers);
stringToSign << getCanonicalizedResource(pathname, query);
string sign = hmacsha1(stringToSign.str(), sk);
string token = "ceb:" + ak + ":" + sign;
return token;
}
发布事件
int main(int argc, char* argv[])
{
string ak = "please click your ak";
string sk = "please click your sk";
string url = "http://event.eventbridge-test123.ctyun.cn/api/v1/putEvents";
string accountid = "5d4ce56a0xxxxxxxc92ac5884";
string eventbusname = "test-bill";
string pathname = "/api/v1/putEvents";
map<string, string> query = {};
map<string, string> headers = {{"content-type", "application/json"}};
string response;
// 创建事件实例eventBridge-cpp-sdk.zip
Event event;
event.id = "1723530386.250878.3f7f5c925610c789e3e138972a49302c";
event.source = "ctyun.oss";
event.type = "oss:bucket:create-bucket";
event.subject = "ctyun.oss:huadong1:1234567891234:bucketname-xxx";
event.dataContentType = "application/json;charset=utf-8";
event.time = "2025-01-01T12:00:00Z";
event.data = eventData.c_str();
event.extensions["ctyuneventbusname"] = eventbusname;
// 发送事件
if (sendEvent(event, url, ak, sk, pathname, query, response)) {
cout << "Event sent successfully!" << endl;
} else {
cerr << "Failed to send event." << endl;
}
return 0;
}