2

My factory for making request is here:

angular.module('myapp').factory('testResponse',
        ['$http', '$resource', 'AppConfig', '$routeParams', '$rootScope',
            function($http, $resource, $routeParams, $rootScope) {
                $http.defaults.headers.common['Authorization'] = authorizationHeader;
                $http.defaults.headers.post['Content-Type'] = 'application/json';
                return $resource('test.json'), {}, {
                    query: {method: 'GET'}
                };
            }]);

The code in controller is here:

angular.module('myapp').controller('TestCtrl',
        ['$http', '$scope', 'testResponse', 'AppConfig', function TestCtrl($http, $scope, testResponse) {
                testResponse.query(function(data) {
                    console.log(data.status);
                })
            }]);

Ideally it should log the status as in $http request but I am unable to get it for $reource

Samdeesh
  • 905
  • 11
  • 23
  • The point is you don't need the status when dealing with successful requests for resources. And as for logging: An interceptor seems to be the more appropriate tool for that. But you are right: the status is not available. – a better oliver Dec 26 '14 at 16:36
  • What can be done to check cases like 404, 500 or 403 etc – Samdeesh Dec 29 '14 at 06:46
  • Those are failure cases. You deal with them in the failure handler and there you have access to the status. Your example only uses a success handler. – a better oliver Dec 29 '14 at 14:49
  • Thanks @zeroflagL ! I tried [This snippet](http://stackoverflow.com/questions/20584367/how-to-handle-resource-service-errors-in-angularjs), but I am still not able to handle failure cases. it caused another error "undefined" ie $promise is not a function and when i injected it, I got Unknown provider $promiseprovider<$promise – Samdeesh Dec 30 '14 at 07:50
  • 1
    Another example of why `$resource` should not be used... accessing the status code on success is not an unusual scenario... this data should be made available by default, not hidden from you – Aurelio Nov 13 '17 at 14:23

3 Answers3

6

In service testResponse you can change your return statement to this

return $resource('test.json'), {}, {
    query: {
        method: 'GET',
        transformResponse: function(data, headers,statusCode) {
            console.log(statusCode);//prints 200 if nothing went wrong
            var finalRsponse = {
                data: data,
                responseStatusCode: statusCode
            };
        return finalRsponse;
    }}
};

And in your controller's success method of then(success,error) of testResponse service you can access the status code using data.responseStatusCode.

I have tested it on angularjs-1.2.32 and 1.5.7.

Aurelio
  • 24,702
  • 9
  • 60
  • 63
Alok Mishra
  • 926
  • 13
  • 39
0
['$http', '$resource', 'AppConfig', '$routeParams', '$rootScope',
        function($http, $resource, $routeParams, $rootScope) {

You have missed AppConfig parameter.

punund
  • 4,321
  • 3
  • 34
  • 45
0

I tried use promises with $q to handle this kind of scenario where I had to have more control on failure or success. I refactored the factory like here:

var defObj = $q.defer();
  var testResponse = $resource('https://jsonplaceholder.typicode.com/posts/1', {}, {
    query: {
      method: 'GET'
    }
  });
  testResponse.query().$promise.then(function(data) {
    //you can add anything else you want inside this function
    defObj.resolve(data);
    console.log(defObj, data);
  }, function(error) {
    //you can add anything else you want inside this function
    console.error("Service failure: " + error);
  });
  return defObj.promise;
}

Here is the complete solution in this pen (uses mock json to simulate the response)

Samdeesh
  • 905
  • 11
  • 23