首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAPI验证

WebAPI验证
EN

Stack Overflow用户
提问于 2014-03-31 15:02:27
回答 3查看 540关注 0票数 2

我通常有如下所示的ApiController方法

代码语言:javascript
复制
[HttpPost]
public HttpResponseMessage DoSomething(int someId)
{
  var someObj = Session.Get<SomeObj>(someId);
  if (someObj == null)
  {
    return Request.CreateResponse(HttpStatusCode.NotFound);
  }

  Do something...
}

我想摆脱如果条件。我只允许抛出一个NullPointerException,但我希望能够指定返回哪个HTTP代码。我希望将if条件移到某个验证类中,并在OnActionExecuting中执行验证。

我以前在WebAPI中使用过WebAPI,最好有这样的语法:

代码语言:javascript
复制
RuleFor(x => x.SomeId).Must(x => someObjectExists()).WithMessage("SomeObject wasn't found").WithHTTPStatusCode(HttpStatusCode.NotFound);

..。WithHTTPStatusCode将是解决我的问题的方法。

你有什么意见建议?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-03 05:50:13

好酷的名字!

我想向你推荐这种方法。创建一个您定义的新类,名为ServiceNotFoundException或类似的类,并让它从HttpResponseException继承,传入一个404而不是构造函数,如下所示:

代码语言:javascript
复制
 public class ServiceNotFoundException : HttpResponseException
    {
        public ServiceNotFoundException() : base(HttpStatusCode.NotFound)
        {

        }
    }

现在,在您的Session.Get中,如果在其中找不到该实体,您应该抛出异常(因此请将此逻辑保持在控制器之外)。

这样,如果多个控制器使用您的服务,则在所有情况下都会引发异常。因为您继承了HttpResponseException并抛出了NotFound,所以它将返回一个404。如果您需要使用特定的文本/消息,那么可以使用构造函数,这样就可以看到base()有一个可以交替添加的HttpResponseMessage (也许可以在响应中设置特定的消息文本)。

如果您更喜欢在控制器中执行这个逻辑,那么无论如何您都可以抛出异常,但是您应该尽量避免重复!

如果有什么问题请告诉我!

票数 1
EN

Stack Overflow用户

发布于 2014-04-02 19:59:34

我喜欢更安静地处理这个问题,因为它会让任何人都不知道WebAPI端点是否缺少所需的变量。

代码语言:javascript
复制
        [AcceptVerbs("GET", "POST")]
        public ServiceResult Login(JObject args)
        {
            var retVal = new ServiceResult {Success = false};
            JToken tokenValue;
            var email = string.Empty;
            var password = string.Empty;

            if (args.TryGetValue("email", out tokenValue))
            {
                email = args.Value<string>("email");
            }

            if (args.TryGetValue("password", out tokenValue))
            {
                password = args.Value<string>("password");
            }

            var user = Services.Users.GetByEmail(email, true);

            if (null != user || null != user.Id)
            {
                return Services.Authentication.AuthenticateSignIn(user, password, true);

            }

            retVal.Data = tokenValue;
            return retVal;
        }

如果缺少变量,默认情况下,除非将App_Start/WebApiConfig.cs设置为

代码语言:javascript
复制
config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;

如果您不喜欢If条件,则在获取变量后始终可以使用Assert。祝好运!

票数 1
EN

Stack Overflow用户

发布于 2016-07-06 16:47:58

为什么不使用标准模型验证?您正在使用实体框架吗?您可以使用pocos上的数据注释来实现这一点,或者可能根据需要创建一个模型,在您的示例中,一个具有单个属性的类将做得很好。

代码语言:javascript
复制
public async Task<IHttpActionResult> PutOrder(int id, Order order)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }...

订单模型会像这样..。

代码语言:javascript
复制
    public partial class Order
    {
[Required]
 public int id { get; set; }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22765093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档