我已经实施了一个基于“英雄之旅”tutorial的项目。我已经达到了我想要开始使用真正的REST后端的程度,但理想情况下我只想通过操作来执行此操作。
我更新了post
调用以使用我的REST服务的URL,如下所示:
create(hero: Hero): Promise<Hero> {
return this.http
.post("http://127.0.0.1:3001/api/heroes", JSON.stringify(hero), {headers: this.headers})
.toPromise()
.then(res => return res.json().data)
.catch(this.handleError);
}
问题是,这仍然只能点击InMemoryDbService
提供的InMemoryWebApiModule
。事实上,我提供的URL无关紧要 - 只要它以/heroes
结尾,它就有效。我可以输入任何端口号,任何路径和任何IP(只要它是以/heroes
结尾的可解析URL)。
我希望HttpModule
能够正常工作,InMemoryWebApiModule
只会在网址解析为应用程序的网址时被点击。显然事实并非如此,只是在模块中导入InMemoryWebApiModule.forRoot(InMemoryDataService)
会改变Http
的工作方式(据我所知)。
所以我的问题是 - 在转换到真实服务时,是否可以继续使用InMemoryWebApiModule
来托管模拟服务?你如何修改“英雄之旅”教程来完成一次操作呢?
答案 0 :(得分:5)
您可以将选项配置对象传递给InMemoryWebApiModule.forRoot
。其中一个配置是passThruUnknownUrl
。将其设置为true
,如果无法找到模拟数据中的集合,它将使用正常XHRBackend
imports: [
InMemoryWebApiModule.forRoot(MockData, {
passThruUnknownUrl: true
})
]
因此,在开发过程中,随着在后端创建新集合,您可以开始在前端删除它们
createDb() {
let cats = [];
let dogs = [];
return {
cats,
// dogs
}
}
最初,内存中将处理网址/api/cats
和/api/dogs
。但是我们可以说现在在后端创建了dogs
集合。您只需从上面返回的集合中删除dogs
,现在内存中会将这些调用转发到正常XHRBackend
,以便进行XHR调用。