拦截$ http请求并返回硬编码数据

时间:2014-07-03 21:21:40

标签: angularjs

我想拦截各种服务所做的所有$http调用,并返回一个在拦截器a.k.a.硬编码数据中声明的对象。

Angular提供的请求拦截器似乎只能更改并返回HTTP配置对象。

如何在不实际调用服务器的情况下操作返回的数据?

感谢。

1 个答案:

答案 0 :(得分:0)

要使用MockE2E中的$ httpBackend提供模拟API响应,要么用于测试目的,要么提供模拟API来开发客户端,如果服务器API不可用,首先需要包含angular-mocks.js as这包含ngMockE2E。

然后你需要添加一个类似的模块:

angular.module('mockBackend', [ 'ngMockE2E'])
    .run(function($httpBackend) {
        phones = [{name: 'phone1'}, {name: 'phone2'}];

        // returns the current list of phones
        $httpBackend.whenGET('/phones').respond(phones);

        // adds a new phone to the phones array
        $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
        var phone = angular.fromJson(data);
        phones.push(phone);
        return [200, phone, {}];
    });
    $httpBackend.whenGET(/^\/templates\//).passThrough();
    //...
}); 

以上内容取自https://docs.angularjs.org/api/ngMockE2E/service/ $ httpBackend的文档 - 您需要在此处设置要返回模拟数据的所有API端点,以及您想要的实际数据,例如。在上面对模板的任何要求'使用.passThrough仍将这些请求转发给服务器,但将API调用的模拟数据返回给' / phones'。

至于如何关闭和打开它将取决于你如何设置角度构建过程。如果你不想在你的生产版本中有任何这个,你可以将上面的内容放在一个单独的mockbackend.js文件中并添加

angular.module('myApp').requires.push('mockBackend');

到文件的底部 - 其中' myApp'将是你的应用程序模块。对于您的生产文件,您可以让您的构建过程(手动或自动)从index.html文件中删除angular-mocks.js和mockbackend.js,并且所有api调用都将恢复为调用服务器。

如果你想在开发过程中使用或不使用模拟后端,你可以将一个常量传递给mockBackend模块并使用它来决定是否返回真实或模拟数据,例如。如果你有一个不变的DEV'这是一个简单的布尔值:

if (DEV === true) {
    $httpBackend.whenGET('/phones').respond(phones);
} else {
    $httpBackend.whenGET(/phones).passThrough();
}