Asp.net core 2.2 web api 复杂对象的 FromForm 仅包含空值
Asp.net core 2.2 web api FromForm of complex object contains only null values
您好,我正在尝试在 asp.net 核心 2.2 中为松弛命令构建一个端点。
我有一个数据结构表示来自 slack 的命令请求,如下所示:
public class SlackCommandDTO
{
[FromForm(Name = "token")]
public string Token { get; set; }
[FromForm(Name = "team_id")]
public string TeamId { get; set; }
[FromForm(Name = "team_domain")]
public string TeamDomain { get; set; }
[FromForm(Name = "channel_id")]
public string ChannelId { get; set; }
[FromForm(Name = "channel_name")]
public string ChannelName { get; set; }
[FromForm(Name = "user_id")]
public string UserId { get; set; }
[FromForm(Name = "user_name")]
public string UserName { get; set; }
[FromForm(Name = "command")]
public string Command { get; set; }
[FromForm(Name = "text")]
public string Text { get; set; }
[FromForm(Name = "response_url")]
public string ResponseUrl { get; set; }
[FromForm(Name = "trigger_id")]
public string TriggerId { get; set; }
}
我的控制器接收数据是这样的:
[Route("api/[controller]")]
[ApiController]
public class CustomerServiceController : ControllerBase
{
// POST api/customerservice
[HttpPost]
public void Post([FromForm] SlackCommandDTO command)
{
Console.Write(command.Token);
}
}
我的startup.cs看起来像这样
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
我已经尝试将 startup.cs 中的兼容性设置设置为 2.1 和 2.2。
结果始终是所有属性都包含 null 的对象实例。
我已经尝试将装饰器设置为 [FromBody](这不是应该工作的)但在那种情况下我得到 415 不受支持的媒体类型(应该如此)。
我已经尝试发送内容类型为 x-www-form-urlencoded 和 form-data 以及 text/plain 和 application/json 的请求。后两个 return 415.
我还尝试通过 swagger 发送请求,结果相同,并且对每对数据都使用 -d 关键字和 -F 关键字进行卷曲。
如果我遗漏了一些信息,请告诉我,我在这里画了一个关于如何解决它的空白,所以请帮忙。
根据这篇关于在 slack 中实现斜杠命令的文章,我收到的数据来自 Slack。
https://api.slack.com/slash-commands#responding_to_commands
[FromForm]
不适用于在模型上注释属性。它用于指示将如何绑定操作参数。如果您接受 JSON,您可以通过 [JsonProperty]
实现此目的,但无法更改 属性 用于从表单绑定的名称。它们需要匹配,即您需要将属性更改为 Team_Id
(带下划线)之类的内容,或者将字段名称更改为 teamId
(不带下划线)之类的内容。
我的问题已经解决了。
我的问题是根本的误解,即在使用 FromForm 属性时参数将绑定为单个对象,而实际上我应该将每个字段参数化为 post 方法中的字符串输入,如下所示:
[Route("api/[controller]")]
[ApiController]
public class CustomerServiceController : ControllerBase
{
// POST api/customerservice
[HttpPost]
public void Post([FromForm] string token,
[FromForm] string team_id,
[FromForm] string team_domain,
[FromForm] string channel_id,
[FromForm] string channel_name,
[FromForm] string user_id,
[FromForm] string user_name,
[FromForm] string command,
[FromForm] string text,
[FromForm] string response_url,
[FromForm] string trigger_id)
{
Console.Write(token);
}
}
您好,我正在尝试在 asp.net 核心 2.2 中为松弛命令构建一个端点。 我有一个数据结构表示来自 slack 的命令请求,如下所示:
public class SlackCommandDTO
{
[FromForm(Name = "token")]
public string Token { get; set; }
[FromForm(Name = "team_id")]
public string TeamId { get; set; }
[FromForm(Name = "team_domain")]
public string TeamDomain { get; set; }
[FromForm(Name = "channel_id")]
public string ChannelId { get; set; }
[FromForm(Name = "channel_name")]
public string ChannelName { get; set; }
[FromForm(Name = "user_id")]
public string UserId { get; set; }
[FromForm(Name = "user_name")]
public string UserName { get; set; }
[FromForm(Name = "command")]
public string Command { get; set; }
[FromForm(Name = "text")]
public string Text { get; set; }
[FromForm(Name = "response_url")]
public string ResponseUrl { get; set; }
[FromForm(Name = "trigger_id")]
public string TriggerId { get; set; }
}
我的控制器接收数据是这样的:
[Route("api/[controller]")]
[ApiController]
public class CustomerServiceController : ControllerBase
{
// POST api/customerservice
[HttpPost]
public void Post([FromForm] SlackCommandDTO command)
{
Console.Write(command.Token);
}
}
我的startup.cs看起来像这样
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
}
}
我已经尝试将 startup.cs 中的兼容性设置设置为 2.1 和 2.2。
结果始终是所有属性都包含 null 的对象实例。
我已经尝试将装饰器设置为 [FromBody](这不是应该工作的)但在那种情况下我得到 415 不受支持的媒体类型(应该如此)。
我已经尝试发送内容类型为 x-www-form-urlencoded 和 form-data 以及 text/plain 和 application/json 的请求。后两个 return 415.
我还尝试通过 swagger 发送请求,结果相同,并且对每对数据都使用 -d 关键字和 -F 关键字进行卷曲。
如果我遗漏了一些信息,请告诉我,我在这里画了一个关于如何解决它的空白,所以请帮忙。
根据这篇关于在 slack 中实现斜杠命令的文章,我收到的数据来自 Slack。 https://api.slack.com/slash-commands#responding_to_commands
[FromForm]
不适用于在模型上注释属性。它用于指示将如何绑定操作参数。如果您接受 JSON,您可以通过 [JsonProperty]
实现此目的,但无法更改 属性 用于从表单绑定的名称。它们需要匹配,即您需要将属性更改为 Team_Id
(带下划线)之类的内容,或者将字段名称更改为 teamId
(不带下划线)之类的内容。
我的问题已经解决了。 我的问题是根本的误解,即在使用 FromForm 属性时参数将绑定为单个对象,而实际上我应该将每个字段参数化为 post 方法中的字符串输入,如下所示:
[Route("api/[controller]")]
[ApiController]
public class CustomerServiceController : ControllerBase
{
// POST api/customerservice
[HttpPost]
public void Post([FromForm] string token,
[FromForm] string team_id,
[FromForm] string team_domain,
[FromForm] string channel_id,
[FromForm] string channel_name,
[FromForm] string user_id,
[FromForm] string user_name,
[FromForm] string command,
[FromForm] string text,
[FromForm] string response_url,
[FromForm] string trigger_id)
{
Console.Write(token);
}
}