角没有得到响应时,它是一个非200 [英] Angular not getting response when it's a non-200

查看:113
本文介绍了角没有得到响应时,它是一个非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

例3

例4

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!!!!!!!!!!!!!!!!!

Example 1

Example 2

Example 3

Example 4

这篇关于角没有得到响应时,它是一个非200的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆