AngularJS 1.2에서 HTTP 응답 상태 코드를 얻는 방법
사용.ngResource
AngularJS 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를 사용하는 사용자라면 상태 코드에 액세스 할 수 있습니다.transformResponse
angular 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