主题+HttpEndpoint使用手册__Python SDK_SDK使用手册_消息服务-阿里云
本文档介绍如何使用python sdk中的sample代码,完成创建主题、创建订阅、启动 HttpEndpoint、发布消息、查看HttpEndpoint接收消息和删除主题操作。
1. 准备
- 下载最新版python sdk,解压后进入mns_python_sdk子目录;
- 打开sample.cfg文件,配置AccessKeyID、AccessKeySecret和Endpoint;
- AccessKeyId、AccessKeySecret
- 访问阿里云API的密钥对;
- 如果使用主账号访问,登陆阿里云 AccessKey 管理页面创建、查看;
- 如果使用子账号访问,请登录阿里云访问控制控制台查看;
- Endpoint
- 访问MNS的接入地址,登陆MNS控制台 单击右上角 获取Endpoint 查看;
- 不同地域的接入地址不同;
- SecurityToken
- 阿里云访问控制服务提供的短期访问权限凭证,直接使用阿里云账号或者子账号访问不需要配置该项,了解详情;
- AccessKeyId、AccessKeySecret
- 进入sample目录,后续使用的脚本都在这里;
2. 创建主题
运行 createtopic.py 创建主题;
默认创建的主题名称是 MySampleTopic,也可以通过参数指定主题名称;
主题详细信息请参考详情;
- 运行
$python createtopic.py MyTopic1
Create Topic Succeed! TopicName:MyTopic1
- 核心代码
endpoint,accid,acckey和token从第1步的配置文件中读取;
#init my_account, my_topic
my_account = Account(endpoint, accid, acckey, token)
topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
my_topic = my_account.get_topic(topic_name)
#you can get more information of TopicMeta from mns/topic.py
topic_meta = TopicMeta()
try:
topic_url = my_topic.create(topic_meta)
print "Create Topic Succeed! TopicName:%sn" % topic_name
except MNSExceptionBase, e:
if e.type == "TopicAlreadyExist":
print "Topic already exist, please delete it before creating or use it directly."
sys.exit(0)
print "Create Topic Fail! Exception:%sn" % e
3. 启动 HttpEndpoint
运行 simple_http_notify_endpoint.py 启动 HttpEndpoint;
脚本启动后,输出该脚本的监听地址,这个地址后续作为创建订阅的Endpoint参数,用于接收 MNS 推送消息的请求;
服务器功能
- 对 MNS 推送消息请求做签名验证,如果错误,返回MNS 403;
- 解析推送请求的 body,打印到日志中,如果解析错误,返回MNS 400;
- 如果验权和解析 body 均正常,返回 MNS 201;
运行
$python simple_http_notify_endpoint.py
Start Endpoint! Address: https://10.101.161.37:8080
由于 simple_http_notify_endpoint.py 的代码较多,请直接查看sdk 中的源码。
4. 创建订阅
运行 subscribe.py 创建订阅;
第一个参数指定接收消息的 HttpEndpoint,使用第3步中脚本输出的Address;
第二个参数指定订阅的主题名称,如果第2步中指定了主题名称,这里同样指定主题名称;
第三个参数指定订阅的名称,默认是 MySampleTopic-Sub;
订阅详细信息请参考详情;
- 运行
$python subscribe.py https://10.101.161.37:8080 MyTopic1 MyTopic1-Sub1
Create Subscription Succeed! TopicName:MyTopic1 SubName:MyTopic1-Sub1 Endpoint:https://10.101.161.37:8080
- 核心代码
endpoint,accid,acckey和token从第1步的配置文件中读取;
sub_endpoint = sys.argv[1]
#init my_account, my_topic, my_sub
my_account = Account(endpoint, accid, acckey, token)
topic_name = sys.argv[2] if len(sys.argv) > 2 else "MySampleTopic"
my_topic = my_account.get_topic(topic_name)
sub_name = sys.argv[3] if len(sys.argv) > 3 else "MySampleTopic-Sub"
my_sub = my_topic.get_subscription(sub_name)
#you can get more information of SubscriptionMeta from mns/subscription.py
sub_meta = SubscriptionMeta(sub_endpoint)
try:
topic_url = my_sub.subscribe(sub_meta)
print "Create Subscription Succeed! TopicName:%s SubName:%s Endpoint:%sn" % (topic_name, sub_name, sub_endpoint)
except MNSExceptionBase, e:
if e.type == "TopicNotExist":
print "Topic not exist, please create topic."
sys.exit(0)
elif e.type == "SubscriptionAlreadyExist":
print "Subscription already exist, please unsubscribe or use it directly."
sys.exit(0)
print "Create Subscription Fail! Exception:%sn" % e
5. 发布消息
运行publishmessage.py 发布多条消息到主题中;
如果第2步中指定了主题名称,这里同样通过第一个参数指定主题名称;
消息详细信息请参考详情;
- 运行
$python publishmessage.py MyTopic1
==========Publish Message To Topic==========
TopicName:MyTopic1
MessageCount:3
Publish Message Succeed. MessageBody:I am test message 0. MessageID:F6EA56633844DBFC-1-154BDFB8059-200000004
Publish Message Succeed. MessageBody:I am test message 1. MessageID:F6EA56633844DBFC-1-154BDFB805F-200000005
Publish Message Succeed. MessageBody:I am test message 2. MessageID:F6EA56633844DBFC-1-154BDFB8062-200000006
- 核心代码
endpoint,accid,acckey和token从第1步的配置文件中读取;
#init my_account, my_topic
my_account = Account(endpoint, accid, acckey, token)
topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
my_topic = my_account.get_topic(topic_name)
#publish some messages
msg_count = 3
print "%sPublish Message To Topic%snTopicName:%snMessageCount:%sn" % (10*"=", 10*"=", topic_name, msg_count)
for i in range(msg_count):
try:
msg_body = "I am test message %s." % i
msg = TopicMessage(msg_body)
re_msg = my_topic.publish_message(msg)
print "Publish Message Succeed. MessageBody:%s MessageID:%s" % (msg_body, re_msg.message_id)
except MNSExceptionBase,e:
if e.type == "TopicNotExist":
print "Topic not exist, please create it."
sys.exit(1)
print "Publish Message Fail. Exception:%s" % e
6. 查看 HttpEndpoint 接收消息
第5步发布了多条消息到主题中,MNS 会将发布的消息推送给第3步启动的 HttpEndpoint;
HttpEndpoint 在接收到消息推送请求后,会记录两种日志:access_log 和 endpoint_log;
- access log
- 启动 HttpEndpoint 的地方会打印access log,显示推送消息请求的基本信息,从左往右依次是:
RequestTime RequestVersion ReturnCode URI HTTPVersion RequestLength Host Agent MNSRequestID MNSVersion
- 除打印到屏幕上,access log会写到日志文件中,文件名格式是access_log.$port,本文档对应的日志文件是access_log.8080;
- 第5步发布消息对应的推送请求access log如下:
- 启动 HttpEndpoint 的地方会打印access log,显示推送消息请求的基本信息,从左往右依次是:
$python simple_http_notify_endpoint.py
Start Endpoint! Address: https://10.101.161.37:8080
[17/May/2016 17:10:56]"POST" "201" "/notifications" "HTTP/1.1" "495" "10.101.161.37:8080" "Aliyun Notification Service Agent" "573AE020B2B71CFC6801A6EF" "2015-06-06"
[17/May/2016 17:10:56]"POST" "201" "/notifications" "HTTP/1.1" "495" "10.101.161.37:8080" "Aliyun Notification Service Agent" "573AE020B2B71CFC6801A712" "2015-06-06"
[17/May/2016 17:10:56]"POST" "201" "/notifications" "HTTP/1.1" "495" "10.101.161.37:8080" "Aliyun Notification Service Agent" "573AE020B2B71CFC6801A704" "2015-06-06"
- endpoint log
- 记录每个请求的详细信息,包含完整的header、body以及解析后消息各属性的信息;
- 日志的文件名格式是 endpoint_log.$port,本文档对应的日志文件是endpoint_log.8080
- 第5步发布消息对应的推送请求的endpoint log如下:
$cat endpoint_log.8080
...
[2016-05-17 17:10:56] [root] [INFO] [simple_http_notify_endpoint.py:47] [1096657216] Notify Message Succeed!
MessageMD5 : 075C3D4AEB2D2F2D6A4C17C9D6DBBEBB
TopicOwner : 1269128356620446
PublishTime : 1463476256857
Subscriber : 1269128356620446
MessageTag :
SubscriptionName : MyTopic1-Sub1
MessageId : F6EA56633844DBFC-1-154BDFB8059-200000004
Message : I am test message 0.
TopicName : MyTopic1
[2016-05-17 17:10:56] [root] [INFO] [simple_http_notify_endpoint.py:47] [1123260736] Notify Message Succeed!
MessageMD5 : 3BCFB142A3CC597F5D409BFE9DB1B885
TopicOwner : 1269128356620446
PublishTime : 1463476256866
Subscriber : 1269128356620446
MessageTag :
SubscriptionName : MyTopic1-Sub1
MessageId : F6EA56633844DBFC-1-154BDFB8062-200000006
Message : I am test message 2.
TopicName : MyTopic1
[2016-05-17 17:10:56] [root] [INFO] [simple_http_notify_endpoint.py:47] [1112770880] Notify Message Succeed!
MessageMD5 : 8356BC7FFBD22CC971BE7FF7427202B6
TopicOwner : 1269128356620446
PublishTime : 1463476256863
Subscriber : 1269128356620446
MessageTag :
SubscriptionName : MyTopic1-Sub1
MessageId : F6EA56633844DBFC-1-154BDFB805F-200000005
Message : I am test message 1.
TopicName : MyTopic1
7. 删除主题
运行deletetopic.py 删除主题;
如果第2步中指定了主题名称,这里同样通过第一个参数指定主题名称;
- 运行
$python deletetopic.py MyTopic1
Delete Topic Succeed! TopicName:MyTopic1
- 核心代码
#init my_account, my_topic
my_account = Account(endpoint, accid, acckey, token)
topic_name = sys.argv[1] if len(sys.argv) > 1 else "MySampleTopic"
my_topic = my_account.get_topic(topic_name)
try:
my_topic.delete()
print "Delete Topic Succeed! TopicName:%sn" % topic_name
except MNSExceptionBase, e:
print "Delete Topic Fail! Exception:%sn" % e
最后更新:2016-11-23 17:16:08
上一篇:
并发测试示例代码__Java SDK_SDK使用手册_消息服务-阿里云
下一篇:
主题+QueueEndpoint使用手册__Python SDK_SDK使用手册_消息服务-阿里云
添加后端服务器__实例管理_用户指南_负载均衡-阿里云
图片鉴黄异步调用接口__智能图片鉴黄API_内容检测API文档_阿里绿网-阿里云
发送消息__队列消息操作_快速入门_消息服务-阿里云
数据转发到DataHub__规则引擎_控制台使用手册_阿里云物联网套件-阿里云
阿里云总裁胡晓明:帮助企业完成技术创新,做有温度的阿里云
发布服务__使用说明_用户手册_云服务总线 CSB-阿里云
签名算法参考__OpenAPI使用手册_云监控-阿里云
新购__购买实例_购买指南_云服务器 ECS-阿里云
删除指定的 ECU__资源管理类 API_Open API 参考_企业级分布式应用服务 EDAS-阿里云
发送定时消息__Java SDK_TCP 接入(专业)_消息队列 MQ-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云