不使用DTO类实现Post请求传递多个参数的技术咨询
不用DTO类实现Post请求传递多个参数的几种方案
嘿,我来给你分享几个在Post请求里传递多个参数但不用写DTO类的实用方法,你可以根据你的API接口情况来选择:
方案1:匿名对象序列化传JSON体
这种方法和你现在传单个ID的思路类似,只是把多个参数打包成匿名对象再序列化,非常直观:
客户端代码(你的Action里修改)
var token = await HttpContext.GetTokenAsync("access_token"); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); var path = "/api/forms/ExpireSurvey"; var url = Domain + path; // 用匿名对象封装多个参数 var requestParams = new { SurveyId = id, ExpireReason = "手动过期", ExpireTime = DateTime.Now }; var jsonData = JsonConvert.SerializeObject(requestParams); HttpContent httpContent = new StringContent(jsonData, Encoding.UTF8, "application/json"); // 发送请求 var response = await client.PostAsync(url, httpContent); // 后续处理响应... }
对应API端接收方式
API端可以用dynamic类型或者JObject来接收JSON体里的参数:
[HttpPost("/api/forms/ExpireSurvey")] public async Task<IActionResult> ExpireSurvey([FromBody] dynamic requestParams) { int surveyId = requestParams.SurveyId; string expireReason = requestParams.ExpireReason; DateTime expireTime = requestParams.ExpireTime; // 你的业务逻辑处理... return Ok(); }
或者用JObject(需要引用Newtonsoft.Json):
using Newtonsoft.Json.Linq; [HttpPost("/api/forms/ExpireSurvey")] public async Task<IActionResult> ExpireSurvey([FromBody] JObject requestParams) { int surveyId = requestParams.Value<int>("SurveyId"); string expireReason = requestParams.Value<string>("ExpireReason"); DateTime expireTime = requestParams.Value<DateTime>("ExpireTime"); // 业务逻辑... return Ok(); }
方案2:用表单形式(FormData)传递参数
如果你的参数都是简单类型(字符串、数字、日期等),可以直接用表单键值对传递,不用序列化JSON:
客户端代码
var token = await HttpContext.GetTokenAsync("access_token"); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); var path = "/api/forms/ExpireSurvey"; var url = Domain + path; var formContent = new MultipartFormDataContent(); // 添加多个参数,键名要和API端的参数名对应 formContent.Add(new StringContent(id.ToString()), "SurveyId"); formContent.Add(new StringContent("手动过期"), "ExpireReason"); formContent.Add(new StringContent(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), "ExpireTime"); var response = await client.PostAsync(url, formContent); // 后续处理... }
对应API端接收方式
API端用[FromForm]特性标记每个参数即可:
[HttpPost("/api/forms/ExpireSurvey")] public async Task<IActionResult> ExpireSurvey([FromForm] int SurveyId, [FromForm] string ExpireReason, [FromForm] DateTime ExpireTime) { // 业务逻辑处理... return Ok(); }
方案3:结合URL查询字符串传递参数
虽然是Post请求,但也可以把部分或全部参数放到URL的查询字符串里,适合参数较少的场景:
客户端代码
var token = await HttpContext.GetTokenAsync("access_token"); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); var path = "/api/forms/ExpireSurvey"; // 把参数拼到URL里,注意特殊字符要转义 var url = $"{Domain}{path}?SurveyId={id}&ExpireReason={Uri.EscapeDataString("手动过期")}&ExpireTime={Uri.EscapeDataString(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))}"; // Post请求可以不传Body,传null或者StringContent.Empty var response = await client.PostAsync(url, null); // 后续处理... }
对应API端接收方式
API端用[FromQuery]特性标记参数:
[HttpPost("/api/forms/ExpireSurvey")] public async Task<IActionResult> ExpireSurvey([FromQuery] int SurveyId, [FromQuery] string ExpireReason, [FromQuery] DateTime ExpireTime) { // 业务逻辑处理... return Ok(); }
小提示
- 不管用哪种方案,要确保客户端传递的参数名称和API端接收的参数名称一致(ASP.NET Core默认大小写敏感,也可以配置忽略大小写)
- 传递日期类型时,尽量用统一的格式(比如
yyyy-MM-dd HH:mm:ss),避免解析错误 - 如果参数较多或者需要复用,其实写个简单的DTO类会更易维护,不过如果只是临时场景,上面的方法都能解决问题
内容的提问来源于stack exchange,提问作者egmfrs
相关产品推荐
相关产品推荐

