标签: angularjs-http

如何模拟一个有角度的$ http调用并返回一个行为类似$ http的promise对象

有没有办法返回一个模仿调用的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"中,我希望successerror链接仍然有效.是否有可能以HttpPromise我在服务中描述的方式伪造一个?


下面是上面的"MyService"修订版(一个片段),其中包含一个successerror在promise对象上.但是,我该如何执行该success方法?

        return { …
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-http angular-mock

19
推荐指数
2
解决办法
2万
查看次数

如何使$ httpBackend对URL查询参数的顺序不敏感?

我使用Angular.js $httpBackend来测试一些包装$http调用的服务(这是在ngMock中,而不是 ngMockE2E).

看来,喜欢的东西expectwhen对的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

16
推荐指数
2
解决办法
5703
查看次数

在Angularjs中发送的jQuery ajax相当于什么?

我熟悉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)

ajax jquery angularjs angularjs-http

15
推荐指数
2
解决办法
2万
查看次数

获取AngularJS错误:"[$ rootScope:inprog] $ digest已在进行中"没有手动$ apply

关于此错误的其他帖子总是包括有人试图在不使用安全申请的情况下申请$,但在我的示例中并非如此.我的功能是成功返回我从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

13
推荐指数
1
解决办法
2万
查看次数

为什么我们更喜欢在角度而不是$ http中使用$ q

我目前正在使用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提供了一些额外的功能?我找不到任何好的答案.

javascript angularjs angularjs-http angular-promise

13
推荐指数
2
解决办法
2259
查看次数

Angular Js - 在标头默认设置标记

我试图为每个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中为帖子分配默认标头并获取请求?

angularjs angularjs-http

12
推荐指数
2
解决办法
3万
查看次数

$ filter不是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

12
推荐指数
1
解决办法
2万
查看次数

AngularJs使用$ http.get获取blob并从响应中提取类型

我有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 angularjs-http

11
推荐指数
1
解决办法
7928
查看次数

在AngularJS/karma/jasmine测试中通过$ http测试后端API?

如何使用AngularJS/karma/jasmine测试测试我的API后端?

我试图创建显示我的错误的最小测试用例:

echo_server.py

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)

测试/单元/ apiSpec.js

// 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)

jasmine angularjs karma-runner httpbackend angularjs-http

8
推荐指数
1
解决办法
1万
查看次数

AngularJS:将数据从服务返回到控制器

我正在尝试创建一个服务来获取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

8
推荐指数
1
解决办法
4万
查看次数