Обработка ответа Status 304 с помощью AngularJS $http

Если у меня есть один сервер API, то API отправляет данные ajax в формате JSON:

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

как отправить сообщение AngularJS $http, вызвать статус и сообщение, чтобы предупредить загрузочный ящик? вот мой пост 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);
});

спасибо за совет.


person ikwijaya    schedule 28.08.2017    source источник
comment
вы сказали, что это json, а здесь вы упомянули {'Content-Type': 'application/x-www-form-urlencoded'}   -  person harishr    schedule 28.08.2017
comment
Если вы не изменили requestTransformer по умолчанию, {id: id} определенно не является допустимой полезной нагрузкой для запроса application/x-www-form-urlencoded.   -  person Phil    schedule 28.08.2017
comment
Подождите, это JSON в верхней части вашего вопроса — полезная нагрузка ответа с сервера? Если да, то вы хотите if (response.data.status == 304)   -  person Phil    schedule 28.08.2017
comment
извините за тип контента, я имею в виду. как вызвать атрибут {"status":304,"message":"Cannot delete data where PK is empty or > 1"} like success в jquery. Извините за мой плохой английский   -  person ikwijaya    schedule 28.08.2017
comment
спасибо за помощь, я нашел свое решение, просто позвоните, как вы сказали, @phil response.data.status / message. Затем я очищаю кеш своего браузера и получаю предупреждение. Поблагодарить всех.   -  person ikwijaya    schedule 28.08.2017


Ответы (2)


При выполнении запроса POST с объектами JavaScript в качестве данных используйте тип контента AngularJS по умолчанию (который автоматически устанавливается на application/json). https://docs.angularjs.org/api/ng/service/$http также автоматически кодирует объекты JavaScript как строки JSON.

Только ответы со статусом в диапазоне 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 обычно означает, что запрос был прерван.

https://docs.angularjs.org/api/ng/service/$http

Примечание. Статус -1 обычно означает, что браузер отклонил запрос с проблема CORS, которая нарушает политика того же источника.

person georgeawg    schedule 28.08.2017

вы сказали, что это ответ json и использовали: application/x-www-form-urlencoded , что неверно.

Лучшая практика для обработки вызовов rest/api:

Создайте 1 общую/общую функцию, доступную во всем приложении, которая будет управлять вашим почтовым вызовом API (добавьте ответ API на обратный вызов):

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
    }
});

функция обработки ошибок:

private handleError(error: any) {
    let description = 'There was an error: ' + error.status;
    let errors = {
        errorcode: error.status,
        errorstatus: error.statusText,
        errordescription: description
    };
    return errors;
}
person user3145373 ツ    schedule 28.08.2017
comment
Напишите мне, если вы столкнулись с какой-либо проблемой или ошибкой, или если я что-то упустил. - person user3145373 ツ; 28.08.2017
comment
В вашем ответе используется API Angular 2+ http. Вопрос для AngularJS https://docs.angularjs.org/api/ng/service/%24http - person georgeawg; 28.08.2017