[英]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.