你好,我们最近尝试使用LeanCloud的即时通讯实现弹幕的效果,是使用RN写的,用到js的sdk。
我们使用的流程是:使用我们的php后台调用RestFul的建立聊天室接口创建房间,返回给客户端,客户端根据这个服务器从RestFul接口拿回来的roomId进行发送弹幕。还有就是服务器也会使用RestFul的聊天室的发送消息接口进行一些类似系统消息之内的发送。但是发现这二者的发送,到了接受者哪里,接受的数据格式不一样的,而且,使用RestFul接口接受的数据中的'data'字段无法取出。具体代码如下:
1. 创建聊天室
https://kugb5lxu.api.lncld.net/1.2/rtm/chatrooms
这个接口创建是正常的。
- 客户端加入聊天室
this.leanCloud是IMClient实例
this.leanCloud.then(user => {
return user.getConversation(groupId);
}).then(conv => {
return conv.join();
}).then(res => {
Log.i("加入群组" + groupId + "成功");
return res;
}).catch(e => {
Log.i("加入群组" + groupId + "失败" + e);
});
- 客户端发送弹幕
const param = {};
param[CMD] = CMD_VALUE_DANMAKU;
param.sender = UserUtil.getInstance().uid();
param.receiver = groupId;
param.timeStamp = new Date().valueOf();
const content = {};
content.text = text;
content.action = 0;
param.content = content;
Log.i("发送的弹幕json内容是==>" + JSON.stringify(param));
return this.leanCloud.then(user => {
return user.getConversation(groupId);
}).then(conv => {
return conv.join();
}).then(conv => {
return conv.send(new TextMessage(JSON.stringify(param)));
}).then(result => {
Log.i("发送弹幕成功");
return result;
}).catch(e => {
Log.i("发送弹幕失败");
throw e;
});
- 客户端接受消息
this.leanCloud.then(user => {
user.on(Event.MESSAGE, (message, conversation) => {
Log.i("接受消息成功,开始分发,message = " + JSON.stringify(message));
const { data, text, id, cid, from } = message;
Log.i("解析结果= " + data + ",text" + text + ",id" + id + ",cid=" + cid + ",from=" + from);
callback && callback.onReceive(message.data.text);
});
});
- 服务器发送消息,使用RestFul接口
https://dxskm6sw.api.lncld.net/1.2/rtm/chatrooms/5b373d3567f3560037a77989/messages
//body内容如下
{
"from_client": "0",
"message":"{\"cmd\": 3, \"sender\": \"0\", \"receiver\": \"5b373d3567f3560037a77989\", \"timeStamp: 0, \"content\": { \"action\": 0, \"content\": \"这是系统弹幕\" }}"
}
截图如下
然后下面就是问题所在:
使用js接受弹幕返回的数据格式是:
{
"id": "s3Dup731SUacYxXTB7dBfA",
"cid": "5b373d3567f3560037a77989",
"from": "hhhj",
"timestamp": "2018-07-01T01:57:38.178Z",
"updatedAt": "2018-07-01T01:57:38.178Z",
"mentionList": [],
"mentionedAll": false,
"mentioned": false,
"type": -1,
"text": "{\"cmd\":3,\"sender\":\"hhhj\",\"receiver\":\"5b373d3567f3560037a77989\",\"timeStamp\":1530410257093,\"content\":{\"text\":\"Home发送弹幕\",\"action\":0}}",
"summary": "{\"cmd\":3,\"sender\":\"hhhj\",\"receiver\":\"5b373d3567f3560037a77989\",\"timeStamp\":1530410257093,\"content\":{\"text\":\"Home发送弹幕\",\"action\":0}}"
}
这是接受到正常的,可以按照demo中的message.text取出来。
但是,使用ResuFul接口发送的数据接受如下
{
"id": "xHdOEH3ROgbj67mfb1csws",
"cid": "5b373d3567f3560037a77989",
"from": "0",
"timestamp": "2018-07-01T02:02:02.369Z",
"updatedAt": "2018-07-01T02:02:02.369Z",
"mentionList": [],
"mentionedAll": null,
"mentioned": false,
"data": "{\"cmd\": 3, \"sender\": \"0\", \"receiver\": \"5b373d3567f3560037a77989\", \"timeStamp: 0, \"content\": { \"action\": 0, \"content\": \"这是系统弹幕\" }}"
}
这里并不是text
,而是变成了data
,而且,该data无论如何也取不出来,无论是结构赋值,或者是使用.
操作符,还是[]
操作符,但是使用JSON去打印message找那个却可以看到。
这个ReetFul发送的接口数据取不出来那我怎么用...,请问我该如何处理,是否需要我提供什么key配合呢?
谢谢