||
最近因为一个项目使用友盟推送,在网上一番查找,相关文章很少,最贴切的贴出源代码的仅有来自友盟的BBS社区 (http://bbs.umeng.com/forum.php?mod=viewthread&tid=6324),因此参照此代码改写。不过,里面使用的Json Serilization 实在是有点过于绕弯子了,而且会多次转义。因此我贴出一个简化版,希望能让接下来的人少走点弯路。
改进部分:构造JSON,并序列化为String。
附: 原推送代码网址。
具体代码如下:
public string umeng_send_noti(string[] tokens, string title, string message)
{
int timestamp = ConvertDateTimeInt(DateTime.Now);
string validationToken = GetMD5(appkey + master_secrete + timestamp.ToString());
var payload = new
{
display_type = "notification",
body = new
{
ticker = title,
title = title,
text = message,
after_open = "go_app"
}
};
var send_data = new
{
appkey = appkey,
timestamp = timestamp,
validation_token = validationToken,
type = "listcast",
device_tokens = string.Join(",", tokens),
payload = payload
};
var send_data_json_string = ServiceStack.Text.JsonSerializer.SerializeToString(send_data, send_data.GetType());
var result = HttpPost(api_send_url, send_data_json_string);
return result;
}
private string HttpPost(string Url, string postDataStr)
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(Url);
request.Method = "POST";
// request.ContentType = "application/json";
// request.Headers.Set("Pragma", "no-cache");
byte[] postdata = Encoding.UTF8.GetBytes(postDataStr);
request.ContentLength = postdata.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(postdata, 0, postdata.Length);
reqStream.Close();
}
try
{
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}
catch (System.Net.WebException ex)
{
System.Net.HttpWebResponse res = (System.Net.HttpWebResponse)ex.Response;
Stream myResponseStream = res.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
throw ex;
}
}
/// <summary>
/// DateTime时间格式转换为Unix时间戳格式
/// </summary>
/// <param name="time"> DateTime时间格式</param>
/// <returns>Unix时间戳格式</returns>
public static int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
return (int)(time - startTime).TotalSeconds;
}
/// 计算MD5
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public string GetMD5(String s)
{
if (string.IsNullOrEmpty(s)) return "";
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
bytes = md5.ComputeHash(bytes);
md5.Clear();
StringBuilder strReturn = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
strReturn.Append(Convert.ToString(bytes[i], 16).PadLeft(2, '0'));
}
return strReturn.ToString().PadLeft(32, '0');
}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 15:30
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社