2016-10-04 95 views
4

我們在我們的項目中使用Angular 2。到目前爲止,我們在開發中使用in-memory-web-api在我們的數據服務:Angular 2:多個HTTP服務

app.module.ts

imports: [ 
    HttpModule, 
    InMemoryWebApiModule.forRoot(MockData), 
    ... 
] 

data.service.ts

constructor(private http: Http) { } 

現在是時候獲取一些真實的數據。但是,我們無法一次性替換模擬數據。我如何配置我的數據服務如下:

constructor(private fakeHttp: FakeHttp, /* this one use in-memory-api */ 
      private http: Http /* this one goes to real remote server */) { } 

所以我們可以逐步移動模擬數據作爲項目進展?

回答

7

而不是試圖做這個醜陋的「兩個HTTP」,angular-in-memory-web-api提供了幾個選項。

從0.1.3開始,有配置屬性將所有未找到的集合調用轉發到常規XHR。

InMemoryWebApiModule.forRoot(MockData, { 
    passThruUnknownUrl: true 
}) 

這將做的是將任何無法找到集合的請求轉發到真正的XHR上。因此,一個選擇就是逐漸從內存數據庫中刪除集合。

class MockData implements InMemoryDbService { 
    createDb() { 
    let cats = []; 
    let dogs = []; 
    return { 
     cats, 
     // dogs 
    }; 
    } 
} 

一旦你從數據庫中刪除dogs收集,現在正向所有的狗發送到真正的後端的內存會。

這只是一個集合級別的修復。但是如果你需要更細粒度的控制,你可以使用方法攔截器。

在你的MockData類中,假設你想重寫get方法,只需將它添加到MockData類中,並帶有HttpMethodInterceptorArgs參數。

class MockData implements InMemoryDbService { 
    get(args: HttpMethodInterceptorArgs) { 
    // do what you will here 
    } 
} 

HttpMethodInterceptorArgs的結構如下(只要你有,你可以用它做什麼的想法)

HttpMethodInterceptorArgs: { 
    requestInfo: { 
    req: Request (original request object) 
    base 
    collection 
    collectionName 
    headers 
    id 
    query 
    resourceUrl 
    } 
    passThruBackend: { 
    The Original XHRBackend (in most cases) 
    } 
    config: { 
    this is the configuration object you pass to the module.forRoot 
    } 
    db: { 
    this is the object from creatDb 
    } 
} 

作爲一個例子,這裏是它會是什麼樣子,如果你只是轉發所有獲取請求

get(args: HttpMethodInterceptorArgs) { 
    return args.passthroughBackend.createConnection(args.requstInfo.req).response 
} 
+0

酷!我正在尋找。謝謝!! – okeydoky