IMO, une meilleure option serait d'utiliser l'option angular-in-memory-web-api .
note : ce projet a été tiré dans angulaire/angulaire de son ancien emplacement .
Il simule le backend que Http
Ainsi, au lieu d'effectuer un appel XHR, il se contente de saisir les données que vous lui fournissez. Pour l'obtenir, il suffit d'installer
npm install --save angular-in-memory-web-api
Pour créer la base de données, vous mettez en œuvre la méthode createDb
dans votre InMemoryDbService
import { InMemoryDbService } from 'angular-in-memory-web-api'
export class MockData implements InMemoryDbService {
let cats = [
{ id: 1, name: 'Fluffy' },
{ id: 2, name: 'Snowball' },
{ id: 3, name: 'Heithcliff' },
];
let dogs = [
{ id: 1, name: 'Clifford' },
{ id: 2, name: 'Beethoven' },
{ id: 3, name: 'Scooby' },
];
return { cats, dogs, birds };
}
Ensuite, configurez-le
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
@NgModule({
imports: [
HttpModule,
InMemoryWebApiModule.forRoot(MockData, {
passThruUnknownUrl: true
}),
]
})
Maintenant, lorsque vous utilisez Http
et faire une demande à /api/cats
il récupérera tous les chats de la base de données. Si vous allez dans /api/cats/1
il aura le premier chat. Vous pouvez effectuer toutes les opérations CRUD, GET, POST, PUT, DELETE.
Une chose à noter est qu'il s'attend à un chemin de base. Dans l'exemple /api
est le chemin de base. Vous pouvez également configurer un chemin racine (différent du chemin de base) dans la configuration.
InMemoryWebApiModule.forRoot(MockData, {
rootPath: 'root',
passThruUnknownUrl: true // forwards request not in the db
})
Vous pouvez maintenant utiliser /root/api/cats
.
UPDATE
Pour ce qui est de la question de savoir comment passer de la phase de développement à la phase de production, vous pouvez utiliser une usine pour créer les fournisseurs. Il en va de même si vous utilisez votre service fantaisie au lieu de l'API Web en mémoire.
providers: [
Any,
Dependencies
{
// Just inject `HeroService` everywhere, and depending
// on the environment, the correct on will be chosen
provide: HeroService,
useFactory: (any: Any, dependencies: Dependencies) => {
if (environment.production) {
return new HeroService(any, dependencies);
} else {
return new MockHeroService(any, dependencies);
}
},
deps: [ Any, Dependencies ]
]
En ce qui concerne l'API Web en mémoire, je dois revenir vers vous (je dois tester une théorie). Je viens de commencer à l'utiliser et je ne suis pas encore arrivé au point où je dois passer en production. Pour l'instant, je n'ai que la configuration ci-dessus. Mais je suis sûr qu'il y a un moyen de le faire fonctionner sans avoir à changer quoi que ce soit.
MISE À JOUR 2
Ok, donc pour l'im-memory-web-api, ce que nous pouvons faire au lieu d'importer le module, c'est de fournir simplement le fichier XHRBackend
que le module fournit. Le site XHRBackend
est le service qui Http
utilise pour faire des appels XHR. L'api in-memory-wep-api simule ce service. C'est tout ce que fait le module. Ainsi, nous pouvons simplement fournir le service nous-mêmes, en utilisant une fabrique
@NgModule({
imports: [ HttpModule ],
providers: [
{
provide: XHRBackend,
useFactory: (injector: Injector, browser: BrowserXhr,
xsrf: XSRFStrategy, options: ResponseOptions): any => {
if (environment.production) {
return new XHRBackend(browser, options, xsrf);
} else {
return new InMemoryBackendService(injector, new MockData(), {
// This is the configuration options
});
}
},
deps: [ Injector, BrowserXhr, XSRFStrategy, ResponseOptions ]
}
]
})
export class AppHttpModule {
}
Remarquez le BrowserXhr
, XSRFStrategy
y ResponseOptions
dépendances. C'est ainsi que l'original XHRBackend
est créé. Maintenant, au lieu d'importer le HttpModule
dans votre module d'application, il suffit d'importer le AppHttpModule
.
En ce qui concerne le environment
c'est quelque chose que tu dois découvrir. Avec angular-cli, il existe déjà un environnement qui est automatiquement basculé en production lorsque nous construisons en mode production.
Voici l'exemple complet que j'ai utilisé pour tester avec
import { NgModule, Injector } from '@angular/core';
import { HttpModule, XHRBackend, BrowserXhr,
ResponseOptions, XSRFStrategy } from '@angular/http';
import { InMemoryBackendService, InMemoryDbService } from 'angular-in-memory-web-api';
let environment = {
production: true
};
export class MockData implements InMemoryDbService {
createDb() {
let cats = [
{ id: 1, name: 'Fluffy' }
];
return { cats };
}
}
@NgModule({
imports: [ HttpModule ],
providers: [
{
provide: XHRBackend,
useFactory: (injector: Injector, browser: BrowserXhr,
xsrf: XSRFStrategy, options: ResponseOptions): any => {
if (environment.production) {
return new XHRBackend(browser, options, xsrf);
} else {
return new InMemoryBackendService(injector, new MockData(), {});
}
},
deps: [ Injector, BrowserXhr, XSRFStrategy, ResponseOptions ]
}
]
})
export class AppHttpModule {
}
1 votes
Je suggérerais de renommer cette question pour inclure l'expression "données fictives" ou "backend fictif" - c'est vraiment une excellente question et une excellente réponse, elle était difficile à trouver !