繁体   English   中英

将 POST 和 PUT 请求的有效负载设为 null

[英]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不支持字符串属性的非字符串值,这导致了这个问题。

https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to?pivots=dotnet-core-3-1#non-string-字符串属性值

为了在 ASP.NET Core 3+ 项目中允许字符串属性的非字符串 JSON 值,正如@Shoejep 提到的,我们可以通过安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包在我们的项目中添加 Newtonsoft.Json (Json.NET) 支持并更新Startup.ConfigureServices以调用AddNewtonsoftJson方法。

https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-5.0&tabs=visual-studio#use-newtonsoftjson-in-an-aspnet-core-30 -mvc-项目

谢谢各位的帮助。

我无法找到验证属性的方法,因此 .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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM