WebAPI和401 vs 200

时间:2018-03-03 13:14:52

标签: javascript c# .net rest asp.net-web-api

我正在构建一个WebAPI作为学习项目并尝试使用最佳实践。我的第一次尝试是身份验证API,它采用身份验证对象(JSON):

{
   username: myusername, 
   password: mypassword
}

它将我的API调用/ api / authenticate作为POST,传递对象。

在我的.Net代码中,我做了一些检查,如果用户名/密码通过,我创建一个jwt令牌,并返回角色。我的API返回200,主体中包含令牌(Chrome开发者工具中的响应显示“ey .....”,这是我的jwt)。

如果我收到无效的用户名/密码,我会返回401。

我不确定这是对的。我是否应该在体内返回200 - 以及其他一些有效载荷? (不确定是什么),然后我的成功登录应该返回JSON,例如:

{
  success: true,
  error: null
  token: "ey.....",
}

登录失败返回:

{
  success: false,
  error: null
  token: null,
}

然后出错:

{
  success: false,
  error: 500
  token: null,
}

然后客户端代码使用它来决定做什么?我正在尝试在这里学习如何在WebAPI中处理这个最佳实践。

2 个答案:

答案 0 :(得分:3)

我认为这里并没有真正的“最佳实践”。某些API会像使用JSON一样返回错误对象。那完全没问题。其他API返回HTTP错误(401,500等)。其他API都返回。每种方法都有利弊,所以选择你喜欢的或最适合你的需求。

如果您使用第一种方法,请不要仅限于返回HTTP代码。相反,返回代码可以为您和API的使用者提供更具体的错误引用。例如,代码401没有告诉我验证失败的原因。可能这对于安全性来说很好,但我只是在这里使用它作为示例,因此您可以返回代码1001以获取不正确的凭据,1002代表已锁定的帐户,1003代表待批准的帐户等...

第一种方法的优点:API使用者可以使用简单的if...elseswitch逻辑处理相同代码中的所有内容。它也更容易测试。缺点:您仍然需要使用try...catch,因为对API的请求可能仍然失败,因此使用者代码将具有上述逻辑加上try...catch逻辑。

第二种方法的优点:它更符合我们通常做事的方式。使用try...catch来处理所有错误,内部代码仅用于成功路径。缺点:有点难以测试,而且你遇到了HTTP错误代码。

第三种方法是两者的结合。在某些情况下,这可能是一种过度杀伤,并增加了一些不必要的复杂性和重复,但在其他情况下,它可以结合两个世界的好处。

答案 1 :(得分:0)

  

这里我给出了一种返回响应消息的不同方式......   我希望,这将帮助您返回响应消息......

//登录成功

  

在下面的代码中,它显示了成功响应...

     

返回内容(HttpStatusCode.Ok,错误); 这将有助于在 Postman工具的标题中返回状态代码。

#define __cplusplus 201103L

//未经授权的用户登录

  

在下面的代码中,它显示了Unsuccess登录响应...

     

我们可以在这里向用户提及错误状态...
  返回内容(HttpStatusCode.Unauthorised,错误); 这将有助于在邮递员工具的标题中返回状态代码。

if (result == null)
            {
                var error = new
                {
                    Success = "true",
                    Token = "your token"
                };
                return Content(HttpStatusCode.Ok, error);
            }

//表示错误

  

在下面的代码中,它显示了Unsuccess登录响应...

     

我们可以在这里向用户提及错误状态...
  返回内容(HttpStatusCode.InternalServerError,错误); 这将有助于在邮递员工具的标题中返回状态代码。

if (result == some condition)
                 {
                     var error = new
                     {
                         Error = new
                         {
                             StatusCode = HttpStatusCode.Unauthorised,
                             Message = "Invalid Credential...! ",
                             InternalMessage = "Some message"
                         }
                     };
                     return Content(HttpStatusCode.Unauthorised, error);
                 }