ASP.Net MVC Web API 获取参数方法封装,Post 从请求体中获取参数

此文章发布于 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);
最后修改:2019 年 08 月 13 日 10 : 47 AM
如果觉得我的文章对你有用,请随意赞赏

发表评论