有没有办法返回一个模仿调用的HttpPromise(或类似的东西)$http?我想设置一个全局变量,指示是否发出了真正的HTTP请求,或者是否使用伪数据返回了假的HttpPromise对象.
例如,我有一个与此类似的服务:
angular
.module('myservice')
.factory('MyService', ['$http', function($http) {
return {
get : function(itemId) {
if (isInTestingMode) {
// return a promise obj that returns success and fake data
}
return $http.get("/myapp/items/" + itemId);
}
};
} ]);
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我调用上述类似于此的服务:
// Somewhere in my controller
MyService.get($scope.itemId)
.success(function(data) {
$scope.item = data;
})
.error(function(data, status, headers, config) {
$scope.notFound = true;
});
Run Code Online (Sandbox Code Playgroud)
我试图不改变控制器代码; 在我的"isInTestMode"中,我希望success和error链接仍然有效.是否有可能以HttpPromise我在服务中描述的方式伪造一个?
下面是上面的"MyService"修订版(一个片段),其中包含一个success和error在promise对象上.但是,我该如何执行该success方法?
return { …Run Code Online (Sandbox Code Playgroud) 我使用Angular.js $httpBackend来测试一些包装$http调用的服务(这是在ngMock中,而不是 ngMockE2E).
看来,喜欢的东西expect和when对的URL查询参数的顺序是敏感的.例如,如果我这样做,$httpBackend.when('POST','/apiCall?X=1&Y=2').respond(/* ... */)或者如果我在$httpBackend.expectPOST('/apiCall?X=1&Y=2')URL中有Y = 2和X = 1而不是X = 1和Y = 2,则会出现URL不匹配.
我想以这样一种方式编写我的测试,即被测试的服务可以自由地更改URL查询字符串参数的顺序而不会破坏测试.我在$ httpBackend文档中找不到任何解决方法.这样做的正确方法是什么?
angularjs angular-http httpbackend angularjs-http angular-mock
我熟悉Jquery AJAX调用,它有不同的回调,如beforeSend,success,complete等.
这是使用Jquery的示例AJAX调用:
$.ajax({
url: 'register.php',
type: 'POST',
data: {name:name, email:email},
beforeSend: function() {
// show loading GIF
},
complete: function() {
// hide loading GIF
},
success: function(data) {
// parse response
}
});
Run Code Online (Sandbox Code Playgroud)
我希望使用AngularJS实现相同的目标.
对于AngularJS AJAX请求,是否有像beforeSend之类的回调?这是我的代码到目前为止,但我不知道我在哪里可以使用像beforeSend之类的回调(以便我可以在我的代码中显示加载的GIF图像):
$http.post('register.php', {'name': $scope.name, 'email': $scope.email})
.success(function(data, status, headers, config) {
if (data != '') {
}
});
Run Code Online (Sandbox Code Playgroud) 关于此错误的其他帖子总是包括有人试图在不使用安全申请的情况下申请$,但在我的示例中并非如此.我的功能是成功返回我从API请求的数据,但我无法清除这个错误,这让我疯狂.每次在$ http函数中调用.success之前,我都会在控制台中看到"错误:[$ rootScope:inprog] $ digest已在进行中".以下是我的控制器和服务.谢谢!
这是我的服务,包括使用有效负载发布$ http呼叫的功能:
Services.service( 'CoolService', ['$q', '$rootScope', '$http', 'Auth', function($q, $rootScope, $http, Auth){
var service = {
create: function(payload){
var deferred = $q.defer();
$http({
'url': '/api/endpoint/',
'dataType':'json',
'method': 'POST',
data: payload
}).success(function(data,status, headers, config){
deferred.resolve(data);
})
.error(function(data, status, headers, config){
deferred.reject("Error in request.");
});
return deferred.promise;
}
}
return service;
}]);
Run Code Online (Sandbox Code Playgroud)
这是我的控制器调用服务:
controllers.controller('CoolCtrl',['$scope', '$modal', '$log','CoolService', function($scope, $modal, $log, CoolService){
getCoolData = function (input_data) {
CoolService.create(input_data).then(function(results){
new_cool = results.results;
}, function(error){
console.log("there was an error getting new …Run Code Online (Sandbox Code Playgroud) angularjs angularjs-service angularjs-controller angularjs-http
我目前正在使用angular的$ q服务来进行API调用,如下所示:
var deferred = $q.defer();
$http.get(config.apiHost + details.url)
.success(function (data) {
deferred.resolve(data);
}).error(function (msg) {
deferred.reject(msg);
});
return deferred.promise;
Run Code Online (Sandbox Code Playgroud)
但是我们也可以在不使用$ q的情况下使用这种方法:
return $http.get(config.apiHost + details.url)
.success(function (data) {
return data;
}).error(function (msg) {
return msg;
});
Run Code Online (Sandbox Code Playgroud)
并且当$ http本身返回承诺时,我也可以使用更简化的方法:
$http.get(config.apiHost + 'posts')
.success(function (data) {
console.log(data)
}).error(function (msg) {
console.log(msg);
});
Run Code Online (Sandbox Code Playgroud)
那么所有这些特别是在$ q和$ http之间有什么区别,因为两者都返回promise并且都是异步的?angular是否为$ q提供了一些额外的功能?我找不到任何好的答案.
我试图为每个API调用添加带有访问令牌的标头.它适用于所有GET请求,但是一旦我尝试发布POST,就不会添加标头.
以下是我添加令牌的方法:
app.factory('api', function ($http, $cookies) {
return {
init: function (token) {
$http.defaults.headers.common['Token'] = token || $cookies.loginTokenCookie;
}
};
});
Run Code Online (Sandbox Code Playgroud)
从这里调用的是:
app.run(function ($cookies, $http, $location, $rootScope,api) {
$rootScope.location = $location;
api.init();
});
Run Code Online (Sandbox Code Playgroud)
我尝试过如下操作:
app.factory('api', function ($http, $cookies) {
return {
init: function (token) {
$http.defaults.headers.common['Token'] = token || $cookies.loginTokenCookie;
$http.defaults.headers.post['Token'] = token || $cookies.loginTokenCookie;
}
};
});
Run Code Online (Sandbox Code Playgroud)
但这也行不通.它仅在我更改标题键名称时才有效,如下所示:
$http.defaults.headers.post['Token-Post'] = token || $cookies.loginTokenCookie;
Run Code Online (Sandbox Code Playgroud)
如何在AngularJs中为帖子分配默认标头并获取请求?
app.controller('myController', ['$scope', '$http', '$filter', function($scope, $http, $filter) {
Run Code Online (Sandbox Code Playgroud)
以上就是我想用我的代码的例子$http.get,也$filter我的里面controller.
唯一的问题是当我像这样使用它时,控制台日志会抛出一个错误$filter is not a function.
app.controller('myController', ['$scope', '$http', '$filter', function($scope, $filter, $http) {
Run Code Online (Sandbox Code Playgroud)
当我把它们换成圆形时会抛出一个错误 $http is undefined
javascript angularjs angularjs-scope angularjs-filter angularjs-http
我有webApi给我一个blob文件,我必须显示.我怎么知道我得到的斑点是什么类型的?它可以是任何东西,pdf,doc,jpeg等.
$http({ method: 'GET', url: (itemsUrl), responseType: 'arraybuffer' }).then(function mySucces(res) {
var byteArray = res.data;
byteArray = new Uint8Array(byteArray);
var file = new Blob([byteArray], { type: '??????' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
});
Run Code Online (Sandbox Code Playgroud)
或者,如何在不知道文件类型的情况下在新窗口中打开blob?
如何使用AngularJS/karma/jasmine测试测试我的API后端?
我试图创建显示我的错误的最小测试用例:
from bottle import response, route, run
@route('/echo/<echo>')
def echo_echo(echo):
response.headers['Access-Control-Allow-Origin'] = '*'
return {'echo': echo} # Served as JSON
if __name__ == '__main__':
run()
Run Code Online (Sandbox Code Playgroud)
// Should this be in `test/e2e/apiSpec.js`?
describe('echo', function () {
var scope, http;
beforeEach(inject(function ($rootScope, $http) {
$http.defaults.useXDomain = true; // CORS
scope = $rootScope.$new();
http = $http;
}));
it("should echo from server", function () {
scope.$apply(function () {
var ret;
http.get("http://localhost:8080/echo/foo")
.success(function (data, status, headers, config) {
ret = data; …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个服务来获取json并将其传递给我homeCtrl我可以获取数据但是当它传递给我的homeCtrl它总是返回undefined.我卡住了.
我的服务:
var myService = angular.module("xo").factory("myService", ['$http', function($http){
return{
getResponders: (function(response){
$http.get('myUrl').then(function(response){
console.log("coming from servicejs", response.data);
});
})()
};
return myService;
}
]);
Run Code Online (Sandbox Code Playgroud)
我的家庭控制器:
var homeCtrl = angular.module("xo").controller("homeCtrl", ["$rootScope", "$scope", "$http", "myService",
function ($rootScope, $scope, $http, myService) {
$scope.goData = function(){
$scope.gotData = myService.getResponders;
};
console.log("my service is running", $scope.goData, myService);
}]);
Run Code Online (Sandbox Code Playgroud) angularjs angularjs-service angularjs-factory angularjs-http angular-promise
angularjs ×10
angularjs-http ×10
angular-mock ×2
httpbackend ×2
javascript ×2
ajax ×1
angular-http ×1
jasmine ×1
jquery ×1
karma-runner ×1