sourcecode

AngularJS 1.2에서 HTTP 응답 상태 코드를 얻는 방법

copyscript 2023. 3. 15. 19:53
반응형

AngularJS 1.2에서 HTTP 응답 상태 코드를 얻는 방법

사용.ngResourceAngularJS 1.2rc(x)에서 상태 코드를 지금 받으려면 어떻게 해야 하나요?

RestAPI.save({resource}, {data}, function( response, responseHeaders ) {
});

어디에RestAPI나의ngResource.

응답은$promise개체와 리소스가 서버에서 반환되었지만 상태는 더 이상 아닙니다.responseHeaders()이 함수는 서버가 헤더 객체에 상태 코드를 삽입하는 경우에만 상태를 가지며 실제 반환된 상태 코드는 가지지 않습니다.따라서 서버에 따라서는 서비스를 제공할 수도 있고 그렇지 않을 수도 있습니다.

약속 콜백을 사용할 수 있습니다.then,catch그리고.finally그 후$resource불러.

예를들면.콜 후에 에러를 검출하는 경우는, 다음과 같이 실시합니다.

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

response오브젝트에는status및 그statusText특성. status정수 상태 코드 및statusText본문또, 이 머신을data서버 응답을 포함하는 속성.

edit : 제안대로response.status

리소스 선언 안에 인터셉터를 추가해야 합니다.다음과 같이 합니다.

var resource = $resource(url, {}, {
    get: {
        method: 'GET'
        interceptor: {
            response: function(response) {      
                var result = response.resource;        
                result.$status = response.status;
                return result;
            }
        }
    }                            
});

사용방법:

resource.get(params, function(result) {
    console.log(result.$status)
});

IMO 상태 코드는 기본적으로 제공되어야 합니다.이 https://github.com/angular/angular.js/issues/8341에 문제가 있습니다.

새로운 버전의 Angular를 사용하는 사용자라면 상태 코드에 액세스 할 수 있습니다.transformResponseangular 1.3부터 기능하고 있습니다만, $resource 문서에는 제대로 기재되어 있지 않습니다.

나는 동의했다responseHeaders()이 함수는 응답의 헤더만 반환하지만 사용자가 커스터마이즈할 수 있어 유용합니다.

1.

너의 문제를 해결하기 위해서.이하와 함께:$$service는 나의 $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
    });

이런 식으로, 당신은 오직status,statusText,timeout,method,headers(same with responseHeaders)ERROR 응답에 있습니다.

2.

성공 응답에서 응답 세부 정보를 보려면요격기를 이렇게 썼어요

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

다음으로 모듈에 인터셉터를 추가합니다.

.config(["$httpProvider", function ($httpProvider) {
    $httpProvider.interceptors.push("baseInterceptor");
}])

다음과 같은 응답 상태를 얻을 수 있습니다.

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

Angular를 사용하고 있습니다.JS v1.5.6에서는 다음과 같이 실행합니다(이 경우 "getData" 메서드를 서비스 내부에 넣습니다).

function getData(url) {
    return $q(function (resolve, reject) {
        $http.get(url).then(success, error);

        function success(response) {
            resolve(response);
        }
        function error(err) {
            reject(err);
        }
    });
}

다음으로 컨트롤러(예를 들어)에서 다음과 같이 호출합니다.

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

매뉴얼에 기재되어 있듯이 응답 오브젝트에는 다음 속성이 있습니다.

  • 데이터 – {string|Object} – 변환 함수를 사용하여 변환된 응답 본문.
  • status – {number} : 응답의 HTTP 상태 코드.
  • 헤더 – {function([headerName])} – 헤더게터 기능
  • config – {Object} : 요청을 생성하기 위해 사용된 설정 객체.
  • statusText: {string}: 응답의 HTTP 상태 텍스트.

https://docs.angularjs.org/api/ng/service/$http 를 참조해 주세요.

도움이 됐으면 좋겠다!

바르디엘과 아라의 답이 합쳐진 것 같아요.

리소스 선언에 인터셉터를 추가한 후.다음과 같이 합니다.

var resource = $resource(url, {}, {
    get: {
        method: 'GET'
        interceptor: {
            response: function(response) {      
                var result = response.resource;        
                result.$status = response.status;
                return result;
            }
        }
    }                            
});

다음과 같이 사용합니다.

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

나도 비슷한 문제에 직면했었다.angular lib를 조사하여 응답 자체에 상태가 반환되도록 몇 줄을 추가했습니다.이 파일에서 약속을 어디서 돌려받는지 찾아봐

다음으로 시작하는 코드 블록 교체

var promise = $http(httpConfig).then(기능(응답))

다음과 같이

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

또는 이 행을 추가할 수 있습니다.

value.status = response.status;

다음으로 response.status와 같은 코드로 액세스 상태를 나타냅니다.그래도 이건 일종의 해킹이지만 나한테는 통했어미니 버전도 변경해야 했습니다.

언급URL : https://stackoverflow.com/questions/18729556/how-do-i-get-the-http-response-status-code-in-angularjs-1-2

반응형