1.为测试Rest API发送实时消息,下载leanchat代码后修改appid及appkey为自己所建立的测试应用所属的appid及appkey
2.将修改后的leanchat安装到手机中,并注册了两个用户
3.后台使用Apache的HttpClient调用Rest API,在两用户之间建立会话,然后获取产生的会话ID
4.再使用发送消息API的地址,建立新的HttpPost对象,指定appid,appkey以及master key,按照API所规定的数据格式传递数据,执行后,后台http状态码返回200,显示成功。但是手机端未能接收到任何消息,在lean cloud的控制台实时消息统计中能够获取消息数量。

以下为实时消息部分的代码:

public static void realTimeMessage(String convUrl,String msgUrl,String from,String to,String appId,String appKey,String message){

    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost(convUrl);

        post.setHeader("X-AVOSCloud-Application-Id", appId);
        post.setHeader("X-AVOSCloud-Application-Key", appKey);
        post.setHeader("Content-Type", "application/json");

        String conversion = "{\"name\":\"会话\",\"m\":[\""+from+"\",\""+to+"\"],\"c\":\""+to+"\",\"attr\":{\"type\":0}}";
        StringEntity se = new StringEntity(conversion, "UTF-8");
        se.setContentType("application/json");
        post.setEntity(se);

        HttpResponse response = httpClient.execute(post);
        if(response.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED) {
            StringBuilder result = new StringBuilder();
            HttpEntity entity = response.getEntity();
            InputStream inputStream = entity.getContent();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

            BufferedReader reader = new BufferedReader(inputStreamReader);
            String line = null;
            while (((line = reader.readLine()) != null)) {
                result.append(line);
            }
            reader.close();

            JSONObject jsonObject = JSONObject.parseObject(result.toString());
            String convId = jsonObject.getString("objectId");
            if(StringUtils.isNotBlank(convId)){
                HttpPost postMsg = new HttpPost(msgUrl);
                httpClient = new DefaultHttpClient();
                postMsg.setHeader("X-AVOSCloud-Application-Id", appId);
                postMsg.setHeader("X-AVOSCloud-Application-Key", appKey);
                postMsg.setHeader("X-AVOSCloud-Master-Key", "ja4yh15bo6xuhq6gi74o0npfgf13dja7y1n7pfkzilhfz07p");
                postMsg.setHeader("Content-Type", "application/json");


                String msgData = "{\"from_peer\": \""+from+"\",\"message\": \""+message+"\", \"conv_id\": \""+convId+"\",\"transient\": false}";
                StringEntity msg = new StringEntity(msgData, "UTF-8");
                msg.setContentType("application/json");
                postMsg.setEntity(msg);

                HttpResponse msgResp = httpClient.execute(postMsg);
                if(msgResp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    StringBuilder msgRespResult = new StringBuilder();
                    HttpEntity msgEntity = msgResp.getEntity();
                    InputStream msgInputStream = msgEntity.getContent();
                    InputStreamReader msgInputStreamReader = new InputStreamReader(msgInputStream);

                    BufferedReader msgReader = new BufferedReader(msgInputStreamReader);
                    String line1 = null;
                    while (((line1 = msgReader.readLine()) != null)) {
                        msgRespResult.append(line1);
                    }
                    msgReader.close();
                    System.out.println(msgRespResult.toString());
                }
            }
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

你好 一定避免在公开场合将 master key 贴出来
另外创建的会话在 Conversation 表中能看到吗?通过这个接口:https://leancloud.cn/docs/realtimerest_api.html#获取某个对话的聊天记录 是否能看到聊天记录呢?

获取聊天记录是可以获取到信息的,后来经过多次测试,发现lean-chat app后台报错,出现类转换错误,消息是一个JSON字符串,而被强制转换成String,报出ClassCast异常,问题出在AVSessionWebSocketListener的onDirectCommand方法中,Rest API是正确的。

肯定有人理的,我先看一下这个问题

按照如下格式再去发送试一下,https://leancloud.cn/docs/realtime_rest_api.html#文本消息

其中的 message 包含 _lctype 与 _lctext 两个字段即可

我测试过直接传递文本,也测试过您说的这种格式。获取应用的聊天记录可以找到我发送的所有消息,有纯文本,有{"lctype":-1,"lctext":"这是一个纯文本消息"}这种格式。在lean chat获取消息记录的时候AVSessionWebSocketListener的onDirectCommand第一行就取得msg信息,结果碰到{"lctype":-1,"lctext":"这是一个纯文本消息"}格式出现ClassCast异常,提示com.alibaba.JSONObject不能转换为String。onDirectCommand的第一行类似String msg = (String)map.get("msg");碰到上面提到的JSON串格式的时候,这个强转就出现问题了。
我觉得既然能通过获取聊天记录的api获得正确的信息,那发送消息的API应该没有错。只是说在app端读取消息并显示的那块有点问题。您有源码,建议您调试下,看是否是我提到的问题。在发此贴之前,我仔细的看过API文档,完全按照格式来测试多次都无法在app中显示出来。

好的,我现在试一下看看 msg 如果为 json 时是否会出现问题

1、sdk 的版本号是多少?
2、可以把具体的 log 以及相关的代码给我发送以下么?我这边发送了以下 json 格式的字符串,暂未发现问题

复现的此问题,首先应该按照如下格式发送消息 https://leancloud.cn/docs/realtime_rest_api.html#文本消息10
其次应该注意发送的数据不应该为 json,可以手动转为字符串。

 JSONObject object = new JSONObject();
 object.put("from_peer", from);
 object.put("conv_id", convId);
 object.put("transient", false);

 JSONObject msgJson = new JSONObject();
 msgJson.put("_lctype", -1);
 msgJson.put("_lctext", "文本消息");
 object.put("message", msgJson.toString());
 StringEntity msg = new StringEntity(object.toString(), "UTF-8");
 msg.setContentType("application/json");
 postMsg.setEntity(msg);

如此发送即可,如果将其中的改为object.put("message", msgJson);即会出错。
至于 android sdk 我看一下是否应该兼容

您好,leanchat 案例中自带的sdk版本号,如下:
compile 'com.android.support:support-v4:21.0.3'

compile 'cn.leancloud.android:avoscloud-sdk:v3.1+'
compile 'cn.leancloud.android:avoscloud-push:v3.1+@aar'

compile files('libs/prettytime-3.2.5.Final.jar')
compile 'cn.leancloud.android:Java-WebSocket:1.2.0-leancloud'
compile 'com.loopj.android:android-async-http:1.4.6'
compile 'cn.leancloud.android:fastjson:1.1.37-leancloud'
compile 'org.apache.httpcomponents:httpmime:4.2.4'
compile 'de.greenrobot:eventbus:2.4.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'

您好,刚才按照您的格式又测试了一下,成功了,感谢支持,主要是格式不对造成的

看样子你是创建了新的 conversation, Leancloud 没有做限制,两个同样的 id 可以创建多个 conversation
你应该调用 restapi 有问题,造成了创建多个 conversation,按照你的意思应该是只需要创建一个 conversation
可以把具体 restapi 的代码贴出来么?或者可以参考文档看一下自己的代码
https://leancloud.cn/docs/realtime_rest_api.html#创建一个对话2
https://leancloud.cn/docs/realtime_rest_api.html#文本消息5

这个问题已经解决了,每次都创建一个新的会话,所以造成了多个conv_id,十分感谢!