资讯动态

使用 AWS SDK for C++ 操作 Amazon SNS:从 Hello World 到发布/订阅的完整代码示例实战指南

发布时间:2026/9/25 2:14:31 来源:尧图企业网站定制
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载Amazon Simple Notification ServiceAmazon SNS是 AWS 提供的全托管消息推送服务它让应用、终端用户与设备能够瞬时地从云端接收通知。本文以 cpp/example_code/sns/README.md 为骨架结合该目录下的全部 C 源码、构建脚本与 GoogleTest 测试系统讲解如何用 AWS SDK for C 完成 SNS 的建站、订阅、发布、短信配置等全部核心操作。读完本文你将掌握 10 个 SNS 单一操作接口的调用范式、Hello SNS 入门示例的分页处理技巧以及发布短信发布消息到队列等跨服务场景的完整实现路径。示例全景这份 README 能教会你什么该文档对应的示例代码位于 cpp/example_code/sns主题是使用 AWS SDK for C 与 Amazon SNS 服务交互。Amazon SNS 是发布/订阅pub/sub范式的典型实现发布者Publisher把消息发送到Topic主题SNS 负责把消息扇出fan-out给所有订阅者Subscriber——订阅者可以是 HTTP/HTTPS 端点、邮箱、AWS Lambda 函数、SQS 队列、移动应用终端等。从目录结构看示例被清晰地分为三类类别说明对应文件Hello 入门初始化 SNS 客户端并列出账号下所有 Topichello_sns/hello_sns.cpp单一操作Single actions调用单个服务 API 的代码摘录create_topic.cpp、delete_topic.cpp、get_sms_type.cpp、get_topic_attributes.cpp、list_subscriptions.cpp、list_topics.cpp、publish_to_topic.cpp、set_sms_type.cpp、subscribe_email.cpp、unsubscribe.cpp 等场景Scenarios多次调用服务函数完成一个具体任务发布短信、消息到队列、跨服务照片管理应用其中所有可复用的操作函数被统一声明在 sns_samples.h 的AwsDoc::SNS命名空间中每个函数都以bool返回值表示调用成败并统一接受Aws::Client::ClientConfiguration作为客户端配置参数——这是整个目录的公共 API 契约。运行前置条件与重要注意事项环境准备所有示例在运行前都必须完成 AWS SDK for C 的安装与配置包括安装并构建 SDK按 AWS SDK for C 官方Getting started文档完成 SDK 的下载、编译与环境变量配置即完成 Hello World 级别的 SDK 自检配置开发环境与凭据每个源文件的文件头注释都强调set up your development environment, including your credentials即需要配置 AWS 访问密钥Access Key / Secret Key可选指定区域所有示例的main函数中都保留了如下可取消注释的代码用于覆盖配置文件中的区域设置Aws::Client::ClientConfiguration clientConfig; // Optional: Set to the AWS Region (overrides config file). // clientConfig.region us-east-1;官方提醒的成本与安全事项文档明确列出四点运行警告编写生产代码时务必逐条核对可能产生费用运行示例代码以及运行测试都可能使你的 AWS 账户产生费用最小权限原则建议按least privilege授权只授予完成任务所需的最小权限集而不要直接使用管理员权限区域差异这些代码并未在所有 AWS 区域经过测试部署前应确认目标服务在你使用的区域可用短信沙箱限制首次使用 SNS 发送短信时账户处于 SMS sandbox短信沙箱状态只能向已验证的目的地手机号发送且如果目的地在美国还必须使用专用发起 IDorigination number。构建与运行读懂 CMake 与 run_ 前缀可执行文件构建系统约定CMakeLists.txt 展示了这类示例的标准构建方式要求CMake ≥ 3.13C 标准为C11默认构建共享库BUILD_SHARED_LIBS ON通过find_package(AWSSDK REQUIRED COMPONENTS sns)链接 AWS SDK 的 SNS 组件Windows 下会把 SDK 的 DLL 自动拷贝到构建目录便于直接调试运行支持用-DAWSDOC_SOURCExxx.cpp只构建指定文件对单个操作进行快速验证非常有用每个.cpp源文件会被编译成前缀为run_的可执行文件例如create_topic.cpp生成run_create_topic当开启-DBUILD_TESTSON时会额外进入tests子目录构建 GoogleTest 测试。运行规则文档给出的核心约定是每个源文件都会生成一个可执行文件命名规则是run_ 源文件名去掉后缀。例如要运行my_action.cpp在构建目录中执行./run_my_action命令运行后会提示所需的参数。每个示例的main函数都带有参数个数校验例如 create_topic.cpp 中int main(int argc, char **argv) { if (argc ! 2) { std::cout Usage: run_create_topic topic_name std::endl; return 1; }统一的程序骨架几乎每个示例都遵循同一套 SDK 生命周期管理模板Aws::SDKOptions options; Aws::InitAPI(options); // 全局初始化整个进程只应调用一次 { // 在此作用域内使用 SNSClient } Aws::ShutdownAPI(options); // 全局清理与 InitAPI 成对出现同时所有示例都用#ifndef TESTING_BUILD包裹main函数——当以测试模式构建即定义TESTING_BUILD宏时main会被排除从而允许测试代码直接调用AwsDoc::SNS命名空间下的函数。入门第一步Hello Amazon SNSListTopics入门示例 hello_sns/hello_sns.cpp 的目标是初始化 SNS 客户端并列出当前账号下的所有 Topic。它是理解 SDK 分页处理的极好素材Aws::SNS::SNSClient snsClient(clientConfig); Aws::VectorAws::SNS::Model::Topic allTopics; Aws::String nextToken; // Next token is used to handle a paginated response. do { Aws::SNS::Model::ListTopicsRequest request; if (!nextToken.empty()) { request.SetNextToken(nextToken); } const Aws::SNS::Model::ListTopicsOutcome outcome snsClient.ListTopics(request); if (outcome.IsSuccess()) { const Aws::VectorAws::SNS::Model::Topic paginatedTopics outcome.GetResult().GetTopics(); if (!paginatedTopics.empty()) { allTopics.insert(allTopics.cend(), paginatedTopics.cbegin(), paginatedTopics.cend()); } } else { std::cerr Error listing topics outcome.GetError().GetMessage() std::endl; return 1; } nextToken outcome.GetResult().GetNextToken(); } while (!nextToken.empty());这段代码有三个值得注意的设计点分页Pagination模式ListTopics默认返回有限条记录通过响应中的NextToken令牌循环请求下一页直到令牌为空——这是 AWS 列表类 API 的标准处理手法ListSubscriptions同样采用了此模式统一错误处理每次调用后用outcome.IsSuccess()判断成败失败时通过outcome.GetError().GetMessage()输出可读的错误信息并终止程序输出统计程序最终打印Hello Amazon SNS! You have N topics in your account.并逐行列出所有 Topic 的 ARN让新手立刻获得第一次成功调用 SNS的正反馈。单一操作Single actions十大 SNS API 逐个击破以下 10 个操作是文档列出的核心代码摘录每个都对应一个真实可运行的可执行文件。CreateTopic创建主题create_topic.cpp 展示了最基础的构造请求 → 调用客户端 → 检查结果三步范式bool AwsDoc::SNS::createTopic(const Aws::String topicName, Aws::String topicARNResult, const Aws::Client::ClientConfiguration clientConfiguration) { Aws::SNS::SNSClient snsClient(clientConfiguration); Aws::SNS::Model::CreateTopicRequest request; request.SetName(topicName); const Aws::SNS::Model::CreateTopicOutcome outcome snsClient.CreateTopic(request); if (outcome.IsSuccess()) { topicARNResult outcome.GetResult().GetTopicArn(); std::cout Successfully created an Amazon SNS topic topicName with topic ARN topicARNResult . std::endl; } else { std::cerr Error creating topic topicName : outcome.GetError().GetMessage() std::endl; topicARNResult.clear(); } return outcome.IsSuccess(); }关键点SetName只接受主题名称不是 ARN创建成功后返回的topicARNResult是后续所有操作订阅、发布、删除都要用到的主题 ARN。运行方式run_create_topic topic_name。DeleteTopic删除主题delete_topic.cpp 与创建对称只需在DeleteTopicRequest上SetTopicArn(topicARN)即可删除主题。注意删除主题会同时删除该主题的所有订阅是不可逆操作。运行方式run_delete_topic topic_arn。ListTopics 与 ListSubscriptions分页遍历资源list_topics.cpp 与 list_subscriptions.cpp 展示了两种略有差异的分页实现listTopics在循环体内逐页打印 ARNlistSubscriptions先把所有页的数据累积到Aws::VectorAws::SNS::Model::Subscription循环结束后统一打印并特判了无订阅的空结果场景No subscriptions found。运行方式run_list_topics、run_list_subscriptions均无参数。GetTopicAttributes查看主题属性get_topic_attributes.cpp 通过GetTopicAttributes读取主题的全部属性如订阅数、策略、DisplayName 等属性以Aws::MapAws::String, Aws::String键值对形式返回if (outcome.IsSuccess()) { std::cout Topic Attributes: std::endl; for (auto const attribute: outcome.GetResult().GetAttributes()) { std::cout * attribute.first : attribute.second std::endl; } }运行方式run_get_topic_attributes topic_arn前置条件为已存在的主题 ARN。与它同级的还有get_subscription_attributes.cpp查询订阅属性。Publish向主题发布消息publish_to_topic.cpp 是发布/订阅模型的核心——生产者侧Aws::SNS::Model::PublishRequest request; request.SetMessage(message); request.SetTopicArn(topicARN); const Aws::SNS::Model::PublishOutcome outcome snsClient.Publish(request); if (outcome.IsSuccess()) { std::cout Message published successfully with id outcome.GetResult().GetMessageId() . std::endl; }发布成功后服务端会返回MessageId可用于后续追踪与去重。运行方式run_publish_to_topic message_value topic_arn_value。Subscribe / Unsubscribe订阅与退订订阅端由三个文件分别演示三种投递协议subscribe_email.cpp协议为email端点填邮箱地址。注意Subscribe成功后返回的SubscriptionArn此时可能是PendingConfirmation状态需要收件人点击确认邮件后订阅才生效subscribe_app.cpp协议为移动应用端点endpoint ARN适用于移动推送场景subscribe_lambda.cpp协议为 AWS Lambda 函数 ARN实现SNS 触发 Lambda的事件驱动模式。三者都遵循同一模式request.SetTopicArn(topicARN)request.SetProtocol(...)request.SetEndpoint(...)。对应的unsubscribe.cpp只需在UnsubscribeRequest上设置订阅 ARN 即可退订。SetSMSAttributes / GetSMSAttributes短信配置管理短信场景下SNS 的默认设置通过账户级属性管理set_sms_type.cpp通过SetSMSAttributes写入DefaultSMSType属性参数取值为Transactional交易型高优先级、通常按条计费或Promotional营销型更便宜、可能延迟Aws::SNS::Model::SetSMSAttributesRequest request; request.AddAttributes(DefaultSMSType, smsType);get_sms_type.cpp通过GetSMSAttributes读取当前默认短信类型。源码注释特别提醒request.AddAttributes(DefaultSMSType)是为了只取这一个属性如果不加这一行会返回账户的全部短信设置//Set the request to only retrieve the DefaultSMSType setting. //Without the following line, GetSMSAttributes would retrieve all settings. request.AddAttributes(DefaultSMSType);运行方式run_set_sms_type sms_type、run_get_sms_type。场景Scenarios把 API 串成真实业务文档还列出了三个多函数协作的场景示例展示了 SNS 在实际架构中的常见用法。场景一发布短信文本消息publish_smspublish_sms.cpp 与向主题发布不同它绕开主题直接调用PublishRequest.SetPhoneNumber(phoneNumber)向指定手机号发短信。源码注释给出两个生产级限制E.164 格式手机号必须符合 E.164 国际格式例如美国号码形如12223334444短信沙箱新账户只能向已验证号码发送目的地在美国时还需专用发起 IDorigination number。运行方式run_publish_sms message_value phone_number_value。场景二把消息发布到 SQS 队列Topics and Queues文档描述该场景可完成以下流程创建主题FIFO 或非 FIFO 均可将多个 SQS 队列订阅到主题并可选应用消息过滤策略filter policy向主题发布消息轮询各队列确认消息被正确接收。完整实现位于 messaging_with_topics_and_queues.cpp它把 SNS 的CreateTopic、Subscribe、Publish与 SQS 的队列创建、轮询读取组合在一起是SNS 扇出到多个队列这一经典解耦架构的可运行范本。场景三无服务器照片管理应用Photo Asset Manager文档将跨服务示例 photo_asset_manager 也列为场景之一——它演示如何构建一个让用户按标签labels管理照片的无服务器应用。该应用体现了 SNS 在事件通知链中的实际价值照片上传、标签分析、通知推送等环节相互配合SNS 作为其中的消息枢纽承担解耦职责。测试GoogleTest 驱动的质量保障文档提供了标准的测试构建与执行流程cd BUILD_DIR cmake path-to-root-of-this-source-code -DBUILD_TESTSON make ctest测试代码位于 cpp/example_code/sns/tests从目录内容可以清晰地看出测试策略按操作划分的测试用例gtest_create_topic.cpp、gtest_delete_topic.cpp、gtest_list_topics.cpp、gtest_publish_to_topic.cpp、gtest_set_sms_type.cpp、gtest_subscribe_email.cpp、gtest_unsubscribe.cpp等与上文每个单一操作一一对应Mock 输入支持tests/mock_input/下存放了subscribe_app.xml、subscribe_email.xml、subscribe_lambda.xml等 XML 文件用于模拟不同订阅协议所需的参数输入统一测试入口test_main.cpp、sns_gtests.cpp/sns_gtests.h提供测试框架的组装与公共断言辅助无 main 参与正因为源码中main被TESTING_BUILD宏隔离测试代码才能直接复用AwsDoc::SNS命名空间中的真实函数实现既测函数逻辑、又不污染命令行入口的双重目的。结语与后续深入学习路径本文从 cpp/example_code/sns/README.md 出发完整梳理了 AWS SDK for C 操作 Amazon SNS 的整套示例体系统一的run_可执行文件约定、Hello 入门的分页范式、10 个单一操作 API、3 个跨服务场景以及基于 GoogleTest 的测试闭环。无论你是要搭建消息通知系统、实现短信告警还是构建主题→队列/Lambda的异步解耦架构这套示例都提供了可直接运行、可直接改造的参考实现。若想继续深入可以进一步研读该目录中的 sns_samples.h完整 API 声明、CMakeLists.txt构建细节以及跨服务的 topics_and_queues 场景 与 photo_asset_manager 应用。同时建议对照 Amazon SNS Developer Guide 与 Amazon SNS API Reference 查阅各请求/响应字段的完整取值范围以在实际项目中获得最大收益。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for C 操作 Amazon CloudWatch完整示例代码实战指南使用 AWS SDK for C 操作 Amazon CloudWatch完整示例代码实战指南 本指南以仓库 cpp/example_code/cloud示例工程教程后端使用 AWS SDK for C 操作 Amazon SQS完整代码示例与实战指南使用 AWS SDK for C 操作 Amazon SQS完整代码示例与实战指南 导读 本文以 AWS 文档代码示例仓库aws doc sdk exa示例工程教程后端使用 AWS SDK for C 操作 Amazon S3完整代码示例指南使用 AWS SDK for C 操作 Amazon S3完整代码示例指南 导读 本指南以 cpp/example_code/s3/README.md h示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑