.NET Core中如何通过HttpGet方法经URL传递对象?
解决.NET Core HttpGet方法接收对象参数的问题
首先得敲黑板说清楚核心问题:HttpGet请求按照HTTP规范是不携带请求体的,所以你用[FromBody]来绑定参数在Get方法里完全不生效,这就是当前写法失效的根本原因。而且客户端直接把data对象拼在URL里的方式也不对,服务器没法直接把这个字符串解析成你的ViewModel实例。
下面给你两种实用的解决方案,按需选择:
方案一:拆分对象属性为独立查询参数(推荐)
这是最符合HttpGet规范的做法,把对象的每个属性作为URL的查询参数传递。
客户端请求示例
把参数拆成键值对拼在URL里:
http://localhost/controller/GetObject?Id=1&Name=xxx
如果是JavaScript发起请求,也可以用URLSearchParams来更优雅地构建:
let data = { "Id":1, "Name":"xxx" }; let params = new URLSearchParams(data); let url = `http://localhost/controller/GetObject?${params.toString()}`; // 发起Get请求
控制器代码修改
用[FromQuery]特性标记你的ViewModel参数,.NET Core会自动把查询字符串里的键值对匹配到对象的属性上(属性名大小写不敏感):
// 先确保你的ViewModel定义正确 public class ViewModel { public int Id { get; set; } public string Name { get; set; } } [HttpGet] public IActionResult GetObject([FromQuery] ViewModel model) { // 这里model已经被正确绑定,可以直接使用 if (model.Id == 0 || string.IsNullOrEmpty(model.Name)) { return BadRequest("参数不完整"); } return Ok(model); }
方案二:传递序列化后的JSON字符串(仅特殊场景使用)
如果因为某些原因必须传递整个对象的结构,可以把对象序列化为JSON字符串,编码后作为单个查询参数传递。但要注意:URL有长度限制,复杂/大数据量的对象不适合这种方式。
客户端请求示例
先序列化对象为JSON,再进行URL编码:
let data = { "Id":1, "Name":"xxx" }; let encodedJson = encodeURIComponent(JSON.stringify(data)); let url = `http://localhost/controller/GetObject?model=${encodedJson}`; // 发起Get请求
控制器代码修改
接收字符串参数后手动反序列化为ViewModel:
using System.Text.Json; [HttpGet] public IActionResult GetObject([FromQuery] string model) { if (string.IsNullOrWhiteSpace(model)) { return BadRequest("缺少model参数"); } try { var viewModel = JsonSerializer.Deserialize<ViewModel>(model); // 处理业务逻辑 return Ok(viewModel); } catch (JsonException) { return BadRequest("model参数格式错误"); } }
总结
优先选择方案一,既符合HTTP规范,又简单易维护,还没有URL长度的顾虑。方案二只适合非常特殊的场景,尽量避免使用。
内容的提问来源于stack exchange,提问作者Janani
相关产品推荐
相关产品推荐

