then headers example angularjs httpresponse response-headers

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