Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WebAPI和401 vs 200_Javascript_C#_.net_Rest_Asp.net Web Api - Fatal编程技术网

Javascript WebAPI和401 vs 200

Javascript WebAPI和401 vs 200,javascript,c#,.net,rest,asp.net-web-api,Javascript,C#,.net,Rest,Asp.net Web Api,我正在构建一个WebAPI作为一个学习项目,并尝试使用最佳实践。我的第一次尝试是身份验证API,它接受身份验证对象(JSON): 它在/API/authenticate上作为POST调用我的API,并传递对象 在我的.Net代码中,我进行了一些检查,如果用户名/密码通过,我将创建一个jwt令牌,并将其与角色一起返回。我的API返回一个在主体中带有标记的200(Chrome developer tools中的响应显示“ey…”,这是我的jwt) 如果我的用户名/密码无效,我将返回401 我不确定这

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

它在/API/authenticate上作为POST调用我的API,并传递对象

在我的.Net代码中,我进行了一些检查,如果用户名/密码通过,我将创建一个jwt令牌,并将其与角色一起返回。我的API返回一个在主体中带有标记的200(Chrome developer tools中的响应显示“ey…”,这是我的jwt)

如果我的用户名/密码无效,我将返回401

我不确定这是否正确。我应该返回一个200-和一些其他有效载荷的机构?(不确定是什么),然后我的成功登录应该返回JSON,例如:

{
  success: true,
  error: null
  token: "ey.....",
}
登录返回失败:

{
  success: false,
  error: null
  token: null,
}
然后是一个错误:

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

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

我认为这里没有真正的“最佳实践”。一些API返回一个错误对象,就像使用JSON一样。那很好。其他API返回HTTP错误(401500等)。其他API同时返回这两个参数。每种方法都有优缺点,所以选择你喜欢的或最适合你需要的方法

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

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

第二种方法的优点:它更符合我们通常的做事方式。使用
try…catch
处理所有错误,其中的代码仅用于成功路径。缺点是:测试起来有点困难,而且你会被HTTP错误代码所困扰

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

在这里,我给出了一种不同的返回响应消息的方式。。。 我希望,这将有助于您返回回复信息

//登录成功

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

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

//用于未经授权的用户登录

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

在这里,我们可以向用户提及错误状态作为响应…
返回内容(HttpStatusCode.Unauthorized,错误)这将有助于在邮差工具的标题中返回状态代码

//错误

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

在这里,我们可以向用户提及错误状态作为响应…
返回内容(HttpStatusCode.InternalServerError,error)这将有助于在邮差工具的标题中返回状态代码


您在这里问了两个不同的问题1)错误返回什么,JSON或HTTP错误?2) 我的代码没有从API中获取JSON对象。在你的帖子里,你不应该问一个以上的问题。我已经回答了第一个问题,其他一些人可能会补充更多的答案。我建议删除第二个问题,复制它并创建另一个问题。使用-return401(不要返回200,因为它表示成功),也可以在正文中返回json,并提供详细说明。
{
  success: false,
  error: 500
  token: null,
}
if (result == null)
            {
                var error = new
                {
                    Success = "true",
                    Token = "your token"
                };
                return Content(HttpStatusCode.Ok, error);
            }
if (result == some condition)
                 {
                     var error = new
                     {
                         Error = new
                         {
                             StatusCode = HttpStatusCode.Unauthorised,
                             Message = "Invalid Credential...! ",
                             InternalMessage = "Some message"
                         }
                     };
                     return Content(HttpStatusCode.Unauthorised, error);
                 }
if (result == somecondition)
             {
                 var error = new
                 {
                     Error = new
                     {
                         StatusCode = HttpStatusCode.InternalServerError,
                         Message = "Error in functionality...!",
                         InternalMessage = "Some message"
                     }
                 };
                 return Content(HttpStatusCode.InternalServerError, error);
             }