我正在构建一个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中处理这个最佳实践。
答案 0 :(得分:3)
我认为这里并没有真正的“最佳实践”。某些API会像使用JSON一样返回错误对象。那完全没问题。其他API返回HTTP错误(401,500等)。其他API都返回。每种方法都有利弊,所以选择你喜欢的或最适合你的需求。
如果您使用第一种方法,请不要仅限于返回HTTP代码。相反,返回代码可以为您和API的使用者提供更具体的错误引用。例如,代码401没有告诉我验证失败的原因。可能这对于安全性来说很好,但我只是在这里使用它作为示例,因此您可以返回代码1001以获取不正确的凭据,1002代表已锁定的帐户,1003代表待批准的帐户等...
第一种方法的优点:API使用者可以使用简单的if...else
或switch
逻辑处理相同代码中的所有内容。它也更容易测试。缺点:您仍然需要使用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);
}