我正在使用postman测试Web API,并在postman中返回"400错误请求"或"输入无效"。我动作第一行的破发点没有被击中。我怎样才能弄清楚幕后发生了什么?
我会展示Postman的截图,但我无法上传图片。这只是一个POST,其中为Body指定了几个字段。这是网址:
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项目中,我还没有做任何与防伪令牌有关的事情,所以我认为这些都不起作用。。。除非那是邮差的东西。
从操作中删除参数确实允许执行到我的断点,所以错误似乎确实与ASP.NET尝试绑定有关。
在Postman中翻了一番之后,我确实看到标题为ContentType指定了x-www-form-urlencoded
。按照你的建议,我把它改成了application/json
。然而,这似乎没有什么不同。
更多信息:
在尝试了卡尔下面的建议之后,我有了更多的信息。处决落在了行动中,我看到了邮差传递的信息。这是:
----------------------------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.
这些数字是什么?它们来自哪里?
ModelState
只有在能够成功反序列化post-body/bind的情况下才会被验证。
你的问题没有具体说明,但听起来你是在以x-www-form-urlencoded
的身份发帖。如果是这种情况,您应该而不是具有[FromBody]
。但是,请记住,这是一种非此即彼的情况,因此,如果您希望最终通过JSON发布,那么您应该保留该属性并从Postman发布JSON。
除此之外,请确保您没有使用防伪造令牌验证,或者在请求时发布了有效的令牌。防雾验证失败将使请求短路,并立即返回400。
如果您发布的是JSON,请确保您的JSON是有效的。如果JSON无效,您将立即得到一个400。
来自注释的解决方案:
对于1794556948662693501539465,您似乎正在使用PostMan,其application/x-www-form-urlencoded为Content Type
我建议您按照以下步骤操作:
1。使用AddItineraryAsync([FromBody]行程(保留您的api
2.在邮递员处清空你的信头
3。Body选项卡选择带有JSON的原始(application/JSON(
4。输入有效的json字符串,或者只使用{}
5。确保除了application/json之外,没有其他头作为headers选项卡中的Content-Type。
6。发送请求以检查api方法是否会被命中。
我曾像您的[FromBody] Itinerary itinerary
一样尝试,但遇到了问题。2.1框架存在问题https://github.com/aspnet/Mvc/issues/7609和https://github.com/aspnet/Mvc/issues/7799.我在2.1中得到了这个:客户端javascript不变:
var payload = JSON.stringify({ "name": document.getElementById('firstname').value, "email": document.getElementById('email').value, "captcha": grecaptcha.getResponse() });
var oReq = new XMLHttpRequest();
oReq.ContentType = "application/json";
oReq.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("update").innerHTML = this.responseText;
}
else document.getElementById("update").innerHTML = "not 4&200! : " + this.responseText;
};
oReq.open('POST', 'api/u');
oReq.send(payload);
控制器具有:
[Route("api/[controller]")]
// [ApiController] // works either way
public class UController : ControllerBase
{
[HttpPost]
public async Task<string> signUp()
{
String body;
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
body = await reader.ReadToEndAsync();
}
UserSignup user = JsonConvert.DeserializeObject<UserSignup>(body);
return user.email;
}
}
即将上线https://github.com/Hover-Us/