您如何将状态 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
使 Web API 身份验证返回 401 而不是重定向到登录页面
Apache shiro,返回状态 401 而不是重定向到 url