AngularJS 1.2rc(x)でngResource
を使用して、ステータスコードを取得するにはどうすればよいですか?
_RestAPI.save({resource}, {data}, function( response, responseHeaders ) {
});
_
ここで、RestAPI
は私のngResource
です。
応答には_$promise
_オブジェクトとサーバーから返されたリソースが含まれていますが、ステータスは含まれていません。 responseHeaders()
関数は、サーバーがヘッダーオブジェクトにステータスコードを挿入した場合にのみステータスを持ちますが、真の戻りステータスコードは持ちません。そのため、一部のサーバーがサービスを提供する場合と提供しない場合があります。
$resource
呼び出しの後に、promissコールバックthen
、catch
およびfinally
を使用できます。
例えば。呼び出し後にエラーをキャッチしたい場合は、次のようにします。
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
プロパティもあります。
編集:提案されたように、それは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
関数への3番目のパラメータとしてステータスコードにアクセスしたように見えます since angular 1. 、しかし、それは $ resource ドキュメントに適切に文書化されていませんでした。
次のような応答ステータスを取得できます。
$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
})
responseHeaders()
関数は応答のヘッダーのみを返すことに同意しましたが、それをカスタマイズすることができ、とにかく便利です。
あなたの問題を解決します。以下で:(_$$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
});
_
このように、uはERROR応答でstatus,statusText,timeout,method,headers(same with responseHeaders)
のみをキャッチできます。
成功応答で応答の詳細を表示する場合は、次のようなインターセプターを使用しました。
_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");
}])
_
正しい答えは、バーディエルとアラの答えの組み合わせだと思います。
リソース宣言内にインターセプターを追加した後。このような:
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);
});
私はAngularJS 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);
});
}
ドキュメントにあるように、応答オブジェクトには次のプロパティがあります。
- data – {string | Object} –変換関数で変換された応答本文。
- status – {number} –応答のHTTPステータスコード。
- headers – {function([headerName])} –ヘッダーゲッター関数。
- config – {Object} –要求の生成に使用された構成オブジェクト。
- statusText – {string} –応答のHTTPステータステキスト。
https://docs.angularjs.org/api/ng/service/$http を参照してください
それが役に立てば幸い!