Перехватывать http-запрос $ и возвращать жестко закодированные данные

#angularjs

#angularjs

Вопрос:

Я хотел бы перехватывать все $http вызовы, выполняемые различными службами, и возвращать объект, который объявлен внутри перехватчика, также известного как жестко закодированные данные.

Средство перехвата запросов, предоставляемое Angular, похоже, способно изменять и возвращать только объект HTTP config.

Как я могу манипулировать возвращаемыми данными, фактически не вызывая сервер?

Спасибо.

Комментарии:

1. Вы смотрели на docs.angularjs.org/api/ngMockE2E/service /$httpBackend ? Кроме того, линейщик linemanjs.com имеет опцию заглушки API, которая могла бы достичь чего-то подобного

2. Я не пытаюсь это тестировать. Это для другой цели.

3. Можно $httpBackend включать и выключать во время выполнения?

4. вы можете просто удалить модуль, который включает в себя $ httpBackend из вашей сборки во время выполнения, и тогда все http-запросы $ будут обрабатываться нормально

5. Интересно. Итак, я пытаюсь выполнить AJAX-вызовы на сервер — работает. Однако после переключения переключателя я хочу, чтобы все эти вызовы возвращали жестко закодированные данные из центральной позиции, такой как HTTP-перехватчик, без фактического выполнения вызова. Может ли $ httpBackend это сделать? Можете ли вы показать мне, как, потому что я не могу найти, как это будет работать.

Ответ №1:

Чтобы использовать $ httpBackend из MockE2E для предоставления ложных ответов API либо в целях тестирования, либо для предоставления ложного API для разработки клиента, если серверный API недоступен, сначала вам необходимо включить angular-mocks.js поскольку это содержит 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, для которых вы хотите возвращать фиктивные данные, наряду с любыми, для которых вам нужны реальные данные, например. в приведенных выше любых запросах для ‘templates’ используется .passThrough, чтобы по-прежнему пересылать эти запросы на сервер, но возвращает фиктивные данные для вызовов API в ‘/phones’.

Что касается того, как это отключить и включить, это будет зависеть от того, как у вас настроен процесс сборки angular. Если вы не хотите ничего из этого в своей рабочей версии, вы могли бы поместить вышеуказанное в отдельный mockbackend.js файл и добавить

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

в нижнюю часть файла, где «MyApp» будет вашим модулем приложения. Затем в процессе сборки (ручной или автоматизированной) для ваших производственных файлов вы можете удалить angular-mocks.js и mockbackend.js требуется от вашего index.html файл и все ваши вызовы api вернутся к вызову сервера.

Если вы хотите изменить, используется ли макет серверной части или нет во время разработки, вы могли бы передать константу в модуль mockBackend и использовать это, чтобы решить, возвращаются ли реальные или фиктивные данные, например. если у вас есть константа ‘DEV’, которая является простым логическим:

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