角没有得到响应时,它是一个非200 [英] Angular not getting response when it's a non-200
问题描述
我impelmented的httpInterceptor发现这里。
如果我的基本认证头有有效的凭据,一切工作正常,但如果我得到一个401,那么应用程序只是挂起,我从来没有得到答复。
下面是我的拦截器:
angular.module('TDE')。工厂('httpInterceptor',功能httpInterceptor($ Q $窗口,$位置){
复位功能(承诺){
VAR成功=功能(响应){
//window.logger.logIt(\"httpInterceptor收到了很好的回应:+响应);
返回响应;
}; VAR误差=功能(响应){
//window.logger.logIt(\"httpInterceptor收到错误:+响应); 如果(response.status === 401){
$ location.url('/登录');
} 返回$ q.reject(响应);
}; 返回promise.then(成功,错误);
};
});
在声明中app.js httpInterceptor
angular.module('TDE',[]);变种TDE = angular.module('TDE',['UX','ngRoute','ngResource','TDE','hmTouchEvents','无限滚动','ui.bootstrap','ui.sortable'] );TDE.config(['$ routeProvider','$ locationProvider','$ httpProvider',函数($ routeProvider,$ locationProvider,$ httpProvider){
$ httpProvider.responseInterceptors.push('httpInterceptor'); $ routeProvider
。什么时候('/', {})
。当('/登录',{templateUrl:查看/登录/ login.html的控制器的LoginController})
和我的身份验证方法
身份验证:功能(用户名,密码){
// window.logger.logIt(serviceAccount:+ $ rootScope.serviceAccount);
window.logger.logIt(进行认证......); 变种推迟= $ q.defer();
变种EN codeD = EN coder.en code($ rootScope.serviceAccount);
// EN变种codeD = EN coder.en code(用户+:+密码); 如果(用户放大器;&放大器;密码){
window.logger.logIt(我们已经有了一个用户名和密码......); $ http.defaults.headers.common.Authorization ='基本'+ EN codeD; sessionStorage.setItem('授权',$ http.defaults.headers.common.Authorization); VAR URL = $ rootScope.serviceBaseUrl +登录/认证; window.logger.logIt(URL); $ HTTP({
方法:POST,
网址:网址,
数据:{
用户名:用户,
密码:密码,
的accessToken:
},
标题:{
内容类型:应用/ JSON
}
})
.success(功能(数据,状态,头,配置){
window.logger.logIt(我们已经有了一个响应(成功)...); 如果(data.IsAuthenticated){
deferred.resolve(数据);
session.setSession();
}其他{
deferred.reject(状态);
}
})
.error(功能(数据,状态,头,配置){
window.logger.logIt(我们已经有了一个响应(错误)......); $ dialogservice.showMessage(验证错误,返回code:+状态);
deferred.reject(状态);
});
}其他{
window.logger.logIt(我们已经得到了响应......); deferred.reject(401);
} 返回deferred.promise;
},
您会看到我的身份验证方法,有两条线,我是测试:
变种EN codeD = EN coder.en code($ rootScope.serviceAccount);
和
变种EN codeD = EN coder.en code(用户+:+密码);
我们需要使用基本身份验证(这是通过SSL)。目前,所有我测试的是,我可以收到401回。如果我使用$ rootScope.serviceAccount(这是工作),我得到一个200响应的时候了。但是,如果我故意发坏的用户名/密码,我从来没有得到回应,应用程序只是坐在那里。
编辑:确定,我已经更新了我的code到以下内容,仍然得到同样的行为:
角
.module('TDE')
的.config(['$ httpProvider',函数($ httpProvider){ $ httpProvider.interceptors.push(函数($ Q){
返回{
请求:功能(配置){
window.logger.logIt(请求被发送...); VAR头= config.headers; 如果(!headers.Authorization){
headers.Authorization = sessionStorage.getItem('授权');
} 返回配置|| $ q.when(配置);
}, 回应:功能(响应){
window.logger.logIt(得到了不错的反响......); 返回响应;
}, responseError':函数(拒绝){
window.logger.logIt(responseError错误...); 返回$ q.reject(拒绝);
},
};
});
}]);
好了,再次的PhoneGap是!!!!!!!!!!!!!!!!!
问题<一个href=\"http://stackoverflow.com/questions/12060619/not-getting-401-unauthorised-with-cordova-jquery-ajax-call-upto-phonegap-1-4-i\">Example 1
<一个href=\"http://me.eekay.nl/index.php/2014/cordovaphonegap-and-the-missing-callback-for-401-unauthorized/\"相对=nofollow>例2
I've impelmented the httpInterceptor found here.
If my Basic Auth header has valid credentials, everything works fine, but if I get back a 401, then the application just hangs and I never receive a response.
Here's my interceptor:
angular.module('TDE').factory('httpInterceptor', function httpInterceptor ($q, $window, $location) {
return function (promise) {
var success = function (response) {
//window.logger.logIt("httpInterceptor received a good response: " + response);
return response;
};
var error = function (response) {
//window.logger.logIt("httpInterceptor received an error: " + response);
if (response.status === 401) {
$location.url('/login');
}
return $q.reject(response);
};
return promise.then(success, error);
};
});
Declaring the httpInterceptor in app.js
angular.module('TDE', []);
var TDE = angular.module('TDE', ['ux', 'ngRoute', 'ngResource', 'TDE', 'hmTouchEvents', 'infinite-scroll', 'ui.bootstrap', 'ui.sortable']);
TDE.config(['$routeProvider', '$locationProvider', '$httpProvider', function ($routeProvider, $locationProvider, $httpProvider) {
$httpProvider.responseInterceptors.push('httpInterceptor');
$routeProvider
.when('/', {})
.when('/login', { templateUrl: "Views/Login/login.html", controller: "LoginController" })
And my authenticate method
authenticate: function (user, password) {
// window.logger.logIt("serviceAccount: " + $rootScope.serviceAccount);
window.logger.logIt("In authenticate...");
var deferred = $q.defer();
var encoded = encoder.encode($rootScope.serviceAccount);
//var encoded = encoder.encode(user + ":" + password);
if (user && password) {
window.logger.logIt("We've got a username and password...");
$http.defaults.headers.common.Authorization = 'Basic ' + encoded;
sessionStorage.setItem('Authorization', $http.defaults.headers.common.Authorization);
var url = $rootScope.serviceBaseUrl + "login/authenticate";
window.logger.logIt(url);
$http({
method: "POST",
url: url,
data: {
"Username": user,
"Password": password,
"AccessToken": ""
},
headers: {
"Content-Type": "application/json"
}
})
.success(function (data, status, headers, config) {
window.logger.logIt("We've got a response (success)...");
if (data.IsAuthenticated) {
deferred.resolve(data);
session.setSession();
} else {
deferred.reject(status);
}
})
.error(function (data, status, headers, config) {
window.logger.logIt("We've got a response (error)...");
$dialogservice.showMessage("Authentication Error", "Return Code: " + status);
deferred.reject(status);
});
} else {
window.logger.logIt("We've got a response...");
deferred.reject(401);
}
return deferred.promise;
},
You'll see that in my Authenticate method, there are two lines that I'm testing:
var encoded = encoder.encode($rootScope.serviceAccount);
and
var encoded = encoder.encode(user + ":" + password);
We are REQUIRED to use Basic Authentication (which is over SSL). Right now, all I'm testing is that I can receive a 401 back. If I use the $rootScope.serviceAccount (which is working), I get a 200 response right away. But if I purposely send a bad username/password, I NEVER get a response, the application just sits there.
Edit: Ok, I've updated my code to the following, and still getting the same behavior:
angular
.module('TDE')
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(function ($q) {
return {
'request': function (config) {
window.logger.logIt("Request is being sent...");
var headers = config.headers;
if (!headers.Authorization) {
headers.Authorization = sessionStorage.getItem('Authorization');
}
return config || $q.when(config);
},
'response': function (response) {
window.logger.logIt("got a good response...");
return response;
},
'responseError': function (rejection) {
window.logger.logIt("responseError error...");
return $q.reject(rejection);
},
};
});
}]);
Well, again, PhoneGap is the issue!!!!!!!!!!!!!!!!!
这篇关于角没有得到响应时,它是一个非200的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!