关于环信.net服务端demo的一点补充(解决出错无法返回json格式的问题)
前段时间做基于.net的环信服务端开发 。
.net的demo链接地址如下:
https://github.com/easemob/emchat-server-examples/blob/master/emchat-server-dotnet/EaseMobDemo.cs
发现示例demo有一个比较关键的问题没有解决,
就是EaseMobDemo的public string ReqUrl(string reqUrl, string method, string paramData, string token)
这个函数,如果stream流读取resp发生错误的话,无法返回json类型的字符串,而是直接400,500之类的错误,
结果无法获得json字符串格式。
例如:注册用户时,如果用户已经存在,按照原来的代码
会返回 {"远程服务器返回错误: (400) 错误的请求。"}
这个不是json格式,无法用程序反序列化。
后来发现Java的服务端demo,如果出错是可以返回json格式的错误代码。
向环信客服咨询,也没人知道怎么做。
经过研究把代码做了一下修改,前面代码不变,只是把错误捕捉的部分作了修改,增加了一个函数
public string ReqUrl(string reqUrl, string method, string paramData, string token)
{
try
{
HttpWebRequest request = WebRequest.Create(reqUrl) as HttpWebRequest;
request.Method = method.ToUpperInvariant();
request.ContentType = "application/json";
if (!string.IsNullOrEmpty(token) && token.Length > 1)
{
request.Headers.Add("Authorization", "Bearer" +" "+ token);
}
if (request.Method.ToString().Trim() != "GET" && !string.IsNullOrEmpty(paramData) && paramData.Length > 0)
{
byte buffer = Encoding.UTF8.GetBytes(paramData);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
{
using (StreamReader stream = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
{
return stream.ReadToEnd();
}
}
}
catch (WebException e)
{
return GetErrorInfo(e);
}
}
///
/// 增加此方法,用户可以返回json格式错误。
///
///
///
private string GetErrorInfo(WebException ex)
{
string errorinfo = "";
HttpWebResponse resp = (HttpWebResponse)ex.Response;
if (ex.Status == WebExceptionStatus.ProtocolError)
{
using (StreamReader streamreader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
{
errorinfo = streamreader.ReadToEnd();
}
}
return errorinfo;
}
这样就是发生错误,也返回json格式。
以下是注册已经存在的用户,错误返回格式
{
"error":"duplicate_unique_property_exists",
"timestamp":1452661004439,
"duration":0,
"exception":"org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException",
"error_description":"Application fbd110b0-884d-11e5-8f9c-e94cec2e0ad0 Entity user requires that property named username be unique, value of fan exists"
}
为其他开发者少走弯路,提供一定的参考。
.net的demo链接地址如下:
https://github.com/easemob/emchat-server-examples/blob/master/emchat-server-dotnet/EaseMobDemo.cs
发现示例demo有一个比较关键的问题没有解决,
就是EaseMobDemo的public string ReqUrl(string reqUrl, string method, string paramData, string token)
这个函数,如果stream流读取resp发生错误的话,无法返回json类型的字符串,而是直接400,500之类的错误,
结果无法获得json字符串格式。
例如:注册用户时,如果用户已经存在,按照原来的代码
会返回 {"远程服务器返回错误: (400) 错误的请求。"}
这个不是json格式,无法用程序反序列化。
后来发现Java的服务端demo,如果出错是可以返回json格式的错误代码。
向环信客服咨询,也没人知道怎么做。
经过研究把代码做了一下修改,前面代码不变,只是把错误捕捉的部分作了修改,增加了一个函数
public string ReqUrl(string reqUrl, string method, string paramData, string token)
{
try
{
HttpWebRequest request = WebRequest.Create(reqUrl) as HttpWebRequest;
request.Method = method.ToUpperInvariant();
request.ContentType = "application/json";
if (!string.IsNullOrEmpty(token) && token.Length > 1)
{
request.Headers.Add("Authorization", "Bearer" +" "+ token);
}
if (request.Method.ToString().Trim() != "GET" && !string.IsNullOrEmpty(paramData) && paramData.Length > 0)
{
byte buffer = Encoding.UTF8.GetBytes(paramData);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
using (HttpWebResponse resp = request.GetResponse() as HttpWebResponse)
{
using (StreamReader stream = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
{
return stream.ReadToEnd();
}
}
}
catch (WebException e)
{
return GetErrorInfo(e);
}
}
///
/// 增加此方法,用户可以返回json格式错误。
///
///
///
private string GetErrorInfo(WebException ex)
{
string errorinfo = "";
HttpWebResponse resp = (HttpWebResponse)ex.Response;
if (ex.Status == WebExceptionStatus.ProtocolError)
{
using (StreamReader streamreader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
{
errorinfo = streamreader.ReadToEnd();
}
}
return errorinfo;
}
这样就是发生错误,也返回json格式。
以下是注册已经存在的用户,错误返回格式
{
"error":"duplicate_unique_property_exists",
"timestamp":1452661004439,
"duration":0,
"exception":"org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException",
"error_description":"Application fbd110b0-884d-11e5-8f9c-e94cec2e0ad0 Entity user requires that property named username be unique, value of fan exists"
}
为其他开发者少走弯路,提供一定的参考。