最近在做校内网的应用, 校内提供的.NET的API比较适合Web Forms, 而且代码太多.
我参考了PHP的版本, 写了一个C#版本的, 支持Web Forms和Win Forms, 而且很简洁.
- namespace CS.API
- {
- public static class XiaoNei
- {
- private static string HostAddress;
- private static string Apikey;
- private static string Secret;
- private static string Version;
- public static void Init(string apikey, string secret, string version="1.0")
- {
- if (HostAddress == null)
- {
- HostAddress = "http://api.xiaonei.com/restserver.do?";
- Apikey = apikey;
- Secret = secret;
- Version = version;
- }
- }
- public static JsonObject PostRequest(string method, string session, JsonObject _data)
- {
- JsonObject data = _data;
- if (data == null)
- {
- data = new JsonObject();
- }
- data["api_key"] = Apikey;
- data["call_id"] = DateTime.Now.Ticks;
- data["method"] = String.Format("xiaonei.{0}", method);
- data["format"] = "JSON";
- data["session_key"] = session;
- data["v"] = Version;
- List<string> items = new List<string>();
- foreach (KeyValuePair<string, object> item in data)
- {
- if (item.Value is JsonArray)
- items.Add(item.Key + "=" + Uri.EscapeDataString(String.Join<object>(",", (JsonArray)item.Value)));
- else
- items.Add(item.Key + "=" + Uri.EscapeDataString(item.Value.ToString()));
- }
- string[] keys = new string[data.Count];
- string sig = String.Empty;
- data.Keys.CopyTo(keys, 0);
- Array.Sort<string>(keys);
- foreach (string key in keys)
- {
- sig += String.Format("{0}={1}", key, data[key]);
- }
- sig += Secret;
- items.Add("sig=" + HashString(sig));
- string postText = String.Join<string>("&", items);
- string jsonText = null;
- using (System.Net.WebClient wc = new System.Net.WebClient())
- {
- wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
- wc.Encoding = Encoding.UTF8;
- jsonText = wc.UploadString(HostAddress, "POST", postText);
- }
- return JsonConvert.DeserializeObject("{/"data/":" + jsonText + "}");
- }
- private static string HashString(string sourceString)
- {
- using (MD5 md5 = MD5.Create())
- {
- byte[] source = md5.ComputeHash(Encoding.UTF8.GetBytes(sourceString));
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < source.Length; i++)
- {
- sb.Append(source[i].ToString("x2"));
- }
- return sb.ToString();
- }
- }
- }
- }
调用时很简单:
API.XiaoNei.Init(config["apikey"], config["secret"]);
JsonObject data = new JsonObject();
data["uids"] = "1001,1002,1003";
JsonObject users = API.XiaoNei.PostRequest("users.getInfo", session_key, data);