# 发送单聊消息本文展示如何调用即时通讯 IM RESTful API 在服务端实现单聊场景中全类型消息的发送与接收,包括文本消息、图片消息、语音消息、视频消息、透传消息和自定义消息。
下表为各类型消息的发送说明:
消息类型
发送方式
备注
文本/透传消息
调用发送消息方法,在请求 body 中传入消息内容。
1.发送消息时,可选的 `from` 字段用于指定发送方。
2. 消息支持扩展属性 `ext`,可添加自定义信息。同时,推送通知也支持自定义扩展字段,详见 APNs 自定义显示和 Android 推送字段说明。
图片/语音/视频/文件消息
1. 调用文件上传方法上传图片、语音、视频或其他类型文件,并从响应 body 中获取文件 UUID。
2. 调用发送消息方法,在请求 body 中传入该 UUID。
单聊场景下,发送各类型的消息调用需调用同一 RESTful API,不同类型的消息只是请求体中的 body 字段内容存在差异。
提示
接口调用过程中,请求体和扩展字段的总长度不能超过 5 KB。通过 RESTful 接口发送的消息默认不写入会话列表,若需要此类消息写入会话列表,需要联系声网商务开通。发送频率:对于单个 app,该 REST API 存在以下三个限制:
100 次/秒/App ID。若超限,提示 429 错误。6000 条/分钟。若超限报 403 错误,即 "Forbidden for url: [XXXX/XXXX/messages/users]"600 人/次。例如,一次向 600 人发消息,视为 600 条消息。若超限,报 400 错误,即 "params to's size can't exceed limit"。# 前提条件要调用即时通讯 RESTful API,请确保满足以下要求:
已在声网控制台open in new window开通配置即时通讯 IM 服务。已从服务端获取 app token,详见 使用 Token 鉴权。了解即时通讯 IM API 的调用频率限制,详见 接口频率限制。# 公共参数# 请求参数参数类型是否必需描述hostString是即时通讯 IM 分配的用于访问 RESTful API 的域名。app_idString是声网为每个项目自动分配的 App ID,作为项目唯一标识。usernameString是用户 ID。# 响应参数参数类型描述actionString请求方法。uriString请求 URL。pathString请求路径,属于请求 URL 的一部分,开发者无需关注。timestampLongHTTP 响应的 Unix 时间戳,单位为毫秒。durationInt从发送 HTTP 请求到响应的时长,单位为毫秒。# 认证方式即时通讯 IM RESTful API 要求 Bearer HTTP 认证。每次发送 HTTP 请求时,都必须在请求头部填入如下 Authorization 字段:
Authorization: Bearer YourAppToken
为提高项目的安全性,声网使用 Token(动态密钥)对即将登录即时通讯系统的用户进行鉴权。即时通讯 IM RESTful API 推荐使用 app token 的 鉴权方式,详见 使用 Token 鉴权。
# 发送文本消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body下表为发送各类消息的通用请求体,为 JSON 对象,是所有消息的外层结构。不同类型的消息只是 body 字段内容存在差异。
参数类型是否必需描述fromString否消息发送方的用户 ID。若不传入该字段,服务器默认设置为 admin。 提示
1. 服务器不校验传入的用户 ID 是否存在,因此,如果你传入的用户 ID 不存在,服务器并不会提示,仍照常发送消息。2. 若传入字段但值为空字符串 (“”),请求失败。
toList是消息接收方的用户 ID 数组。每次最多可向 600 个用户发送消息。提示
服务器不校验传入的用户 ID 是否存在,因此,如果你传入的用户 ID 不存在,服务器并不会提示,仍照常发送消息。
typeString是消息类型: - txt:文本消息; - img:图片消息; - audio:语音消息; - video:视频消息; - file:文件消息; - loc:位置消息; - cmd:透传消息; - custom:自定义消息。bodyJSON是消息内容。body 包含的字段见下表说明。sync_deviceBool否消息发送成功后,是否将消息同步到发送方的所有在线设备。 - true:是; - (默认)false:否。roam_ignore_usersList否设置哪些用户拉漫游消息时拉不到该消息。routetypeString否若传入该参数,其值为 ROUTE_ONLINE,表示接收方只有在线时才能收到消息,若接收方离线则无法收到消息。若不传入该参数,无论接收方在线还是离线都能收到消息。extJSON否消息支持扩展字段,可添加自定义信息。不能对该参数传入 null。同时,推送通知也支持自定义扩展字段,详见 APNs 自定义显示 和 Android 推送字段说明。ext.em_ignore_notificationBool否是否发送静默消息: - true:是; - (默认)false:否。 发送静默消息指用户离线时,即时通讯 IM 服务不会通过第三方厂商的消息推送服务向该用户的设备推送消息通知。因此,用户不会收到消息推送通知。当用户再次上线时,会收到离线期间的所有消息。发送静默消息和免打扰模式下均为不推送消息,区别在于发送静默消息为发送方设置不推送消息,而免打扰模式为接收方设置在指定时间段内不接收推送通知。请求体中的 body 字段说明详见下表。
参数类型是否必需描述msgString是消息内容。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例发送给目标用户,消息无需同步给发送方:
# 将
curl -X POST -i 'https://XXXX/app-id/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "txt",
"roam_ignore_users": [],
"body": {
"msg": "testmessages"
},
"ext": {
"em_ignore_notification": true
}
}'
仅发送给在线用户,消息同步给发送方:
# 将
curl -X POST -i 'https://XXXX/app-id/XXXX/messages/users' \
-H 'Content-Type: application/json' -H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "txt",
"roam_ignore_users": [],
"body": {
"msg": "testmessages"
},
"ext": {
"em_ignore_notification": true
},
"routetype":"ROUTE_ONLINE",
"sync_device":true
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送图片消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述filenameString否图片名称。建议传入该参数,否则客户端收到图片消息时无法显示图片名称。secretString否图片的访问密钥,即成功上传图片后,从 文件上传 的响应 body 中获取的 share-secret。如果图片文件上传时设置了文件访问限制(restrict-access),则该字段为必填。sizeJSON否图片尺寸,单位为像素,包含以下字段: - height:图片高度; - width:图片宽度。urlString是图片 URL 地址:https://{host}/app-id/{app_id}/chatfiles/{file_uuid}。其中 file_uuid 为文件 ID,成功上传图片文件后,从 文件上传 的响应 body 中获取。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i 'https://XXXX/app-id/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "img",
"body": {
"filename":"testimg.jpg",
"secret":"VfXXXXNb_",
"url":"https://XXXX/app-id/XXXX/chatfiles/55f12940-XXXX-XXXX-8a5b-ff2336f03252",
"size": {
"width":480,
"height":720
}
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送语音消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述filenameString否语音文件的名称。建议传入该参数,否则客户端收到语音消息时无法显示语音文件名称。secretString否语音文件访问密钥,即成功上传语音文件后,从 文件上传 的响应 body 中获取的 share-secret。 如果语音文件上传时设置了文件访问限制(restrict-access),则该字段为必填。LengthInt否语音时长,单位为秒。urlString是语音文件 URL 地址:https://{host}/app-id/{app_id}/chatfiles/{file_uuid}。file_uuid 为文件 ID,成功上传语音文件后,从 文件上传 的响应 body 中获取。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i 'https://XXXX/app-id/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "audio",
"body": {
"url": "https://XXXX/XXXX/XXXX/chatfiles/1dfc7f50-XXXX-XXXX-8a07-7d75b8fb3d42",
"filename": "testaudio.amr",
"length": 10,
"secret": "HfXXXXCjM"
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送视频消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述filenameString否文件名称。建议传入该参数,否则客户端收到视频消息时无法显示视频文件名称。thumbString否视频缩略图 URL 地址:https://{host}/app-id/{app_id}/chatfiles/{file_uuid}。file_uuid 为视频缩略图唯一标识,成功上传缩略图文件后,从 文件上传 的响应 body 中获取。lengthInt否视频时长,单位为秒。secretString否视频文件访问密钥,即成功上传视频文件后,从 文件上传 的响应 body 中获取的 share-secret。如果视频文件上传时设置了文件访问限制(restrict-access),则该字段为必填。file_lengthLong否视频文件大小,单位为字节。thumb_secretString否视频缩略图访问密钥,即成功上传视频文件后,从 文件上传 的响应 body 中获取的 share-secret。如果缩略图文件上传时设置了文件访问限制(restrict-access),则该字段为必填。urlString是视频文件 URL 地址:https://{host}/app-id/{app_id}/chatfiles/{file_uuid}。其中 file_uuid 为文件 ID,成功上传视频文件后,从 文件上传 的响应 body 中获取。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i 'https://XXXX/app-id/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "video",
"body": {
"filename" : "test.avi",
"thumb" : "https://XXXX/app-id/XXXX/chatfiles/67279b20-7f69-11e4-8eee-21d3334b3a97",
"length" : 0,
"secret":"VfXXXXNb_",
"file_length" : 58103,
"thumb_secret" : "ZyXXXX2I",
"url" : "https://XXXX/app-id/XXXX/chatfiles/671dfe30-XXXX-XXXX-ba67-8fef0d502f46"
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送文件消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述filenameString否文件名称。建议传入该参数,否则客户端收到文件消息时无法显示文件名称。secretString否文件访问密钥,即成功上传文件后,从 文件上传 的响应 body 中获取的 share-secret。如果文件上传时设置了文件访问限制(restrict-access),则该字段为必填。urlString是文件 URL 地址:https://{host}/app-id/{app_id}/chatfiles/{file_uuid}。其中 file_uuid 为文件 ID,成功上传视频文件后,从 文件上传 的响应 body 中获取。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i 'https://XXXX/app-id/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "file",
"body": {
"filename":"test.txt",
"secret":"1-g0XXXXua",
"url": "https://XXXX/app-id/XXXX/chatfiles/d7eXXXX7444"
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送位置消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述latString是位置的纬度,单位为度。lngString是位置的经度,单位为度。addrString是位置的文字描述。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i "https://XXXX/app-id/XXXX/messages/users" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "loc",
"body": {
"lat": "39.966",
"lng":"116.322",
"addr":"中国北京市海淀区中关村"
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送透传消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述actionString是命令内容。# HTTP 响应# 响应 body如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i "https://XXXX/app-id/XXXX/messages/users" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization:Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "cmd",
"body":{
"action":"action1"
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 发送自定义消息# HTTP 请求POST https://{host}/app-id/{app_id}/messages/users
# 路径参数参数及说明详见 公共参数。
# 请求 header参数类型是否必需描述Content-TypeString是内容类型。请填 application/json。AcceptString是内容类型。请填 application/json。AuthorizationString是App 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。# 请求 body关于通用请求体,详见发送文本消息。
请求体中的 body 字段说明详见下表。
参数类型是否必需描述customEventString否用户自定义的事件类型。该参数的值必须满足正则表达式 [a-zA-Z0-9-_/\.]{1,32},长度为 1-32 个字符。customExtsJSON否用户自定义的事件属性,类型必须是 Map
参数类型描述dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。其他参数及说明详见 公共参数。
如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。
# 示例# 请求示例# 将
curl -X POST -i "https://XXXX/app-id/XXXX/messages/users" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H "Authorization:Bearer
-d '{
"from": "user1",
"to": ["user2"],
"type": "custom",
"body": {
"customEvent": "custom_event",
"customExts":{
"ext_key1":"ext_value1"
}
}
}'
# 响应示例{
"path": "/messages/users",
"uri": "https://XXXX/XXXX/XXXX/messages/users",
"timestamp": 1657254052191,
"action": "post",
"data": {
"user2": "1029457500870543736"
},
"duration": 0
}
# 错误码调用发送单聊消息的接口发送各类消息时,如果返回的 HTTP 状态码非 200,表示请求失败,可能提示以下错误码:
HTTP 状态码错误类型错误提示可能原因处理建议400invalid_request_bodyRequest body is invalid. Please check body is correct.请求体格式不正确。检查请求体内容是否合法(字段类型是否正确) 。400message_send_errorparam from can't be empty请求参数 from 是空字符串。输入正确的请求参数 from。若不传该字段, 服务器会默认设置为 admin。400message_send_errorparam to can't be empty请求参数 to 是空数组。输入正确的请求参数 to。400message_send_errorparam type can't be empty请求参数 type 是空字符串。输入正确的请求参数 type。400message_send_errorparam body can't be empty请求参数 body 是空 JSON。输入正确的请求参数 body。400message_send_errorparam ext must be JSONObject请求参数 ext 类型不正确。输入正确的请求参数 ext(JSON 格式)。400message_send_errorparams to's size can't exceed limit 600请求参数 to 数量超出最大限制 600。输入正确的请求参数 to(数量限制在 600 以内),即每次最多可向 600 人发送消息。400message_send_errormessage is too large请求体内容中 body 和 ext 字段的内容过大。限制 body 和 ext 字段的内容。请求体和扩展字段的总长度不能超过 5 KB。403message_send_errormessage send reach limit消息发送频率超出限制(默认 60 秒内只允许发送 6000 条单聊消息)。限制消息发送频率,详见文档说明。关于其他错误,你可以参考 响应状态码 了解可能的原因。