前言
近期收到用户反馈在测试IM SDK过程中,使用TIMMsgSendNewMsg接口发送图片消息时返回6006错误码,并且提示http request failed错误描述。用户反馈不清楚问题产生的原因以及如何解决。本文详细分析原因及解决办法(本文以Windows 平台下 IM SDK 进行分析)。
问题描述
TIMMsgSendNewMsg是IM SDK中提供的一个发消息接口,利用这个接口,可以实现发送多种消息,例如可以发送文本消息、表情消息、位置消息、图片消息、声音消息、自定义消息等。具体调用规则:
具体接口说明可以参考文档:https://cloud.tencent.com/document/product/269/33549。
当需要发送图片消息时,调用此接口时应该传入ImageElem结构化的数据:
ImageElem的数据结构描述可参考:https://cloud.tencent.com/document/product/269/33553#imageelem。
云工程师收到一位用户在使用此接口过程反馈会遇到接口返回6006错误的错误,具体提示如下图:
用户不清楚此问题发生的原因和解决办法,用户提到比较多的疑问点如下:
- 登录正常,而且已经可以发文本类型的消息,发送方和接收方都能正常收到文本类型的消息,就是发送文件或图片报错。
- 有些用户在更换计算机环境后,此问题解决。
从以上现象可以初步分析:此问题应该和客户端配置网络的参数有关,并非是后台问题。那么这类问题应该如何排查呢?
原因分析及解决方案
TIMMsgSendNewMsg发送图片消息时,会比发送文本消息多一步上传图片的过程:sdk会先将图片资源上传到cos服务器,然后再将消息内容提交到IM后台。
图片消息交互流程:
在上传cos服务器过程中,sdk使用http接口进行上传图片,在这一步可以设置http proxy参数,具体设置方法如下。
Http Proxy设置方式:
Json::Value json_http_proxy;
json_http_proxy[kTIMHttpProxyInfoIp] = "http://http-proxy.xxxxx.com ";
json_http_proxy[kTIMHttpProxyInfoPort] = 8888;
Json::Value json_config;
json_config[kTIMSetConfigHttpProxyInfo] = json_http_proxy;
if (TIM_SUCC != TIMSetConfig(json_config.toStyledString().c_str(), [](int32_t code, const char* desc, const char* json_param, const void* user_data) {
// 回调内部
}, this)) {
// TIMSetConfig 接口调用失败
}
TIMSetConfig一般在应用初始化进程调用,当调用此参数设置http proxy后,后续调用TIMMsgSendNewMsg函数进行图片消息发送时,都会将在此设置的http proxy代理参数做为调用上传图片的http proxy。
返回6006错误原因及解决办法:
当使用TIMSetConfig设置了错误了的http proxy,就会导致上述错误的发生。部分用户因为copy从别的应用中直接copy代码,未对TIMSetConfig内参数进行修改,实际设置的http proxy 并不一个有效的http proxy,导致了上述问题的发生,并且此问题比较隐蔽,不易排查。
在了解发送图片消息的原理后,这个问题的解决就很简单了。使用TIMSetConfig设置正确的http proxy参数即可。当然如果机器所在网络不需要使用http proxy,可以不设置kTIMSetConfigHttpProxyInfo参数。
总结
IM产品功能十分强大,因此配置参数也较复杂,在遇到报错的时候,如果能深入理解sdk和后台交互的工作原理,那么对解决问题可以起到事半功倍的效果。