繁体   English   中英

如果有效载荷包含意外字段,如何返回BadRequest

[英]How to return BadRequest if payload contains unexpected fields

我正在尝试进行PATCH操作,如果请求正文包含未在合同中指定的字段,则该操作将失败。 例如,如果我调用此方法:

[HttpPatch("{id}")]
public async Task<ActionResult> PatchResource(
    [FromRoute][Required] Guid id,
    [FromBody][Required] PatchRequest request) {/* whatever */}

PatchRequest在哪里

public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }
}

如果我收到这样的请求正文,我想返回400 (Bad Request) ,可能还附有解释

{
  "name": "Adam",
  "address" "NY City",
  "additional": true
}

我想回来

400(错误请求)-没想到属性“附加”

我知道,如果在MissingMemberHandling设置为Error情况下在PatchRequest上设置自定义序列化PatchRequest ,在这种情况下,我可以通过抛出异常轻松获得500 (Internal Server Error) ,但这没有任何意义,因为这是请求的错误,不是服务器。

在您的PatchRequest模型中,添加JsonExtensionsData属性

public class PatchRequest
{
    public string Name { get; }
    public string Address { get; }
    public PatchRequest(string name, string address) { Name = name; Address = address; }

    // extra fields
    [JsonExtensionData]
    private IDictionary<string, JToken> _extraStuff;
}

然后,在控制器中,如果_extraStuff不为空,则会收到其他字段。

以下功能将为您准确返回哪些属性与FromBody定义的对象不同

创建一个类,例如ValidationBase

在该类中,创建一个方法来验证您的对象,例如ValidateModel()

ValidateModel() -包含ValidateModel()的整个逻辑

控制器:(端点)

[HttpPatch("{id}")]
public async Task<ActionResult> PatchResource([FromRoute][Required] Guid id, 
[FromBody][Required] PatchRequest request)
{
    string body;
    using (var reader = new StreamReader(Request.Body))
    {
        body = reader.ReadToEnd();
    }

    validator = new ValidationBase();
    string resultValidation = validator.ValidateObject(body, new PatchRequest());

    if (resultValidation.Length != 0)
    {
        return BadRequest(new { error_message = resultValidation });
    }

    // Content endpoint

    return Json(response);
}

ValidationBase:

public class ValidationBase
{

    public string ValidateObject(string json, object obj)
    {
        var dictJSON = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
        var listParameterInJSON = dictJSON.Keys.ToHashSet<string>();
        listParameterInJSON.ToList().ForEach(x => x = x.ToLower());

        var jsonObj = JsonConvert.SerializeObject(obj);
        var dictObj = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonObj);
        var listParameterInObj = dictObj.Keys.ToList();

        listParameterInObj = listParameterInObj.ConvertAll(d => d.ToLower());
        listParameterInObj.ToHashSet<string>();

        var fields = listParameterInJSON.Except(listParameterInObj);

        if (fields.ToList().Count == 0) return "";

        var result = "Didn't expect property ";

        foreach (var item in fields)
        {
            result += "'" + item + "'" + " ";
        }

        return result;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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