【问题标题】:Why does angularjs discard the message response for http status codes <200 && >300?为什么angularjs会丢弃http状态码<200 && >300的消息响应?
【发布时间】:2016-04-10 20:20:00
【问题描述】:

如果状态码小于 200 且大于 300,我一直在寻找使用 $http 在 angularjs 中看不到 webapi 响应的原因。

我已经将 angular.js 调试到我了解发生了什么的程度(基本上它会丢弃包含我关心的数据的承诺,如果状态码不被视为成功,则在没有它的情况下创建一个新的承诺)

-参见https://github.com/angular/angular.js/blob/master/src/ng/q.js#L270-L280的代码

this.$$state.value(保存 http 响应)由于某种原因在此时丢失。

省略原始值是否有意义?我不会在不在这里询问我是对还是错的情况下提交错误报告。

这一切背后的原因是我正在服务器端处理一些信用卡信息。如果处理器说它是无效卡,我认为它不会是 200 代码,对吗?请参阅此问题的答案.....建议业务规则为 400。这在 angularjs 中仍然失败。

What is the appropriate HTTP status code response for a general unsuccessful request (not an error)?

另外,仅供参考,httpInterceptor 也不起作用,因为它们是在发生这种“承诺替换”之后使用的。

【问题讨论】:

  • 我不确定在你的问题末尾重复你的标题如何让 Stack Overflow 成为一个非常好的问题。
  • 这不是唯一一个这样做的 http 客户端:我在 Oracle Service Bus 的 http 连接器上遇到了类似的问题,它丢弃了对某些代码的响应。这是一种优化,他们认为某些代码的错误消息无关紧要。
  • 你提到的Angular代码部分与HTTP状态码完全无关。
  • 很确定你的意思是在 http.js 中引用 isSuccess
  • Angular 的 $http 返回接收到的数据,不管状态码如何。向我们展示一些你如何使用它的代码。

标签: angularjs angular-promise angularjs-http


【解决方案1】:

来自文档:

200 到 299 之间的响应状态代码被视为成功状态,将导致调用成功回调。任何超出该范围的响应状态码都被视为错误状态,并会导致调用错误回调。

— AngularJS $http Service API Reference - General Usage

$http 服务拒绝 200 到 299 范围之外的响应,但它不会“丢弃消息响应”。 $http promise 的 resolve 和 reject 方法都被整个响应对象调用。

这意味着拒绝处理程序中的所有数据都可用。

var dataPromise = $http(configObject)
    .then (function onFulfilled(response) {
        //return data for chaining
        return response.data;
     })
     .catch (function onRejected(response) {
         if (response.status == 400) {
             console.log("400 Bad Request");
             console.log("REASON:", response.data);
             //chain with default data
             return defaultData;
         } else {
             //throw to chain rejection
             throw response;
         }
    });

在上面的示例中,拒绝处理程序记录状态为 400 的消息的响应,并将拒绝转换默认数据实现。所有其他状态响应都被链接为拒绝。

数据不会被丢弃;它可用并且可以在拒绝处理程序中使用。

有关链接承诺的更多信息,请参阅Angular execution order with $q

【讨论】:

    【解决方案2】:

    当你使用 promise 回调 then、catch 和 finally 在 $resource 调用之后编写状态代码吗?

    这是我要检查的内容:

    MyRestAPI.XXX({resource}, {data}, MyCallbackFunction).$promise.catch(function(response) {
        //should be called upon error
        //check response.status for HTTP code.
    }).then(function() {
         // OK 
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多