使用AngularJS $ http处理状态304响应

时间:2017-08-28 04:52:34

标签: javascript angularjs angularjs-http

如果我有一个API服务器,那么API将发送带有JSON格式的ajax数据:

{"status":304,"message":"Cannot delete data where PK is empty or > 1"}

如何在AngularJS $ http后调用状态和消息来提醒bootbox? 这里是我的AngularJS $ http帖子

$http({
  method: "POST",
  url: apiUrl('disable_assethw'),
  data: {
    id: id
  },
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
}).then(function successCallback(response) {
  if(response.status == 304) {
    bootbox.alert("Something went error.." + response.data.message);
  } else {
    $scope.getAssetHW();
  }
}, function errorCallback(response) {
  bootbox.alert("Something went error.." + response.status);
});

感谢您的建议。

2 个答案:

答案 0 :(得分:0)

你说它是 json 响应而你使用了: application / x-www-form-urlencoded ,这是错误的。

处理rest / api调用的最佳做法是:

创建一个可在整个应用程序中访问的公共/通用函数,它将管理你的post api调用(添加对回调的api响应):

  [1]: http://jsfiddle.net/3xa69njt/2/

在需要的地方(在组件或服务中)调用此函数:

postAPICall(url, body, data) {
    let headers = new Headers({'Content-Type': 'application/json'});
    this.http
        .post(url,
            body, {
                headers: headers
            })
        .map(
            response => response.json())
        .subscribe(
            response => {
                data(response);
            },
            err => data(this.handleError(err)); //handle error here
        );
}

错误处理函数:

var yourJSONBody = {
    "param-1": "",
    "param-2": "",
    //....
    }
}

this.myCommonService.postAPICall("localhost:8080/app/", yourJSONBody, data => {
    if (data.status == "304") {
        //do stuff
        //this.msgs.push({severity: 'error', detail: data.message});
    }
    else {
        //do stuff
    }
});

答案 1 :(得分:0)

使用JavaScript对象作为数据执行POST请求时,请使用AngularJS默认内容类型(自动设置为application/json)。 $http service还会自动将JavaScript对象编码为JSON strings

成功处理程序仅处理状态在200-299范围内的响应。范围之外的状态由拒绝处理程序处理:

$http({
  method: "POST",
  url: apiUrl('disable_assethw'),
  data: {
    id: id
  },
  headers: {
    ̶'̶C̶o̶n̶t̶e̶n̶t̶-̶T̶y̶p̶e̶'̶:̶ ̶'̶a̶p̶p̶l̶i̶c̶a̶t̶i̶o̶n̶/̶x̶-̶w̶w̶w̶-̶f̶o̶r̶m̶-̶u̶r̶l̶e̶n̶c̶o̶d̶e̶d̶'̶
  }
}).then(function successCallback(response) {
  ̶i̶f̶(̶r̶e̶s̶p̶o̶n̶s̶e̶.̶s̶t̶a̶t̶u̶s̶ ̶=̶=̶ ̶3̶0̶4̶)̶ ̶{̶
    ̶b̶o̶o̶t̶b̶o̶x̶.̶a̶l̶e̶r̶t̶(̶"̶S̶o̶m̶e̶t̶h̶i̶n̶g̶ ̶w̶e̶n̶t̶ ̶e̶r̶r̶o̶r̶.̶.̶"̶ ̶+̶ ̶r̶e̶s̶p̶o̶n̶s̶e̶.̶d̶a̶t̶a̶.̶m̶e̶s̶s̶a̶g̶e̶)̶;̶
   ̶}̶ ̶e̶l̶s̶e̶ ̶{̶
    $scope.getAssetHW();
  ̶}̶
}, function errorCallback(response) {
  //HANDLE 304 status HERE
  if(response.status == 304) {
    bootbox.alert("Something went error.." + response.data.message);
  } else {
    bootbox.alert("Something went error.." + response.status);
  };
});

来自文档:

  

200到299之间的响应状态代码被视为成功状态,并将导致调用成功回调。任何超出该范围的响应状态代码都被视为错误状态,并将导致调用错误回调。此外,小于-1的状态代码归一化为零。 -1通常表示请求已中止。

     

— AngularJS $http Service API Reference

注意:状态为-1通常表示浏览器拒绝了CORS problem违反same-origin policy的请求。