我试图模拟我使用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'
};
}
});
但这根本不起作用。现在无论我通过什么,我都会得到一个未定义的错误:
答案 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();