此文章发布于64
个月前,部分信息可能已经过时
,请自行斟酌确认。
微软 Asp.net mvc web api
框架对参数的获取进行了特殊处理,详情请参考WebApi 参数详解。
看了上面文章后是不是觉得获取参数相当啰嗦,为了简化编程于是对获取请求参数做了封装。可以通过调用 GetParam()
方法获取参数。
封装代码
#region 参数获取
/// <summary>
/// 根据 Key 获取 Get 或 Post 请求参数,若参数不存在则抛出异常
/// </summary>
/// <param name="key">参数名,Post 请求需要 json 方式提交</param>
public string GetParam(string key)
{
var request = ((HttpContextBase)Request.Properties["MS_HttpContext"]).Request;
if (request.RequestType.ToUpper() == "POST")
{
if (request.ContentType.Contains("application/json"))
{
JObject jsonParam;
try
{
int dataLength = Convert.ToInt32(request.InputStream.Length);
byte[] bytes = new byte[dataLength];
request.InputStream.Position = 0; //读过一次后位置需要修改回0
request.InputStream.Read(bytes, 0, dataLength);
string requestStringData = Encoding.UTF8.GetString(bytes);
jsonParam = JObject.Parse(requestStringData);
}
catch
{
throw new Exception("参数不是合法的 Json 对象");
}
var v = jsonParam.GetValue(key);
if (v == null) { throw new ParamNotFoundException($"参数 {key} 未提供"); }
return v + "";
}
else
{
throw new Exception("Post 参数请使用 Json 提交");
}
}
else if (request.RequestType.ToUpper() == "GET")
{
var v = request.QueryString.Get(key);
if (v == null) { throw new ParamNotFoundException($"参数 {key} 未提供"); }
return v;
}
else
{
throw new Exception($"不支持从 {request.RequestType} 请求获取参数");
}
}
/// <summary>
/// 根据 Key 获取 Get 或 Post 请求参数,若参数不存在则返回设置的默认值
/// </summary>
/// <param name="key">参数名,Post 请求需要 json 方式提交</param>
/// <param name="defaultValue">参数不存在时返回的默认值</param>
public string GetParam(string key, string defaultValue)
{
string value;
try
{
value = GetParam(key);
}
catch (Exception ex)
{
//如果是参数没有找到异常则使用默认值
if (ex is ParamNotFoundException)
{
value = defaultValue;
}
//否则抛出异常
else
{
throw ex;
}
}
return value;
}
/// <summary>
/// 根据 Key 获取 Get 或 Post 请求参数,并转换为指定的类型,若参数不存在或类型转换失败均会抛出异常
/// </summary>
/// <param name="key">参数名,Post 请求需要 json 方式提交</param>
public T GetParam<T>(string key)
{
string value;
try
{
value = GetParam(key);
}
catch (Exception ex)
{
throw ex;
}
try
{
return (T)Convert.ChangeType(value, typeof(T));
}
catch (Exception)
{
throw new Exception($"参数 {key} 类型转换失败");
}
}
/// <summary>
/// 根据 Key 获取 Get 或 Post 请求参数,并转换为指定的类型,若参数不存在则返回设置的默认值,若类型转换失败则会抛出异常
/// </summary>
/// <param name="key">参数名,Post 请求需要 json 方式提交</param>
/// <param name="defaultValue">参数不存在时返回的默认值</param>
public T GetParam<T>(string key, T defaultValue)
{
string value;
try
{
value = GetParam(key);
}
catch (Exception ex)
{
//如果是参数没有找到异常则使用默认值
if (ex is ParamNotFoundException)
{
return defaultValue;
}
//否则抛出异常
else
{
throw ex;
}
}
try
{
return (T)Convert.ChangeType(value, typeof(T));
}
catch (Exception)
{
throw new Exception($"参数 {key} 类型转换失败");
}
}
#endregion
使用示例
注意:Post 请求需要使用 application/json 提交。
//获取name,不存在将抛出异常
string a = GetParam("name");
//获取type,不存在则使用默认值%
string b = GetParam("type", "%");
//获取pageIndex,并转换为int类型,不存在将抛出异常,给定的值不是int类型将抛出异常
int c = GetParam<int>("pageIndex");
//获取pageSize,并转换为int类型,不存在则使用默认值10,给定的值不是int类型将抛出异常
int d = GetParam<int>("pageSize", 10);