在.NET Core控制器中获取AJAX传递的Body参数
.Net Core是支持前后端不分离式的开发的,如果在原始系统中采用不分离式开发,后面需要在原系统中增加功能,并且新的服务采用其他语言开发,且系统原来功能保持原样,这样前端系统可以单独调用新开发的接口。
但是,如果该系统涉及到权限控制,因为Net Core前后端不分离可以获取到用户的登录信息,但是新的服务没有此功能,无法获取到用户的权限信息,这时就需要通过Net Core转调一次接口才行。
前端代码如下
$.ajax({url: '/your/action',type: 'POST',contentType: 'application/json',data: JSON.stringify({ property1: 'value1', property2: 'value2' }),success: function(response) {console.log(response);}
});
1. 使用FromBody特性
这是最推荐的方式,适用于JSON格式的请求体:
[HttpPost]
public IActionResult YourAction([FromBody] YourModel model)
{// 直接使用model对象// 调用其他语言写的接口return Ok();
}public class YourModel
{public string Name { get; set; }public int Age { get; set; }
}
2. 动态类型接收
如果不确定参数结构或想使用动态类型:
[HttpPost]
public IActionResult YourAction([FromBody] dynamic data)
{string value1 = data.property1;string value2 = data.property2;// 调用其他语言写的接口return Ok();
}
3. 直接从Request.Body读取
对于更复杂的场景,可以手动读取请求体:
[HttpPost]
public async Task<IActionResult> YourAction()
{// 启用缓冲(如果还没有启用)Request.EnableBuffering();// 获取原始请求体Request.Body.Position = 0;using (var reader = new StreamReader(Request.Body)){// 获取Body参数var body = await reader.ReadToEndAsync();// 调用其他语言写的接口}return Ok();
}
4. 使用JObject解析
使用Newtonsoft.Json的JObject:
[HttpPost]
public IActionResult YourAction([FromBody] JObject data)
{var model = data.ToObject<YourModel>();// 或者直接访问属性var value = data["propertyName"].Value<string>();// 调用其他语言写的接口return Ok();
}
注意事项
-
Content-Type头:确保前端设置了正确的
Content-Type
(通常为application/json
) -
模型绑定:确保你的模型类属性与前端发送的数据键名匹配
-
大小写敏感性:默认情况下.NET Core使用驼峰命名解析,可以通过配置改变:
services.AddControllers().AddJsonOptions(options => {options.JsonSerializerOptions.PropertyNamingPolicy = null; // 保持原样});
-
异步读取:如果手动读取Request.Body,请确保使用异步方法
-
启用请求体缓冲:如果需要多次读取请求体,需要启用缓冲:
// 启用缓冲(如果还没有启用)Request.EnableBuffering();// 获取原始请求体,在读取后总是重置 Request.Body.Position = 0,否则后续读取会得到空内容Request.Body.Position = 0;