在web api中返回不同条件结果的最佳实践

时间:2015-12-07 13:03:05

标签: asp.net-web-api

假设我使用ASP.NET有web api应用程序。在其中一个操作中,我检查是否可以激活给定用户的免费试用期。现在从一个角度来看,这个动作的结果要么成功要么不成功。但是如果结果不成功,我想告知客户端为什么请求被拒绝,然后客户端可以决定该怎么做。

此操作中有多个if-checks,并且每个if-checks都可以拒绝传入的请求。此外,我们也可以有不同的成功结果条件。

返回这些不同条件的正确方法是什么,以便客户可以轻松区分它们?

我现在正在做的事情是这样的:

public IHttpActionResult ActivateFreeTrial()
{
     BaseResult result = new BaseResult();  // This class has a property called Status

     if(!FirstCondition)
     {
        // Unsuccessful
        result.Status = 90;
        return Ok(result)
     }
     if(!SecondCondition)
     {
        // Unsuccessful
        result.Status = 91;
        return Ok(result)
     }

     // Some more checks...

     if(!SixthCondition)
     {
         // Successful
         result.Status = 1;
         return Ok(result);  
     }

     else {
         // Successful
         result.Status = 2;
         return Ok(result); 
     }       
}

客户需要知道哪个条件产生了结果,这就是为什么我要分配一个数字来区分不同的条件。所以在客户端我可以做类似的事情:

CallActivateFreeTrial()
.then(function(res){
    if (res.Status == 1)
    {
       // Successful result but with status 1
    }
    else if (res.Status == 2)
    {
       // Successful result but with status 2
    }
    else if (res.Status == 90)
    {
       // Unsuccessful result but with status 90
    }
    else if (res.Status == 91)
    {
       // Unsuccessful result but with status 91
    }          
}, function(error){

})

我几乎不认为我现在所做的事情被认为是一种很好的做法。有没有更好的方法将不同的条件结果返回给客户?

1 个答案:

答案 0 :(得分:0)

我想知道你在哪里获得!FirstCondition,!SecondCondition值确认我的答案,但我认为这是一个不好的做法。如果您有不同的结果,那么您将更改ActivateFreeTrial方法。我相信战略或国家模式可以帮助你。所以不是返回"状态代码"对于您的客户端,您可以返回客户端应该调用的函数的名称。

策略模式

http://www.dofactory.com/net/strategy-design-pattern

状态模式

http://www.dofactory.com/net/state-design-pattern