发送单聊消息

大约 19 分钟

发送单聊消息

本文展示如何调用环信 IM RESTful API 在服务端实现单聊场景中全类型消息的发送与接收,包括文本消息、图片消息、语音消息、视频消息、透传消息和自定义消息。

下表为各类型消息的发送说明:

消息类型

发送方式

备注

文本/透传消息

调用发送消息方法,在请求 body 中传入消息内容。

1.发送消息时,可选的 `from` 字段用于指定发送方。

2. 消息支持扩展属性 `ext`,可添加自定义信息。同时,推送通知也支持自定义扩展字段,详见 APNs 自定义显示Android 推送字段说明

图片/语音/视频/文件消息

1. 调用文件上传方法上传图片、语音、视频或其他类型文件,并从响应 body 中获取文件 UUID。

2. 调用发送消息方法,在请求 body 中传入该 UUID。

 

单聊场景下,发送各类型的消息调用需调用同一 RESTful API,不同类型的消息只是请求体中的 body 字段内容存在差异。

提示

在接口调用过程中,请求体若超过 5 KB 会导致 413 错误,需要拆成几个较小的请求体重试。同时,请求体和扩展字段的总长度不能超过 3 KB。

发送频率:通过 RESTful API 单个应用每分钟最多可发送 6000 条消息,每次最多可向 600 人发送。例如,一次向 600 人发消息,视为 600 条消息。

前提条件

要调用环信即时通讯 REST API,请确保满足以下要求:

公共参数

请求参数

参数类型是否必需描述
hostString访问 RESTful API 的域名或服务器信息。
-公有云集成为 环信即时通讯控制台的 即时通讯->服务概览页面下的 域名配置- Rest Api
-私有化集成为部署后 服务器地址:端口
org_nameString每个公司(组织)分配的唯一标识。详见 环信即时通讯控制台的 应用概览->应用详情页面下的 应用信息-Orgname
app_nameString创建应用时填入的应用名称。详见 环信即时通讯控制台的 应用概览->应用详情页面下的 应用信息-Appname
usernameString用户 ID。

响应参数

参数类型描述
actionString请求方法。
organizationString环信即时通讯 IM 为每个公司(组织)分配的唯一标识,与请求参数 org_name 相同。
applicationString应用在系统内的唯一标识。该标识由系统生成,开发者无需关心。
applicationNameString你在环信即时通讯云控制台创建应用时填入的应用名称,与请求参数 app_name 相同。
uriString请求 URL。
pathString请求路径,属于请求 URL 的一部分,开发者无需关注。
timestampLongHTTP 响应的 Unix 时间戳,单位为毫秒。
durationInt从发送 HTTP 请求到响应的时长,单位为毫秒。

认证方式

环信即时通讯 REST API 要求 Bearer HTTP 认证。每次发送 HTTP 请求时,都必须在请求头部填入如下 Authorization 字段:

Authorization: Bearer YourAppToken

为提高项目的安全性,环信使用 Token(动态密钥)对即将登录即时通讯系统的用户进行鉴权。本文涉及的所有消息管理 REST API 都需要使用 App Token 的鉴权方式,详见 使用 App Token 鉴权

发送文本消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

下表为发送各类消息的通用请求体,为 JSON 对象,是所有消息的外层结构。不同类型的消息只是 body 字段内容存在差异。

参数类型是否必需描述
fromString消息发送方的用户 ID。若不传入该字段,服务器默认设置为管理员,即 “admin”;若传入字段但值为空字符串 (“”),请求失败。
toList消息接收方的用户 ID 数组。每次最多可向 600 个用户发送消息。
typeString消息类型:
- txt:文本消息;
- img:图片消息;
- audio:语音消息;
- video:视频消息;
- file:文件消息;
- loc:位置消息;
- cmd:透传消息;
- custom:自定义消息。
bodyJSON消息内容。body 包含的字段见下表说明。
sync_deviceBool消息发送成功后,是否将消息同步到发送方。
- true:是;
- (默认)false:否。
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,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例

发送给目标用户,消息无需同步给发送方:

# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i 'https://XXXX/XXXX/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <YourAppToken>'  \
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "txt",
  "body": {
    "msg": "testmessages"
    },
  "ext": {
      "em_ignore_notification": true
    }
  }'

仅发送给在线用户,消息同步给发送方:

# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i 'https://XXXX/XXXX/XXXX/messages/users' \
-H 'Content-Type: application/json' -H 'Accept: application/json' \
-H 'Authorization: Bearer <YourAppToken>' \
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "txt",
  "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,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送图片消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

关于通用请求体,详见发送文本消息

请求体中的 body 字段说明详见下表。

参数类型是否必需描述
filenameString图片名称。
secretString图片的访问密钥,即成功上传图片后,从 文件上传 的响应 body 中获取的 share-secret。如果图片文件上传时设置了文件访问限制(restrict-access),则该字段为必填。
sizeJSON图片尺寸,单位为像素,包含以下字段:
- height:图片高度;
- width:图片宽度。
urlString图片 URL 地址:https://{host}/{org_name}/{app_name}/chatfiles/{file_uuid}。其中 file_uuid 为文件 ID,成功上传图片文件后,从 文件上传 的响应 body 中获取。

HTTP 响应

响应 body

如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:

参数类型描述
dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。
例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。

其他参数及说明详见 公共参数

如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例

# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i 'https://XXXX/XXXX/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \ 
-H 'Authorization: Bearer <YourAppToken>'\ 
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "img",
  "body": {
    "filename":"testimg.jpg",
    "secret":"VfXXXXNb_",
    "url":"https://XXXX/XXXX/XXXX/chatfiles/55f12940-XXXX-XXXX-8a5b-ff2336f03252",
    "size": {
      "width":480,
      "height":720
    }
  }
}'

响应示例

{
  "path": "/messages/users",
  "uri": "https://XXXX/XXXX/XXXX/messages/users",
  "timestamp": 1657254052191,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送语音消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

关于通用请求体,详见发送文本消息

请求体中的 body 字段说明详见下表。

参数类型是否必需描述
filenameString语音文件的名称。
secretString语音文件访问密钥,即成功上传语音文件后,从 文件上传 的响应 body 中获取的 share-secret。 如果语音文件上传时设置了文件访问限制(restrict-access),则该字段为必填。
LengthInt语音时长,单位为秒。
urlString语音文件 URL 地址:https://{host}/{org_name}/{app_name}/chatfiles/{file_uuid}file_uuid 为文件 ID,成功上传语音文件后,从 文件上传 的响应 body 中获取。

HTTP 响应

响应 body

如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:

参数类型描述
dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。
例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。

其他参数及说明详见 公共参数

如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例
# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i 'https://XXXX/XXXX/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <YourAppToken>' \
-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,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送视频消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

关于通用请求体,详见发送文本消息

请求体中的 body 字段说明详见下表。

参数类型是否必需描述
thumbString视频缩略图 URL 地址:https://{host}/{org_name}/{app_name}/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}/{org_name}/{app_name}/chatfiles/{file_uuid}。其中 file_uuid 为文件 ID,成功上传视频文件后,从 文件上传 的响应 body 中获取。

HTTP 响应

响应 body

如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:

参数类型描述
dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。
例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。

其他参数及说明详见 公共参数

如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例
# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i 'https://XXXX/XXXX/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <YourAppToken>' \
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "video",
  "body": {
    "thumb" : "https://XXXX/XXXX/XXXX/chatfiles/67279b20-7f69-11e4-8eee-21d3334b3a97",
    "length" : 0,
    "secret":"VfXXXXNb_",
    "file_length" : 58103,
    "thumb_secret" : "ZyXXXX2I",
    "url" : "https://XXXX/XXXX/XXXX/chatfiles/671dfe30-XXXX-XXXX-ba67-8fef0d502f46"
  }
}'

响应示例

{
  "path": "/messages/users",
  "uri": "https://XXXX/XXXX/XXXX/messages/users",
  "timestamp": 1657254052191,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送文件消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

关于通用请求体,详见发送文本消息

请求体中的 body 字段说明详见下表。

参数类型是否必需描述
filenameString文件名称。
secretString文件访问密钥,即成功上传文件后,从 文件上传 的响应 body 中获取的 share-secret。如果文件上传时设置了文件访问限制(restrict-access),则该字段为必填。
urlString文件 URL 地址:https://{host}/{org_name}/{app_name}/chatfiles/{file_uuid}。其中 file_uuid 为文件 ID,成功上传视频文件后,从 文件上传 的响应 body 中获取。

HTTP 响应

响应 body

如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:

参数类型描述
dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。
例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。

其他参数及说明详见 公共参数

如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例
# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i 'https://XXXX/XXXX/XXXX/messages/users' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <YourAppToken>' \
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "file",
  "body": {
    "filename":"test.txt",
    "secret":"1-g0XXXXua",
    "url": "https://XXXX/XXXX/XXXX/chatfiles/d7eXXXX7444"
  }
}'

响应示例

{
  "path": "/messages/users",
  "uri": "https://XXXX/XXXX/XXXX/messages/users",
  "timestamp": 1657254052191,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送位置消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 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,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例

# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i "https://XXXX/XXXX/XXXX/messages/users"  \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer <YourAppToken>' \
-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,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送透传消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

关于通用请求体,详见发送文本消息

请求体中的 body 字段说明详见下表。

参数类型是否必需描述
actionString命令内容。

HTTP 响应

响应 body

如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:

参数类型描述
dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。
例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。

其他参数及说明详见 公共参数

如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例

# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i "https://XXXX/XXXX/XXXX/messages/users" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'  \
-H "Authorization:Bearer <YourAppToken>" \
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "cmd",
  "body":{
    "action":"action1"
  }
}'

响应示例

{
  "path": "/messages/users",
  "uri": "https://XXXX/XXXX/XXXX/messages/users",
  "timestamp": 1657254052191,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}

发送自定义消息

HTTP 请求

POST https://{host}/{org_name}/{app_name}/messages/users

路径参数

参数及说明详见 公共参数

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationStringApp 管理员的鉴权 token,格式为 Bearer YourAppToken,其中 Bearer 为固定字符,后面为英文空格和获取到的 app token。

请求 body

关于通用请求体,详见发送文本消息

请求体中的 body 字段说明详见下表。

参数类型是否必需描述
customEventString用户自定义的事件类型。该参数的值必须满足正则表达式 [a-zA-Z0-9-_/\.]{1,32},长度为 1-32 个字符。
customExtsJSON用户自定义的事件属性,类型必须是 Map<String,String>,最多可以包含 16 个元素。customExts 是可选的,不需要可以不传。

HTTP 响应

响应 body

如果返回的 HTTP 状态码为 200,表示请求成功,响应 body 包含如下字段:

参数类型描述
dataJSON响应中的数据详情。该字段的值为包含接收方用户 ID 和 发送的消息的 ID 的键值对。
例如 "user2": "1029457500870543736",表示向 user2 发送了消息 ID 为 1029457500870543736 的消息。

其他参数及说明详见 公共参数

如果返回的 HTTP 状态码非 200,表示请求失败。你可以参考 响应状态码 了解可能的原因。

示例

请求示例

# 将 <YourAppToken> 替换为你在服务端生成的 App Token

curl -X POST -i "https://XXXX/XXXX/XXXX/messages/users" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \ 
-H "Authorization:Bearer <YourAppToken>" \
-d '{
  "from": "user1",
  "to": ["user2"],
  "type": "custom",
  "body": {
    "customEvent": "custom_event"
  }
}'

响应示例

{
  "path": "/messages/users",
  "uri": "https://XXXX/XXXX/XXXX/messages/users",
  "timestamp": 1657254052191,
  "organization": "XXXX",
  "application": "e82bcc5f-XXXX-XXXX-a7c1-92de917ea2b0",
  "action": "post",
  "data": {
    "user2": "1029457500870543736"
  },
  "duration": 0,
  "applicationName": "XXXX"
}
上次编辑于: