我想拦截各种服务所做的所有$http
调用,并返回一个在拦截器a.k.a.硬编码数据中声明的对象。
Angular提供的请求拦截器似乎只能更改并返回HTTP配置对象。
如何在不实际调用服务器的情况下操作返回的数据?
感谢。
答案 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();
}