大幅度简化服务器调用,例如:
public class UserService
{
private const string userLogin_url = "/api/userlogin";
/// <summary>
/// 用户登录
/// </summary>
public static User UserLogin(string userName, string password)
{
Dictionary<string, string> args = new Dictionary<string, string>()
{
{ "user_name", userName },
{ "pwd", password }
};
var user = ServiceCore.ServiceRequest<User>(userLogin_url, Method.POST, args);
return user;
}
}
代码:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
public class ServiceCore
{
private const int HTTP_TIME_OUT = 30000; // HTTP请求超时时间
private const string API_SIGN_KEY = "API签名密钥"; // API签名密钥
//API URL
private static string resourceUrl;
public static readonly IsoDateTimeConverter TIME_CONVERTER = new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
#region 公共方法
/// <summary>
/// API服务地址
/// </summary>
public static void InitService(string url)
{
resourceUrl = url;
}
/// <summary>
/// 请求服务器(泛型)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="args"></param>
/// <returns></returns>
public static T ServiceRequest<T>(string url, Method method, Dictionary<string, string> args)
{
RestRequest request = GetRequest(url, method, args);
return ServiceResult<T>(request);
}
/// <summary>
/// 请求服务器(用于上传,返回是否成功)
/// </summary>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="args"></param>
/// <returns></returns>
public static bool ServiceRequest(string url, Method method, Dictionary<string, string> args)
{
RestRequest request = GetRequest(url, method, args);
return ServiceResult(request);
}
/// <summary>
/// 服务器请求结果(泛型)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="request"></param>
/// <returns></returns>
public static T ServiceResult<T>(RestRequest request)
{
try
{
var client = new RestClient(resourceUrl);
var response = client.Execute(request);
if (response.StatusCode == HttpStatusCode.OK)
{
ServiceResult<T> result = JsonConvert.DeserializeObject<ServiceResult<T>>(response.Content);
if (result.Code == ServiceCode.SYS_INVOKE_SUCCESS)
{
return result.Data;
}
else
{
return default(T);
}
}
else
{
throw new Exception(response.ErrorMessage);
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 服务器请求结果(用于上传,返回是否成功)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="request"></param>
/// <returns></returns>
public static bool ServiceResult(RestRequest request)
{
try
{
var client = new RestClient(resourceUrl);
var response = client.Execute(request);
if (response.StatusCode == HttpStatusCode.OK)
{
ServiceResult result = JsonConvert.DeserializeObject<ServiceResult>(response.Content);
if (result.Code == ServiceCode.SYS_INVOKE_SUCCESS)
{
return true;
}
else
{
return false;
}
}
else
{
throw new Exception(response.ErrorMessage);
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 私有方法
/// <summary>
/// 获取request
/// </summary>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="args"></param>
/// <returns></returns>
private static RestRequest GetRequest(string url, Method method, Dictionary<string, string> args)
{
string timestamp = ServiceHelper.DateTimeToJsDate(DateTime.UtcNow).ToString();
args.Add("ts", timestamp);
string sign = GetSign(args);
// 组装Request
RestRequest request = new RestRequest(url, method);
request.Timeout = HTTP_TIME_OUT;
request.AddHeader("ts", timestamp);
request.AddHeader("sign", sign);
foreach (var arg in args)
{
if (arg.Key != "ts")
request.AddParameter(arg.Key, arg.Value);
}
return request;
}
/// <summary>
/// 根据参数字典获取参数Sign
/// </summary>
/// <param name="args">参数字典</param>
/// <param name="secretKey">参数签名密钥</param>
private static string GetSign(Dictionary<string, string> args)
{
string sign = string.Empty;
if (args != null)
{
// 排序参数字典
Dictionary<string, string> afterArgs = args.OrderBy(element => element.Key).ToDictionary(o => o.Key, p => p.Value);
StringBuilder builder = new StringBuilder();
builder.Append(API_SIGN_KEY);
foreach (var item in afterArgs)
{
builder.Append(item.Key);
builder.Append(item.Value);
}
builder.Append(API_SIGN_KEY);
sign = ServiceHelper.MD5(builder.ToString());
}
return sign;
}
#endregion
}