[英]Getting payload as null for POST and PUT requests
我制作了 POST 和 PUT API,现在我正在做属性验证,
模型
public class Model
{
public string user_identifier { get; set; }
public string name { get; set; }
}
邮递员中的有效载荷
{
"user_identifier": "1234",
"name": "abcd"
}
它适用于此,但是当我更改 user_identifier 的类型时,
{
"user_identifier": 1234,
"name": "abcd"
}
邮递员为该属性提供了一个自动 400 错误,我不想要,因为我正在做我自己的验证,所以,我添加了这个来抑制那些自动 400 响应,
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
现在,当我将有效载荷传递为
{
"user_identifier": 1234,
"name": "abcd"
}
有效载荷被认为是空的,任何人都可以帮我解决这个问题,而且我认为抑制自动响应不好,另一种方法将不胜感激。
提前致谢。
主要问题是,当您的 json 如下所示时,它说user_identifier
是一个int
但您说它应该是一个string
。
{
"user_identifier": 1234,
"name": "abcd"
}
这是在新创建的 api 项目上返回的错误。
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|8c6385fc-4816d0c11a257a60.",
"errors": {
"$.user_identifier": [
"The JSON value could not be converted to System.String. Path: $.user_identifier | LineNumber: 1 | BytePositionInLine: 27."
]
}
}
一旦您知道这是问题所在(假设您使用的是 ASP.NET Core >= 3.0.0),您会发现JSON 值无法转换为 System.Int32 ,这解释了它们如何从 ASP.NET 中的 Json.NET 移动核心 3.0.0。 一种选择是安装Microsoft.AspNetCore.Mvc.NewtonsoftJson
并将其添加到启动services.AddControllers().AddNewtonsoftJson();
在 ASP.NET Core 3.0 及更高版本中, 默认的 JSON 序列化程序是 System.Text.Json 。
在下面的文档中,我们可以发现System.Text.Json
不支持字符串属性的非字符串值,这导致了这个问题。
为了在 ASP.NET Core 3+ 项目中允许字符串属性的非字符串 JSON 值,正如@Shoejep 提到的,我们可以通过安装Microsoft.AspNetCore.Mvc.NewtonsoftJson
包在我们的项目中添加 Newtonsoft.Json (Json.NET) 支持并更新Startup.ConfigureServices
以调用AddNewtonsoftJson
方法。
谢谢各位的帮助。
我无法找到验证属性的方法,因此 .Net 不会自动提供400 BadRequest
响应。
我发现了这个问题,这是因为我在 Post 请求的参数中使用[FromBody] PayloadModel payload
载荷来获取有效载荷。
现在,我已经改变了使用有效载荷的方法,
var streamReader = new StreamReader(Request.Body);
string requestBody = await streamReader.ReadToEndAsync();
var payload = JsonConvert.DeserializeObject<PayloadModel>(requestBody);
并将我的模型类修改为,
public class PayloadModel
{
[JsonProperty("user_identifier")]
public string UserIdentifier { get; set; }
[JsonProperty("name")]
public string name { get; set; }
}
通过这种方式,我可以对有效负载验证进行更精细的级别控制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.