2017-06-18 179 views
0

這是我正在做的。從內容存儲服務器讀取文件內容。我所做的只是調用來自客戶端的https GET請求來獲取文件內容。當從客戶端調用HTTP請求時,是否可以將http請求/請求分成多個請求?

https://contentserver.xyz.com/file_id(來自客戶端調用)

的file_id - 表示文件唯一值。

現在我的內容服務器不知道文件元。所以再次撥打電話時metaserver來獲取文件的元內容,如

http://metaserver.xyz.com/file_id(內部S2S通信)

現在是有可能分裂這一請求從客戶

https://contentserver.xyz.com/file_id

調用

成兩個像

https://contentserver.xyz.com/file_id

https://metaserver.xyz.com/file_id

即;當請求https://contentserver.xyz.com/file_id被調用時,其他請求https://metaserver.xyz.com/file_id應該被默認調用?

我不確定這是否可能。但想知道天氣有沒有什麼可能的方法來實現這一目標?

+0

您的意思是從客戶端並行獲取它們並放棄s2s調用? – amiramw

+0

確實是@amiramw! –

回答

1

當您在瀏覽器上發佈來自JavaScript的ajax請求時,它將被異步發送。您將回調傳遞到請求成功返回或拒絕的時間。

因此,如果您一個接一個地發佈其中的兩個,它們都會立即發送,並且每個回調完成後都會觸發。

但是,這是假設您的內容服務器不需要文件元,它只是將其返回給瀏覽器。

另請注意,從瀏覽器調用不同的域可能會產生CORS問題。

1

如果對文件內容的請求取決於文件元信息,則不能並行發送這兩個請求。文件元信息需要首先獲取。

否則,RxJS可用於管理這些異步2個請求,與forkJoin的幫助下當兩個內容要求完成裝配的結果。

下面是一個簡單的例子:

const Rx = require('rxjs/Rx'); 

var meta = Rx.Observable.create(function (observer){ 
    $.get('https://metaserver.xyz.com/file_id', function(data) { 
    observer.next(body); 
    observer.complete(); 
    }); 
}); 

var content = Rx.Observable.create(function (observer){ 
    $.get('https://contentserver.xyz.com/file_id', function(data) { 
    observer.next(body); 
    observer.complete(); 
    }); 
}); 

var source = ['meta', 'content']; 
Rx.Observable.forkJoin([meta, content], function(){ 
    let responseObj = {}; 
    for(let i=0;i<source.length;i++){ 
    responseObj[source[i]] = arguments[i]; 
    } 
    return responseObj; 
}).subscribe(function(val) { 
    // val is the final value, containing meta and content information. 
}); 

請注意:forkJoin手段(doc):

當完成所有觀測發射從每個最後一個值。