我在Web Api 2.2(C#)中创建了一个RESTful服务
该方法的输入如下:
public HttpResponseMessage Post([FromBody] PaymentInput paymentInput)
并且我的PaymentInput对象具有以下属性:
[Required]
[RegularExpression(@"^[0-9.]*$", ErrorMessage = "ProductId must be an integer")]
public int ProductId { get; set; }
在任何情况下,我都会收到一条默认的错误消息,而不是我的错误消息。我认为这是因为模型验证是首先完成的,而不是正则表达式验证。
例如:
"productId": helloworld,
退货:
{
"message": "The request is invalid."
"modelState": {
"paymentInput.productId": [2]
0: "Unexpected character encountered while parsing value: v. Path 'productId', line 6, position 30."
-
}-
}
以及以下情况:
"productId": "helloworld",
返回相同的。
所以,我的问题是:
如何更改此消息
提前感谢
public class PaymentInput {
// [Required] //removed Required unless you want a different message if nothing is provided
[RegularExpression(@"^[0-9.]+$", ErrorMessage = "ProductId must be an integer")]
// changed regex to + instead of * which forces it to have at least 1 passed in character
public string ProductId { get; set; }
public int GetProductId() { return int.Parse(ProductId); }
}
- 此更改将允许用户将任何内容传递到ProductId中
- 它将允许您对ProductId值执行正则表达式
- 它将允许您在
RegularExpression
属性中返回错误消息
我唯一想添加的是,您应该担心更改消息吗
在我看来,这条信息非常明确,不要将非数字传递到productId中。应由客户进行验证,以确保不会发生这种情况。如果是,则会显示一条用户友好的错误消息,该消息也是由客户端生成的。就我个人而言,我不会试图让Web API传递友好的错误消息,它的PITA加本地化也不是它应该关心的问题(不同语言的消息)。现在,您还必须将所有传入参数更改为字符串类型,然后在代码中对它们进行验证,并为每个参数返回自定义错误消息。
简而言之,最好是:
- 让服务器代码保持原样,它正在完成自己的工作。这也意味着你在服务器上需要做的编码更少
- 在将消息发送到服务器之前,请确保客户端在一定程度上验证了输入。如果这是外部API,那么编写文档或生成API文档,调用方在编写接口时可以使用这些文档
- 处理客户端上的异常和消息
我认为错误消息显示全部是
分析值时遇到意外字符
由于ProductId类型是int,所以系统会首先尝试将JSON值解析为int,然后放入您正在放入的任何验证。它在解析自身时失败了,因此不存在任何其他验证的问题。
我认为,如果您将ProductID的类型更改为字符串,然后启动正则表达式验证,以验证正确格式的输入字符串。正则表达式是在字符串而不是整数上执行的。