headers - http then angularjs
¿Cómo obtengo el código de estado de respuesta HTTP en AngularJS 1.2? (8)
Al usar ngResource
en AngularJS 1.2rc (x), ¿cómo obtengo el código de estado ahora?
RestAPI.save({resource}, {data}, function( response, responseHeaders ) {
});
donde RestAPI
es mi ngResource
.
La respuesta tiene el objeto $promise
y el recurso devuelto desde el servidor pero ya no es un estado. La función responseHeaders()
solo tiene un estado si el servidor inyecta el código de estado en el objeto del encabezado, pero no el verdadero código de estado devuelto. Así que algunos servidores pueden servirlo y otros no.
Acepté que la función responseHeaders()
solo devolverá el encabezado de la respuesta, pero puedes personalizarla y es útil de todos modos.
1.
Para resolver tu problema. Con lo siguiente :( $$service
es mi instancia de $ resource.)
var serve = new $$service();
serve.id = "hello_wrongPath"; // wrong path,will return 404
serve.$get()
.then(function (data) {
console.log("~~~hi~~~");
console.log(data);
return data;
})
.catch(function (error) {
console.log("~~~error~~~");
console.log(error);
console.log(error.status); // --> 404
console.log(error.statusText); // --> "Not Found"
console.log(error.config.timeout); // --> 5000
console.log(error.config.method); // --> GET
console.log(error.config.url); // --> request url
console.log(error.headers("content-type"));// --> "text/plain"
return error.$promise;
})
.finally(function(data){
console.log("~~~finally~~~");
console.log(data); // --> undefined
});
De esta manera, u solo puede capturar status,statusText,timeout,method,headers(same with responseHeaders)
en ERROR response.
2.
Si desea ver los detalles de la respuesta en la respuesta correcta, usé un interceptor como este:
ng.module("baseInterceptor", [])
.factory("baseInterceptor", ["$q", function ($q) {
return {
''request'': function (config) {
console.info(config);
//set timeout for all request
config.timeout = 5000;
return config;
},
''requestError'': function (rejection) {
console.info(rejection);
return $q.reject(rejection);
},
''response'': function (response) {
console.log("~~interceptor response success~~");
console.log(response);
console.log(response.status);
console.log(response.config.url);
return response;
},
''responseError'': function (rejection) {
console.log("~~interceptor response error~~");
console.log(rejection);
console.log(rejection.status);
return $q.reject(rejection);
}
};
}]);
y luego agregar interceptor al módulo:
.config(["$httpProvider", function ($httpProvider) {
$httpProvider.interceptors.push("baseInterceptor");
}])
Creo que la respuesta correcta es una combinación de las respuestas de Bardiel y Ara.
Después de agregar un interceptor dentro de su declaración de recursos. Me gusta esto:
var resource = $resource(url, {}, {
get: {
method: ''GET''
interceptor: {
response: function(response) {
var result = response.resource;
result.$status = response.status;
return result;
}
}
}
});
Úsalo como abajo:
RestAPI.save()
.query(function(response) {
// This will return status code from API like 200, 201 etc
console.log(response.$status);
})
.$promise.catch(function(response) {
// This will return status code from server side like 404, 500 etc
console.log(response.status);
});
Debe agregar un interceptor dentro de su declaración de recursos. Me gusta esto:
var resource = $resource(url, {}, {
get: {
method: ''GET''
interceptor: {
response: function(response) {
var result = response.resource;
result.$status = response.status;
return result;
}
}
}
});
Uso:
resource.get(params, function(result) {
console.log(result.$status)
});
El código de estado de la OMI debería haberse proporcionado de forma predeterminada. Hay un problema para este https://github.com/angular/angular.js/issues/8341
Estoy usando AngularJS v1.5.6, y lo hago así (en mi caso, puse el método "getData" dentro de un servicio):
function getData(url) {
return $q(function (resolve, reject) {
$http.get(url).then(success, error);
function success(response) {
resolve(response);
}
function error(err) {
reject(err);
}
});
}
luego en el controlador (por ejemplo), llame a eso de esta manera:
function sendGetRequest() {
var promise = service.getData("someUrlGetService");
promise.then(function(response) {
//do something with the response data
console.log(response.data);
}, function(response) {
//do something with the error
console.log(''Error status: '' + response.status);
});
}
Como dice la documentación, el objeto de respuesta tiene estas propiedades:
- data - {string | Object} - El cuerpo de respuesta transformado con las funciones de transformación.
- estado - {número} - código de estado HTTP de la respuesta.
- headers - {function ([headerName])} - función de obtención de encabezado.
- config - {Object} - El objeto de configuración que se utilizó para generar la solicitud.
- statusText - {string} - Texto de estado HTTP de la respuesta.
Ver https://docs.angularjs.org/api/ng/service/$http
¡Espero eso ayude!
Me había enfrentado al problema similar. Miré la libreta angular y agregué algunas líneas para devolver el estado a la respuesta misma. En este archivo, encuentre dónde se devuelve la promesa.
Reemplace el bloque de código que comienza con
promesa de var = $ http (httpConfig) .then (función (respuesta)
con lo siguiente
var promise = $http(httpConfig).then(function(response) {
var data = response.data,
promise = value.$promise;
if (data) {
// Need to convert action.isArray to boolean in case it is undefined
// jshint -W018
if ( angular.isArray(data) !== (!!action.isArray) ) {
throw $resourceMinErr(''badcfg'', ''Error in resource configuration. Expected '' +
''response to contain an {0} but got an {1}'',
action.isArray?''array'':''object'', angular.isArray(data)?''array'':''object'');
}
// jshint +W018
if (action.isArray) {
value.length = 0;
forEach(data, function(item) {
value.push(new Resource(item));
});
} else {
copy(data, value);
value.$promise = promise;
}
}
value.status = response.status;
value.$resolved = true;
response.resource = value;
return response;
}, function(response) {
value.status = response.status;
value.$resolved = true;
(error||noop)(response);
return $q.reject(response);
});
o puedes agregar esta linea
value.status = response.status;
y luego acceda al estado en el código como reponse.status. Aun así, esto es una especie de truco pero funcionó para mí. También tuve que hacer cambios en la versión minificada.
Para cualquiera que use una versión más reciente de Angular, parece que hemos tenido acceso al código de estado como un tercer parámetro de la función transformResponse
desde el ángulo 1.3 , pero nunca se documentó correctamente en los documentos de $resource .
Puede obtener un estado de respuesta como este:
$http.get(url).then(function(response){
console.log(response.status); //successful status like OK
}, function(response){
console.log(response.status); //error status like 400-Bad Request
})
Puede usar las devoluciones de llamada promesas, catch
y finally
después de la llamada de $resource
.
Por ejemplo. Si desea detectar un error después de una llamada, haría algo como esto:
RestAPI.save({resource}, {data}, callbackFunction).$promise.catch(function(response) {
//this will be fired upon error
if(response.status == 500) alert(''Something baaad happend'');
}).then(function() {
//this will be fired upon success
});
El objeto de response
tendrá el status
y las propiedades statusText
. status
es un código de estado entero y el estado Texto del texto. También tendrá la propiedad de data
contiene la respuesta del servidor.
edición: como se sugirió, era response.status