一、方法介绍
1. request.query
得到一个FormsDict对象,该对象可以转化为字典,里面的内容是:{"name":"111","password":"cc"}
2.request.body
返回一个StringIO对象,通过read方法取出的数据是body里的所有值,不管body里是不是json该方法都原样返回body里的所 有内容。对本例而言是返回:{"name":"abc"}
3.request.query_string
它得到的是,url中?后面所有的值,最为一个字符串,即:wzd=111&abc=cc
4.request.form
有这么一个表单:

那么要获取username/password有如下方法:
方法一:
username = request.forms.get('username1') # 对应的是Username输入框中的name属性
password = request.forms.get('password1') # 对应的是password输入框中的name属性
方法二:
username = request.POST.get('username')
password = request.POST.get('password')
二、实际运用(.Net Core)
前端Vue调用: this.$http.post('/Base_Manage/Base_User/SaveData', this.entity).then(resJson => {})
注释:this.entity为表单生成的JSON
WebAPI:1.封装Json参数支持过滤器(方法):JsonParamterAttribute
实现如下:
/// <summary>
/// Json参数支持
/// </summary>
public class JsonParamterAttribute : BaseActionFilter, IActionFilter
{
/// <summary>
/// Action执行之前执行
/// </summary>
/// <param name="context">过滤器上下文</param>
public void OnActionExecuting(ActionExecutingContext context)
{
if (context.ContainsFilter<NoJsonParamterAttribute>())
return;
//参数映射:支持application/json
string contentType = context.HttpContext.Request.ContentType;
if (!contentType.IsNullOrEmpty() && contentType.Contains("application/json"))
{
//获取Action的所有参数
var actionParameters = context.ActionDescriptor.Parameters;
//获取过滤器上下文中的所有参数
var allParamters = HttpHelper.GetAllRequestParams(context.HttpContext);
//获取Action的参数及参数对象(比如:添加用户,控制器中的Action参数为User实体对
//象)
var actionArguments = context.ActionArguments;
//循环所有参数给对象中的属性赋值
actionParameters.ForEach(aParamter =>
{
string key = aParamter.Name;
if (allParamters.ContainsKey(key))
{
actionArguments[key] = allParamters[key]?.ToString()?.ChangeType_ByConvert(aParamter.ParameterType);
}
else
{
try
{
actionArguments[key] = allParamters.ToJson().ToObject(aParamter.ParameterType);
}
catch
{
}
}
});
}
}
}
获取所有参数的步骤实现:
/// <summary>
/// 获取所有请求的参数(包括get参数和post参数)
/// </summary>
/// <param name="context">请求上下文</param>
/// <returns></returns>
public static Dictionary<string, object> GetAllRequestParams(HttpContext context)
{
Dictionary<string, object> allParams = new Dictionary<string, object>();
var request = context.Request;
List<string> paramKeys = new List<string>();
var getParams = request.Query.Keys.ToList();
var postParams = new List<string>();
try
{
if (request.Method.ToLower() != "get")
postParams = request.Form.Keys.ToList();
}
catch
{
}
paramKeys.AddRange(getParams);
paramKeys.AddRange(postParams);
paramKeys.ForEach(aParam =>
{
object value = null;
if (request.Query.ContainsKey(aParam))
value = request.Query[aParam].ToString();
else if (request.Form.ContainsKey(aParam))
value = request.Form[aParam].ToString();
allParams.Add(aParam, value);
});
string contentType = request.ContentType?.ToLower() ?? "";
//若为POST的application/json
if (contentType.Contains("application/json"))
{
var stream = request.Body;
string str = stream.ReadToString(Encoding.UTF8);
if (!str.IsNullOrEmpty())
{
var obj = str.ToJObject();
foreach (var aProperty in obj)
{
allParams[aProperty.Key] = aProperty.Value;
}
}
}
return allParams;
}
本文详细介绍了HTTP请求的多种解析方式,包括使用request.query、request.body、request.query_string和request.form等方法,并深入探讨了在.NET Core环境下如何封装Json参数支持过滤器,实现前端Vue与后端WebAPI之间的高效数据交互。
629

被折叠的 条评论
为什么被折叠?



