通过 HTTP POST 发布 MQTT 消息

最近更新时间:2026-02-02 17:48:22

我的收藏

概述

消息队列 MQTT 版支持客户端通过 HTTP(s) POST 方式发布 MQTT 消息。
该方式支持 HTTP 1.0和1.1协议。
每成功调用一次本接口,都会计算为一次消息TPS,从而影响您的计费,具体可参见 价格说明

授权

HTTP POST 方式与 WebSocket 类似,需经过 ACL 授权流程。如果使用 HTTP 1.0协议,每次发送都会执行完整的 CONNECT,PUBLISH 流程,也会执行对应的鉴权、授权操作。

使用方法

URL 示例

http(s)://${instance-access-point}/topics/${url-encoded-topic-name}?qos=${qos}&retained=${retained}&client_id=${ClientId}&username=${Username}
instance-access-point、qos、retained、client_id、username 等字段,具体定义见下文 请求参数

认证方式

目前支持 Basic HTTP Authentication 和基于 X.509 证书的“一机一证”两种认证方式,暂未支持基于 JWT 的认证方式。

Basic HTTP Authentication

进行基本认证过程中的参数如下:
请求的HTTP头字段会包含Authorization字段,形式如下: Authorization: Basic <credentials>
<credentials> = username:passwordBase64 编码。
username 会参与 ACL 授权。

BYOC(基于 X.509 证书认证)

客户端信任的根证书:CA.crt
客户端证书链文件:client.chain.crt
客户端私钥文件:client.pkcs8.key

请求参数

参数
语义
示例值
可选
instance-access-point
实例接入点地址,从 消息队列 MQTT 版 控制台 单击资源管理 > 集群管理 > 实例 ID 进入基本信息页面获取。
mqtt-example-sh-public.mqtt.tencenttdmq.com
url-encoded-topic-name
要发送的 Topic 名称,URL encoded。
home
QoS
发送 MQTT 消息时选择 QoS,默认值为1,即 at-least-once。
1
Retained
发送的消息是否是 retained 消息。
false
client_id
使用 client-id 发送 MQTT 消息,参与授权验证。
如果在一机一证场景,使用证书 Common Name 字段。
其它场景默认值是 http-${connection-id}。
curl001
username
连接、发送时使用的用户名,参与授权验证。
如果使用 Basic Authentication Header,取 Basic Authentication Header 中的用户名部分。
SampleUser
ResponseTopic
sample/response/topic
CorrelationData
SN0001
ContentType
application/json
PayloadFormatIndicator
1
MessageExpiryInterval
Message Expiry Interval, 单位: 秒
3600
UserProp.N.Key
设置第 N 个用户属性 Key 值, 必须和 UserProp.N.Value成对使用
sampleKey
UserProp.N.Value
设置第 N 个用户属性 Value 值,必须和 UserProp.N.Key成对使用
sampleValue

返回说明

Response Headers

Header
语义
示例值
X-Message-Id
MQTT 服务端对本条消息的标识符
A9FE1FEF7EE614DAD5DC8EA6C1A60000

状态码(Status Code)

状态码(Status Code)
说明
200
请求处理成功。
400
服务端无法处理该请求,一般缺少必要字段。可能原因包括:
URL path不正确;
Topic Name 不合法;
QoS 不合法;
Retained 值不合法;
401
认证、授权错误。
405
服务端不支持该 HTTP Method;请使用 POST 方法进行消息发送。
429
短时间发送太多消息,超过 MQTT 实例规格对应配额。
500
服务端内部错误。

请求示例

示例 1

使用 Basic Authentication(缺省 username )
curl --verbose --request POST -H "Authorization: Basic dXNlcjA6c2VjcmV0MA==" --data "{ \\"message\\": \\"Hello, world\\" }" "http://mqtt.cloud.tencent.com/topics/home?qos=1&client_id=curl-x&retained=false"
样例输出
* Host mqtt.cloud.tencent.com:80 was resolved.
* Connected to mqtt.cloud.tencent.com (::1) port 80
* using HTTP/1.x
> POST /topics/home?qos=1&client_id=curl-x&retained=false HTTP/1.1
> Host: mqtt.cloud.tencent.com
> User-Agent: curl/8.12.1
> Accept: */*
> Authorization: Basic dXNlcjA6c2VjcmV0MA==
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 29 bytes
< HTTP/1.1 200 OK
< X-Message-Id: A9FE1FEF7EE614DAD5DC8EA6C1A60000
< content-length: 0
<
* Connection #0 to host mqtt.cloud.tencent.com left intact

示例 2

使用 Basic Authentication(指定 username)
curl --verbose -k --request POST -H "Authorization: Basic dXNlcjA6c2VjcmV0MA==" --data "{ \\"message\\": \\"Hello, world\\" }" "https://mqtt.cloud.tencent.com/topics/home?qos=1&client_id=curl-x&retained=true&username=sample-user"

示例3

使用 BYOC 证书认证
curl --tlsv1.2 \\
--cacert CA.crt \\
--cert client.chain.crt \\
--key client.pkcs8.key \\
--verbose \\
--request POST \\
--data "{ \\"message\\": \\"Hello, world\\" }" \\
"https://mqtt.cloud.tencent.com/topics/home?qos=1"