ASP.Net Core WebAPI 中的模型绑定 HTTP 请求

问题描述 投票:0回答:2

我遇到端点问题,它需要一个未绑定的对象,因此返回 400 错误请求。

我通过传递对象的各个属性而不是对象本身来解决这个问题,但更喜欢传递对象。

WebClient webClient = new WebClient();
webClient.QueryString.Add("firstName", "value1");
webClient.QueryString.Add("lastName", "value2");
string result = webClient.DownloadString(url);

[HttpGet]
public async Task<IActionResult> DoSomething(string firstName, string lastName)
{ 
   // this endpoint works perfectly
   return Ok();
}

[HttpGet]
public async Task<IActionResult> DoSomething([FromBody]SubmitModel model)
{ 
   // this endpoint returns a 400 bad request
   return Ok();
}

public class SubmitModel
{
   public string FirstName {get; set;}
   public string LastName {get; set;
}
c# .net
2个回答
1
投票

根据设计,

GET
请求在请求正文中包含数据。 因此,当您的 Submit 方法收到请求时,它无法从正文绑定模型,因为数据不存在,因此返回错误的请求响应。

由于您的方法名为 Submit,听起来您应该使用

POST
请求来代替。
POST
请求按照设计,在请求正文中发送数据,适合向服务器提交数据。

像这样尝试一下

[HttpPost]
public async Task<IActionResult> Submit([FromBody]SubmitModel model)
{ 
   // this endpoint returns a 400 bad request
   return Ok();
}

0
投票

我不知道是否有好的方法可以实现您想要的功能。为了更接近一点,您可以添加此属性以直接从 url 中提取

[HttpGet]
public ActionResult Get([FromUri]SubmitModel model)
{ 
   // this endpoint returns a 400 bad request
   return Ok();
}

如果需要,您可以做的另一件事是创建一个扩展方法,该方法反映模型并将所有属性/值添加到查询字符串。这里有一些很好的例子 如何将对象序列化为查询字符串格式?

© www.soinside.com 2019 - 2024. All rights reserved.