在$ http调用中,我们可以在url部分传递的所有内容,我有一个服务器地址,一个用户名和密码。我可以将所有作为json对象传递吗?或者我们还有其他任何参数(如url)。 有人可以帮助我理解成功通话中发生的事情。
具体来说,我正在努力的代码是:
app.factory('myFactory',function(){
var fact = {};
fact.getData = function(a){
$http({method:'POST',url:'http://100.100.100.100:8080/xx/xx.xx'});
$http.success(function(reply){a(reply)}
);
};
return fact;
});
请参阅以下代码,但我仍然没有从服务器获取数据,同时也没有错误。
xapp.factory('loginData',function($http,$log){
var fact = {};
fact.getData = function(cred,cb){
return
$http({
method:'post',
url:'xxx.xxx.xxx.xxx:xxxx/xxxxxx',
data:cred})
.success(function(data,status,header,config){
cb(data);
})
.error(function(data,status,header,config){
$log.warn(status);
});
};
return fact;
});
xapp.controller('mainController',function($scope,$log,$http,loginData){
$scope.user = {uesr:'user',password:'123'};
loginData.getData($scope.user,function(data){
$scope.reply = data;
});
});
在控制台日志中,我得到一个'undefined'。如果http网址是正确的,你会看到任何问题吗?
答案 0 :(得分:1)
据我所知,a
参数是一个回调函数,在收到服务器的回复时执行。这会破坏$q
服务提供的承诺的目的。此外,$http
服务本身没有.success
回调。它会返回promise
个对象,其中包含.success
和.error
个回调。这是应该如何做的:
app.factory('myFactory', function() {
var fact = {};
fact.getData = function() {
return $http.get('your/path/to/resource/');
}
return fact;
})
.controller('myCtrl', function($scope, myFactory) {
myFactory.getData().then(function(response){
//response.data holds your data from server
}, function(){
//this fn gets called when error happens
});
});
一些解释:myFactory.getData()
向服务器创建一个新的http请求,并返回一个方法为.then(successCallback, errorCallback)
的promise对象。您可以在请求完成后提供要执行的承诺的回调。
您可能会对我在您的示例中使用的.then(successCallback, errorCallback)
和.success(callback)
感到困惑。 promise
提供的通用$q
具有.then
方法,但$http
服务在返回承诺时提供了快捷方式.success()
和.error()
,但它是同样的事情最终。
答案 1 :(得分:1)
这将解决您发送身体的问题。
app.factory('myFactory', function($http) {
return{
getData : function(body) {
return $http({
url: 'http://100.100.100.100:8080/xx/xx.xx',
method: 'POST',
data:body
})
}
}
});
app.controller('myCtrl', function($scope, $location, $http, myFactory){
var body ={username:uname, password:pass};
myFactory.getData(body).success(function(data){
$scope.data=data;
});
});