You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:59:59