当前位置: 首页 > news >正文

在.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();
}

注意事项

  1. Content-Type头:确保前端设置了正确的Content-Type(通常为application/json

  2. 模型绑定:确保你的模型类属性与前端发送的数据键名匹配

  3. 大小写敏感性:默认情况下.NET Core使用驼峰命名解析,可以通过配置改变:

    services.AddControllers().AddJsonOptions(options => {options.JsonSerializerOptions.PropertyNamingPolicy = null; // 保持原样});
  4. 异步读取:如果手动读取Request.Body,请确保使用异步方法

  5. 启用请求体缓冲:如果需要多次读取请求体,需要启用缓冲:

        // 启用缓冲(如果还没有启用)Request.EnableBuffering();// 获取原始请求体,在读取后总是重置 Request.Body.Position = 0,否则后续读取会得到空内容Request.Body.Position = 0;

http://www.lqws.cn/news/175771.html

相关文章:

  • 小牛电动NXT,市场销量第一
  • vscode .husky/pre-commit: line 4: npx: command not found
  • C++ 基础特性深度解析
  • 【AI论文】超越80/20规则:高熵少数令牌驱动LLM推理的有效强化学习
  • 3步布局关键词让流量更精准
  • Spring Cloud核心组件深度解析(2025终极指南)
  • 【业务框架】3C-相机-Cinemachine
  • EasyRTC嵌入式音视频通信SDK助力物联网/视频物联网音视频打造全场景应用
  • python报错No module named ‘tensorflow.keras‘
  • rk3588 区分两个相同的usb相机
  • 机器学习KNN算法全解析:从原理到实战
  • 边缘计算服务器
  • linux 故障处置通用流程-36计-28-37
  • npm error Cannot read properties of null (reading ‘matches‘)
  • Vue在线预览excel、word、ppt等格式数据。
  • 彻底解决 MFC 自绘控件闪烁
  • 学习设计模式《十二》——命令模式
  • 数论——同余问题全家桶3 __int128和同余方程组
  • 【Linux】(1)—进程概念-④fork、僵尸进程、孤儿进程
  • vue3 按钮级别权限控制
  • 数学复习笔记 28
  • camera功能真的那么难用吗
  • UniApp系列
  • 静态相机中的 CCD和CMOS的区别
  • [ElasticSearch] DSL查询
  • 软件功能测试目的是啥?如何通过测试用例确保产品达标?
  • java教程笔记(十一)-泛型
  • 软件功能测试报告都包含哪些内容?
  • .net webapi http参数自定义绑定模型
  • .net 使用MQTT订阅消息