您如何将状态 401 从 WebAPI 返回到 AngularJS 并包含自定义消息?

Posted

技术标签:

【中文标题】您如何将状态 401 从 WebAPI 返回到 AngularJS 并包含自定义消息?【英文标题】:How do you return status 401 from WebAPI to AngularJS and also include a custom message? 【发布时间】:2014-05-26 09:26:56 【问题描述】:

在我的 WebAPI 类中,ApiController,我进行了如下调用:

string myCustomMessage = .....;

throw new HttpResponseException(
    new HttpResponseMessage(HttpStatusCode.Unauthorized)
         ReasonPhrase = myCustomMessage );

当我使用 AngularJS $resource 服务调用时,我在状态字段中得到 401 响应,在承诺的 catch 块中。 401 匹配 HttpStatusCode.Unauthorized,所以一切正常。

但是,问题是响应的数据字段为空(null)。我没有收到返回的 myCustomMessage。

现在,如果我不抛出 HttpResponseException 异常,而是抛出带有消息的常规 Exception,那么该消息确实会使它摇摆回 Angular。

我需要能够做到这两点:从服务器返回一条自定义消息,以及让返回的状态码是我想要的任何东西,在本例中为 401。

有人知道怎么做吗?

[编辑] 解决方案:

 throw new HttpResponseException(
     Request.CreateErrorResponse(HttpStatusCode.Unauthorized, myCustomMessage));

【问题讨论】:

如果你使用普通的$http会发生什么? Karolis,我可以使用普通的 $http。如果我们确定 $resource 不能用于解决此问题,我会这样做。确认了吗? 【参考方案1】:

我为此使用了响应拦截器。 响应拦截器几乎是一个“过滤器”,所有响应都通过它,我可以询问那里的状态代码并执行逻辑。

类似这样的:

myModule.factory('responseInterceptor', function ($q) 
    return 
        response: function (res) 
           switch(res.status)
             case 401:
                     // do what you want
           
           return res;
        ,
        responseError: function (res) 
            return $q.reject(res);
        
    ;
);

myModule.config(function ($httpProvider) 
    $httpProvider.interceptors.push('responseInterceptor');
);

关于您的自定义消息,您可以将其添加到 http 标头中。 就我而言,当我收到 401 时,我会添加一个带有 url 的位置标头并重定向到它。

【讨论】:

【参考方案2】:

尝试像这样返回HttpResponseMessage

public HttpResponseMessage Get()

    return Request.CreateErrorResponse(
              HttpStatusCode.Unauthorized, "You are not authorized");

这应该会产生这样的 HTTP 响应消息。

HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
Date: Sat, 12 Apr 2014 07:12:54 GMT
Content-Length: 36

"Message":"You are not authorized"

【讨论】:

我需要一个可以抛出 HttpResponseException 异常的解决方案。您使用Request.CreateErrorResponse 的建议让我到了那里。看起来像我之前的代码:throw new HttpResponseException( new HttpResponseMessage(HttpStatusCode.Unauthorized) ReasonPhrase = mymessage ); 当用CreateErrorRespons 重写时解决了问题:throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, mymessage)); 这不适用于 web api 2 btw,因为 IHttpAcionResult 是新的最佳实践。

以上是关于您如何将状态 401 从 WebAPI 返回到 AngularJS 并包含自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章

SPA 模板中的 Web API 在传递用户名和密码时返回状态 401 Unauthorized

NSURLConnection 返回错误而不是响应 401

使 Web API 身份验证返回 401 而不是重定向到登录页面

Apache shiro,返回状态 401 而不是重定向到 url

WebApi 2 在使用自定义 JWT 令牌进行授权时总是返回 401

使用授权标头的react-native fetch有时会返回401