当前位置: 首页 > 知识库问答 >
问题:

如何将状态 401 从 WebAPI 返回到角度 JS,并同时包含自定义消息?

慕容俭
2023-03-14

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

string myCustomMessage = .....;

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

当我使用AngularJS $resource服务调用时,我在promise的catch块的status字段中得到401响应。401匹配< code>HttpStatusCode。未授权,所以一切正常。

然而,问题是响应的数据字段是空的(null)。我没有得到返回的myCustomMessage。

现在,如果不是抛出一个< code > httpresponseeexception 异常,而是抛出一个带有消息的常规< code >异常,该消息确实会使它返回Angular。

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

有人知道如何做到这一点吗?

[编辑]解决方案:

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

共有2个答案

巫马浩言
2023-03-14

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

大概是这样的:

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的位置标题并重定向到它。

龙成仁
2023-03-14

尝试返回<code>HttpResponseMessage<code>如下。

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"}
 类似资料:
  • 问题内容: 在我的WebAPI类中,我进行了如下调用: 当我使用AngularJS 服务进行调用时,我确实在status字段的promise的catch块中得到401响应。401匹配,所以一切顺利。 但是,问题在于响应的数据字段为空(空)。我没有得到myCustomMessage返回。 现在,如果我没有抛出异常,而只是抛出一条带有消息的常规消息,那么该消息确实会使它向Angular倾斜。 我需要能

  • 我正在处理WebAPI 2中的一个服务,endpoint当前返回一个<code>IHttpActionResult<code>。我想返回一个状态代码,但由于它不在枚举中,我不知道如何发送它,因为所有构造函数都需要一个参数 目前,我正在返回<code>BadResult(消息),但返回<code>422

  • 在Spring Boot控制器中,我使用检查用户是否登录(使用基本auth+)。 但是如果用户没有登录,即他们没有经过身份验证,控制器返回。 根据我对身份验证与授权的了解,用于身份验证,而用于授权。 根据我的理解,总是检查用户的授权(顾名思义),但是有什么方法可以根据我们传递给它的参数自定义它,即? 我知道还有另一种解决方案:在中使用基于URL的安全配置,但如果我不想这样做,该怎么办。 有什么想法

  • 我第一次尝试在request angular js中添加customer头,但遇到以下错误 Angular.js:10671错误:在“XMLHttpRequest”上执行“set requestheader”失败:“x-api-key:”不是有效的HTTP标头字段名。 下面是我的代码,在最高的“应用程序”级别: 我做错了什么/错过了什么/不明白什么?我如何将这个头添加到所有(甚至一个)请求中?

  • 我正在尝试使用Angular Material版本7和Angular 6制作一个自定义MatFormFieldControl。自定义输入是一个重量输入,它有一个值(输入类型=“数字”)和一个单位(选择“kg”、“g”、…)。它必须放在mat form字段控件中,使用反应式表单(formControlName=“weight”)并支持错误状态(

  • 像“addSomething()”这样的类也有方法。这个可以成功也可以不成功。因此,成功的状态可以用一个布尔返回值来显示。但是有时方法调用会因为几个原因而失败。“false”显示了这一点,但只是以一般方式显示。有时程序员想知道失败的原因。为此,提供一个自己的报告类来提供这样的功能有用吗? 然后,您可以决定是否要使用“wassucsuccess()”获取一般成功报告,或者是否还要使用“getMess