Post转Get:如何将Body中自定义模型列表转为Query参数?
解决方案
针对把POST请求改为GET并传递列表参数、避免URL过长的需求,以下是几种实用方案,按推荐优先级排序:
1. Base64编码序列化列表(推荐用于元素较多的场景)
将列表序列化为JSON字符串后做Base64编码,作为单个Query参数传递,能大幅缩短URL长度,同时符合GET请求参数在URL中的语义。
服务端实现
修改接口方法,接收Base64编码的字符串参数,解码后反序列化为目标列表:
[HttpGet(nameof(UserQuery))] public IActionResult UserQuery([FromQuery] string modelsBase64) { // 解码Base64字符串 var jsonBytes = Convert.FromBase64String(modelsBase64); var jsonString = Encoding.UTF8.GetString(jsonBytes); // 反序列化为列表 var example2Models = JsonSerializer.Deserialize<List<Example2Model>>(jsonString); // 原业务逻辑... return Ok(); } // 保留原模型类不变 public class Example2Model { public string Name { get; set; } public string SurName { get; set; } public string PhoneNumber { get; set; } }
客户端示例(以JS为例)
将列表序列化为JSON后编码为Base64,拼接到URL中:
const queryModels = [ { Name: "Alice", SurName: "Smith", PhoneNumber: "13800138000" }, { Name: "Bob", SurName: "Jones", PhoneNumber: "13900139000" } ]; // 处理UTF8字符的Base64编码 const jsonStr = JSON.stringify(queryModels); const base64Str = btoa(unescape(encodeURIComponent(jsonStr))); // 拼接请求URL const requestUrl = `/api/UserQuery?modelsBase64=${base64Str}`;
2. Query字符串数组绑定(适合元素较少的场景)
ASP.NET Core原生支持复杂对象的Query绑定,直接通过索引格式传递列表元素的属性值。但这种方式会让URL随元素数量增多快速变长,受浏览器和服务器的URL长度限制(通常浏览器限制在2KB-8KB)。
服务端实现
只需修改HTTP方法特性,并显式指定从Query绑定:
[HttpGet(nameof(UserQuery))] public IActionResult UserQuery([FromQuery] ExampleModel query) { // 原业务逻辑... return Ok(); } // 保留原模型类不变 public class ExampleModel { public List<Example2Model> Example2Models { get; set; } } public class Example2Model { public string Name { get; set; } public string SurName { get; set; } public string PhoneNumber { get; set; } }
请求URL示例
/api/UserQuery?Example2Models[0].Name=Alice&Example2Models[0].SurName=Smith&Example2Models[0].PhoneNumber=13800138000&Example2Models[1].Name=Bob&Example2Models[1].SurName=Jones&Example2Models[1].PhoneNumber=13900139000
3. GET请求带Body(不推荐)
部分HTTP客户端支持给GET请求添加Body,但这不符合HTTP规范(GET请求的语义是获取资源,不应携带请求体),部分代理、网关或服务器会直接忽略GET请求的Body,兼容性差,仅作为极端场景的备选。
内容的提问来源于stack exchange,提问作者sercanezelhan
相关产品推荐
相关产品推荐

