【发布时间】:2019-01-14 18:48:37
【问题描述】:
我正在使用 postman 测试我的 Web API,并在 Postman 中返回“400 错误请求”或“输入无效”。我的动作第一行的断点没有被击中。我怎样才能弄清楚幕后发生了什么?
我会显示 Postman 的屏幕截图,但我无法上传图片。它只是一个为 Body 指定了几个字段的 POST。这是网址:
http://localhost:52126/api/v1/itinerary
下面是动作:
[HttpPost]
[Route("api/v1/itinerary")]
public async Task<ActionResult> AddItineraryAsync([FromBody] Itinerary itinerary)
{
if (!ModelState.IsValid) // Break point on this line not getting hit!
{
return BadRequest(ModelState);
}
await Logic.AddItineraryAsync(itinerary);
return Ok();
}
最初,我没有为操作指定 [FromBody]。这两种方式都行不通。我可以检查什么来弄清楚发生了什么?
澄清(回应 Chris Pratt):
我正处于编写我的第一个移动应用程序的早期阶段,作为一个自下而上的人,我首先要让一些 Web API 调用正常工作。我假设我会将 JSON 从移动应用程序传递到此服务器层。
我没有在这个 Web API 项目中做任何与防伪令牌有关的事情,所以我认为这些都没有发挥作用……除非那是来自 Postman 的东西。
从动作中删除参数确实允许执行落到我的断点,因此错误似乎与 ASP.NET 尝试绑定有关。
在 Postman 中挖掘了一下之后,我确实看到标题为 Content-Type 指定了 x-www-form-urlencoded。按照您的建议,我将其更改为application/json。然而,这似乎并没有什么不同。
更多信息:
在尝试了 Carl 下面的建议后,我获得了更多信息。执行下降到动作中,我查看了 Postman 传递的内容。这里是:
----------------------------179455694862693501539465
Content-Disposition: form-data; name="StartPoint"
Tacoma
----------------------------179455694862693501539465
Content-Disposition: form-data; name="EndPoint"
Portland
----------------------------179455694862693501539465
Content-Disposition: form-data; name="TravelDate"
2018-8-21 07:00:00 AM
----------------------------179455694862693501539465
Content-Disposition: form-data; name="Name"
Test Itinerary
----------------------------179455694862693501539465
Content-Disposition: form-data; name="UserAccountId"
2
----------------------------179455694862693501539465
Content-Disposition: form-data; name="Comment"
Just doin' some testing.
----------------------------179455694862693501539465--
Json 反序列化失败:
JsonReaderException: Input string '----------------------------179455694862693501539465' is not a valid number.
这些数字是什么?它们来自哪里?
【问题讨论】:
-
对于
179455694862693501539465,您似乎正在使用邮递员和application/x-www-form-urlencoded作为Content-Type。我建议您按照以下步骤操作: 1. 使用AddItineraryAsync([FromBody] Itinerary itinerary)保留您的api; 2.清除邮递员中的标题 3.Body选项卡选择raw和JSON(application/json)4.输入有效的json字符串或仅使用{}5.确保除了application/json之外没有其他标题Content-Type在headers选项卡中。 6.发送请求,检查api方法是否会被命中。 -
刚刚看到你的评论,爱德华。昨晚给邮递员发了邮件,得到了回复。他们告诉我同样的事情。我需要选择 Raw 并输入 JSON 而不是使用 Body 选项卡。另外,你是对的。这适用于 ASP.NET 的标准绑定。
标签: c# postman asp.net-core-webapi