OANDA網站提供的REST API可以讀取賬戶信息("https://api-fxtrade.oanda.com/v1/accounts),以及提供流報價(streaming,比如"https://stream-fxtrade.oanda.com/v1/prices?accountId=12345&instruments=AUD_CAD%2CAUD_CHF" )。
目前在XE7版本,使用Delphi提供的RestClient組件可以實現讀取賬戶信息。但是,對於服務端的流數據,由於其傳輸方式是 chunked transfer encoding,按照賬戶數據讀取方式則會在停在最後Excute無法獲得返回的Json字符串。
代碼如下:
function GetStreamingPrices:TQJson
var
....
begin
Result := TQJson.Create;
// Get
_RESTRequest.Method := rmGET;
//指定資源位置:'/prices'
_RESTRequest.Resource := TRequestSourceURITemplate.Prices;
//生成query串:accountId=12345&instruments=AUD_CAD%2CAUD_CHF
_RESTRequest.AddParameter(TQueryPairKey.AccountID,accountlist[0],pkGETorPOST);
_RESTRequest.AddParameter(TQueryPairKey.Instruments,'EUR_USD',pkGETorPOST);
//URL
._RestClient.BaseURL := 'https://stream-fxtrade.oanda.com/v1';
//執行
_RestRequest.Execute;
//解析為Json
Result.tryParse(_RESTResponse);
end;
so,請教,如何使用Delphi XE7 的RestClient 獲取 chunked transfer encoding 的流數據?請不吝賜教。
多謝一樓 @caozhy 提供的信息,不過沒有沒有解決此問題。我再描述一下:
1、上面的代碼用於正常的request-response過程,是沒有問題的。
2、 問題出在,報價流的獲取上。報價服務器在工作時段實際是持續傳輸,一直沒有結束,采取chunked transfer encoding模式持續地向外傳輸當時的即時價格信息。使用上面代碼,就會處在一直等待狀態下。
因此,需要達到的目標就是:一,不能等到結束標志才去解析收到的字符串。二,即便間歇獲取數據,如果中間的緩沖時間過長,也不能忍受。
用TIdeventstream方法效率更高:
ResponseEventStrem:TIdEventStream;
ResponseEventStrem.OnWrite := IdEventStreamWrite;
//這個自定義的過程替代了stream的write函數。
procedure TRatesStreamWorker.IdEventStreamWrite(const ABuffer: TIdBytes; AOffset: Integer; ACount: Integer; var VResult: Integer);
var
AJson : TQJson;
begin
AJson := TQJson.Create;
AJson.TryParse(BytesToString(ABuffer,Aoffset,ACount,enUTF8)); //buffer是收到的http的content
if AJson.Count >0 then Jsons.Add(AJson);
VResult := ACount; //已經寫入流的字節數,這裡直接返回為count
end;