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

在.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.lryc.cn/news/2402628.html

相关文章:

  • snprintf函数用法及注意事项详解
  • vue-20(Vuex 状态管理的最佳实践)
  • DAX权威指南8:DAX引擎与存储优化
  • 智慧货运飞船多维度可视化管控系统
  • 电脑开不了机,主板显示67码解决过程
  • Spring Boot 类加载机制深度解析
  • Python 训练营打卡 Day 45
  • 自托管图书搜索引擎Bookologia
  • 前端flex、grid布局
  • Maven相关问题:jna版本与ES冲突 + aop失效
  • Tomcat全方位监控实施方案指南
  • 开源PHP在线客服系统源码搭建教程
  • centos7升级glibic-2.28
  • 在Docker里面运行Docker
  • 设计模式复习小结
  • To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R
  • 【基础】每天掌握一个Linux命令 - awk
  • 《UE5_C++多人TPS完整教程》学习笔记37 ——《P38 变量复制(Variable Replication)》
  • AWS API Gateway配置日志
  • Towards Open World Object Detection概述(论文)
  • 轻松备份和恢复 Android 系统 | 4 种解决方案
  • 具备强大的数据处理和分析能力的智慧地产开源了
  • RK3588和FPGA桥片之间IO电平信号概率性不能通信原因
  • 【iSAQB软件架构】软件架构中构建块的视图:黑箱、灰箱和白箱及其交互机制
  • .net jwt实现
  • LangChain【7】之工具创建和错误处理策略
  • 如何在电脑上轻松访问 iPhone 文件
  • Eureka REST 相关接口
  • C语言字符数组输入输出方法大全(附带实例)
  • 短视频矩阵SaaS系统:开源部署与核心功能架构指南