路由属性范围约束与范围属性验证
Route attributes range constraint vs range attribute validation
有了新的属性路由及其约束,似乎我应该使用属性来验证我的 DTO 的边界变得越来越模糊。
我现在可以通过两种方式进行范围验证 - 考虑到第一种方法具有复杂的操作 class + 权重 属性 -
我什么时候应该使用哪种方法,它们与其他方法相比有哪些优势?
[Range(0,500)]
public int Weight {get;set;}
对
[GET("{id:range(0, 500)}")]
public Machine GetMachine(int weight)
{
}
第一种方法导致错误请求。
第二种方法导致未找到请求。
你最后两句话总结得很好。在 [Range]
的情况下,设置 输入验证 以便它可以告诉调用者他们的请求是错误的。第二,它定义了将 URL 与路由匹配的规则,这将用于向不同的路由发送请求,而不是用于验证输入。第二个可能很有用,例如,如果您有不同格式的 ID,并希望使用不同的方法处理。
简而言之,第一个的用户体验为 "I must be sending invalid data",第二个为 "I must have the wrong URL."
更新:
这里演示了如何使用不同格式的路由属性:
[GET("/users/{id:int}")]
public User GetUserById(int id)
{
}
[GET("/users/{email:regex(^[^@]+@[^@]$)}")]
public User GetUserByEmail(string email)
{
}
[GET("/users/{username}")]
public User GetUserByName(string username)
{
}
有了新的属性路由及其约束,似乎我应该使用属性来验证我的 DTO 的边界变得越来越模糊。
我现在可以通过两种方式进行范围验证 - 考虑到第一种方法具有复杂的操作 class + 权重 属性 -
我什么时候应该使用哪种方法,它们与其他方法相比有哪些优势?
[Range(0,500)]
public int Weight {get;set;}
对
[GET("{id:range(0, 500)}")]
public Machine GetMachine(int weight)
{
}
第一种方法导致错误请求。
第二种方法导致未找到请求。
你最后两句话总结得很好。在 [Range]
的情况下,设置 输入验证 以便它可以告诉调用者他们的请求是错误的。第二,它定义了将 URL 与路由匹配的规则,这将用于向不同的路由发送请求,而不是用于验证输入。第二个可能很有用,例如,如果您有不同格式的 ID,并希望使用不同的方法处理。
简而言之,第一个的用户体验为 "I must be sending invalid data",第二个为 "I must have the wrong URL."
更新:
这里演示了如何使用不同格式的路由属性:
[GET("/users/{id:int}")]
public User GetUserById(int id)
{
}
[GET("/users/{email:regex(^[^@]+@[^@]$)}")]
public User GetUserByEmail(string email)
{
}
[GET("/users/{username}")]
public User GetUserByName(string username)
{
}