使用$ httpBackend捕获不同的请求

时间:2014-05-15 18:50:23

标签: javascript angularjs

我试图模拟我使用Angular JS构建的应用程序的后端。

我有以下代码来模仿成功的登录请求:

// Login
$httpBackend.when('PUT','/v1/token/',{
    'domain'   : 'farmers',
    'username' : 'user',
    'password' : 'test'
}).respond({
    'token' : 'lalskdfjlskadjfklsadjf'
});

当然,这只有在我传递我在此定义的确切对象时才有效。

我想知道如何更改它以接受PUT/v1/token/的所有请求,无论传递的数据集如何。然后它应该检查传递的数据是否与上面说明的结构匹配,然后返回令牌或失败消息。

这可能吗?

更新:所以我试图让这个工作正常...我已经将一个函数作为.respond()函数的参数,试图预测不同的可能的数据集传递。

的Javascript

// Login
$httpBackend.when('PUT','/v1/token/').respond(function (method, url, data, headers) {
    var validLogin = {
        'domain'   : 'farmers',
        'username' : 'user',
        'password' : 'test'
    };

    if ( data !== validLogin ) {
        return {
            result : 'fail'
        };
    } else {
        return {
            'token' : 'lalskdfjlskadjfklsadjf'
        };
    }
});

但这根本不起作用。现在无论我通过什么,我都会得到一个未定义的错误:

undefined error in Chrome

4 个答案:

答案 0 :(得分:4)

我认为您持续存在的问题源于您从response方法返回的内容。这对我有用:

$httpBackend.when('PUT','/v1/token/')
.respond(function(method, url, data, headers) {
    var validLogin = {
      'domain'   : 'farmers',
      'username' : 'user',
      'password' : 'test'
    };

    if ( data !== JSON.stringify(validLogin)) {
        return [400, {failure: 'bad'}]
    } else {
        return [200, {token: '12345'}]
    } 
});

注意我是如何返回一个值数组(在docs中描述)。

Working Plunker(测试通过是否返回令牌 - 你需要查看控制台)

答案 1 :(得分:2)

请参阅$ httpBackend的文档:https://docs.angularjs.org/api/ngMock/service/ $ httpBackend

您可以使用函数而不是对象来检查数据,它将传入一个字符串。见下文:

编辑你需要把你的" validData"匹配数据函数中的逻辑,而不是响应函数......

// Login
$httpBackend.when('PUT','/v1/token/',function(dataString){
     var validLogin = {
        'domain'   : 'farmers',
        'username' : 'user',
        'password' : 'test'
     };

     var dataObject = JSON.parse(dataString);

     if (dataObject.username && dataObject.password && dataObject.domain) {
        return true;
     }
     else{
        return false;
     }
}).respond({
    'token' : 'lalskdfjlskadjfklsadjf'
});

答案 2 :(得分:0)

文档表明它采用正则表达式,因此您可以执行以下操作:

$httpBackend.when('PUT', /\/v1\/token\/[1-9][0-9]*/)

当然,这只是一个例子。创建自己的正则表达式以匹配。

答案 3 :(得分:0)

您可以使用正则表达式,并且可以使用更深入的回调来完成此操作。以下是虚假API服务器的示例:

$httpBackend.whenGET(/data.*/).respond(function(method, url, data, headers) {
    var query = url.split('?')[1],
        requestParams = {};

    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        requestParams[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
    }

    for (var key in requestParams) {
        if (key.indexOf('[') >= 0) {
            var params = key.split(/\[(.*)\]/), value = requestParams[key], lastKey = '';

            angular.forEach(params.reverse(), function(name) {
                if (name != '') {
                    var v = value;
                    value = {};
                    value[lastKey = name] = isNumber(v) ? parseFloat(v) : v;
                }
            });
            requestParams[lastKey] =
                angular.extend(requestParams[lastKey] || {}, value[lastKey]);
        } else {
            requestParams[key] = 
                isNumber(requestParams[key]) ? parseFloat(requestParams[key]) : requestParams[key];
        }
    }

    var data = [ << a bunch of fake objects >> ];
    << do something to the data based on requestParams >>

    return [200, {
        result: data,
        total: data.length
    }];
});
$httpBackend.whenGET(/.*/).passThrough();